> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Workflow Feature Configs

> Reference for all config fields accepted by POST and PATCH /v3/workflows/ when building simple linear workflows with the features array.

Use these `config` fields inside each item of the `features` array for [`POST /v3/workflows/`](/management-api/workflows/create) and [`PATCH /v3/workflows/{settings_uuid}/`](/management-api/workflows/update).

```json theme={null}
{
  "workflow_label": "Standard KYC",
  "features": [
    {
      "feature": "OCR",
      "config": {
        "documents_allowed": {
          "USA": {
            "DL": {
              "enabled": 1,
              "sides": 2
            }
          }
        }
      }
    }
  ]
}
```

The v3 workflow API builds a linear node-based workflow from the ordered `features` array. Send features in the exact execution order.

## 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.

```json theme={null}
{
  "status_rules": [
    {
      "field": "kyc.issuing_state",
      "operator": "in",
      "value": ["VEN", "IRN"],
      "status": "In Review",
      "value_type": "literal"
    },
    {
      "field": "kyc.extra_fields.profession",
      "operator": "fuzzy_match",
      "value": "Soft. Engineer",
      "score": 80,
      "status": "Declined",
      "value_type": "literal"
    },
    {
      "field": "kyc.extra_fields.dl_class_code_b_to",
      "operator": "less_than",
      "value": "2030-01-01",
      "status": "In Review",
      "value_type": "literal"
    },
    {
      "field": "kyc.extra_fields.dl_class_code_b_from",
      "operator": "less_than",
      "value": { "direction": "past", "amount": 3, "unit": "years" },
      "status": "Declined",
      "value_type": "relative_date"
    }
  ]
}
```

| Field        | Type   | Description                                                                                                                                                                                                                                                                             |
| ------------ | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `field`      | string | Field path to check, such as `kyc.issuing_state` or `kyc.document_type`.                                                                                                                                                                                                                |
| `operator`   | string | One of `equals`, `not_equals`, `greater_than`, `greater_than_or_equals`, `less_than`, `less_than_or_equals`, `contains`, `not_contains`, `in`, `not_in`, `is_empty`, `is_not_empty`, `regex`, or `fuzzy_match`.                                                                         |
| `value`      | any    | Comparison value. Omit or send `null` for operators that do not need a value.                                                                                                                                                                                                           |
| `status`     | string | One of `Approved`, `Declined`, `In Review`, or `No Action`.                                                                                                                                                                                                                             |
| `value_type` | string | Optional. `literal` by default. Use `field` to compare against another field, `list` to resolve a Didit list UUID at runtime, or `relative_date` to compare a date field against today plus/minus a duration.                                                                           |
| `score`      | number | Required for `fuzzy_match`. Minimum similarity score from `0` to `100`. The rule matches when the computed similarity is greater than or equal to this value (`similarity >= score`). For example, `Software Engineer` can match `Soft. Engineer` when the similarity is at least `80`. |

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`.

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`.

| Config field                                         | Type      | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| ---------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `documents_allowed`                                  | object    | Optional. Omit it, send `null`, or send `{}` to allow every supported country and document type. Send an ISO3 country code to document type config only when you want to restrict allowed documents. At least one custom document must have `enabled: 1`. Document configs can include `sides: 1` for front-only capture or `sides: 2` for front-and-back capture. Document types include `P`, `ID`, `DL`, `RP`, `HIC`, `TC`, `SSC`, and other country-supported values. |
| `document_blur_fields_by_country`                    | object    | ISO3 country code to blur field names to redact on document images.                                                                                                                                                                                                                                                                                                                                                                                                      |
| `image_capture_methods_allowed`                      | string\[] | Allowed capture methods. Values include `CAMERA_SCAN` and `UPLOAD`.                                                                                                                                                                                                                                                                                                                                                                                                      |
| `duplicated_user_action`                             | action    | Action for a duplicated user.                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `is_age_restrictions_enabled`                        | boolean   | Enables minimum and maximum age checks.                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `age_restrictions_by_country`                        | object    | ISO3 country code to an age config with `minimum_age`, optional `maximum_age`, and optional `states`.                                                                                                                                                                                                                                                                                                                                                                    |
| `minimum_age`                                        | integer   | Global minimum age, `1` to `120`.                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| `minimum_age_action`                                 | action    | Action when the user is below `minimum_age`.                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `maximum_age`                                        | integer   | Global maximum age, `1` to `120`.                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| `maximum_age_action`                                 | action    | Action when the user is above `maximum_age`.                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `expiration_date_not_detected_action`                | action    | Action when the document expiration date is missing.                                                                                                                                                                                                                                                                                                                                                                                                                     |
| `invalid_code_action`                                | action    | Action when a barcode or machine-readable code is invalid.                                                                                                                                                                                                                                                                                                                                                                                                               |
| `invalid_mrz_action`                                 | action    | Action when the MRZ is invalid.                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `inconsistent_data_action`                           | action    | Action when extracted document fields conflict.                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `invalid_validation_action`                          | action    | Action when document validation fails.                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `expected_details_mismatch_action`                   | action    | Action when expected user details do not match the document.                                                                                                                                                                                                                                                                                                                                                                                                             |
| `portrait_replacement_action`                        | action    | Action when portrait replacement is detected.                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `printed_copy_action`                                | action    | Action when the document appears to be a printed copy.                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `screen_capture_action`                              | action    | Action when the document appears to be captured from a screen.                                                                                                                                                                                                                                                                                                                                                                                                           |
| `image_too_blurry_action`                            | action    | Action for blurry document images.                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| `image_too_dark_action`                              | action    | Action for dark document images.                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `image_too_bright_action`                            | action    | Action for overexposed document images.                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `unparsed_address_action`                            | action    | Action when the document address cannot be parsed.                                                                                                                                                                                                                                                                                                                                                                                                                       |
| `document_or_personal_number_format_mismatch_action` | action    | Action when document or personal number format does not match the expected pattern.                                                                                                                                                                                                                                                                                                                                                                                      |
| `is_document_selfie_portrait_match_enabled`          | boolean   | Enables document portrait to selfie comparison.                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `document_selfie_portrait_match_decline_threshold`   | integer   | Decline threshold for document portrait to selfie match.                                                                                                                                                                                                                                                                                                                                                                                                                 |
| `document_selfie_portrait_match_review_threshold`    | integer   | Review threshold for document portrait to selfie match.                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `id_verification_name_match_score_threshold`         | integer   | Name match threshold across multiple ID verifications.                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `id_verification_max_retry_attempts`                 | integer   | Retry limit for ID verification, `2` to `5`.                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `status_rules`                                       | array     | Optional custom status rules.                                                                                                                                                                                                                                                                                                                                                                                                                                            |

Example:

```json theme={null}
{
  "feature": "OCR",
  "config": {
    "documents_allowed": {
      "USA": {
        "DL": {
          "enabled": 1,
          "sides": 2
        }
      }
    },
    "duplicated_user_action": "REVIEW",
    "image_capture_methods_allowed": ["CAMERA_SCAN", "UPLOAD"]
  }
}
```

## NFC / ePassport

Feature value: `NFC`.

| Config field             | Type    | Description                                                         |
| ------------------------ | ------- | ------------------------------------------------------------------- |
| `allow_nfc_skip`         | boolean | Allows users to skip NFC when their document supports chip reading. |
| `skip_nfc_action`        | action  | Action when the user skips NFC.                                     |
| `unverified_chip_action` | action  | Action when chip verification fails.                                |
| `status_rules`           | array   | Optional custom status rules.                                       |

## Liveness

Feature value: `LIVENESS`.

| Config field                                    | Type    | Description                                                                                                                                                                                                                                                                                                                                                                                                    |
| ----------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `face_liveness_method`                          | string  | One of `ACTIVE_3D`, `FLASHING`, or `PASSIVE`.                                                                                                                                                                                                                                                                                                                                                                  |
| `face_liveness_mode`                            | string  | Liveness mode override.                                                                                                                                                                                                                                                                                                                                                                                        |
| `face_liveness_flash_mode`                      | string  | Flash mode for the `ACTIVE_3D` and `FLASHING` methods. `"0"` (not strict, default) verifies that the colors flashed on screen reflect on the user's face; `"1"` (strict) additionally requires the reflections to match the exact flashed color sequence — stronger against replay and video-injection attacks, but with more false rejections.                                                                |
| `face_liveness_score_decline_threshold`         | integer | Decline threshold.                                                                                                                                                                                                                                                                                                                                                                                             |
| `face_liveness_score_review_threshold`          | integer | Review threshold.                                                                                                                                                                                                                                                                                                                                                                                              |
| `face_liveness_possible_duplicated_face_action` | action  | Action when the face may be duplicated.                                                                                                                                                                                                                                                                                                                                                                        |
| `face_liveness_multiple_faces_action`           | action  | Action when multiple faces are detected.                                                                                                                                                                                                                                                                                                                                                                       |
| `race_map_similarity_thresholds`                | object  | Per-demographic similarity thresholds.                                                                                                                                                                                                                                                                                                                                                                         |
| `face_privacy_mode_enabled`                     | boolean | Enables privacy mode for face assets.                                                                                                                                                                                                                                                                                                                                                                          |
| `face_quality_review_threshold`                 | integer | Review threshold for face image quality.                                                                                                                                                                                                                                                                                                                                                                       |
| `face_quality_decline_threshold`                | integer | Decline threshold for face image quality. Must be less than or equal to the review threshold.                                                                                                                                                                                                                                                                                                                  |
| `face_luminance_min_threshold`                  | integer | Minimum luminance threshold. Must be lower than `face_luminance_max_threshold`.                                                                                                                                                                                                                                                                                                                                |
| `face_luminance_min_action`                     | action  | Action when luminance is too low.                                                                                                                                                                                                                                                                                                                                                                              |
| `face_luminance_max_threshold`                  | integer | Maximum luminance threshold.                                                                                                                                                                                                                                                                                                                                                                                   |
| `face_luminance_max_action`                     | action  | Action when luminance is too high.                                                                                                                                                                                                                                                                                                                                                                             |
| `face_liveness_max_attempts`                    | integer | Total liveness submissions per session, `1` to `3`. Default `3` means one initial attempt plus two retries. Setting `1` does not disable retries for capture-quality failures: when every warning on the attempt is environmental (`LOW_FACE_LUMINANCE`, `HIGH_FACE_LUMINANCE`, `LOW_FACE_QUALITY`, `HIGH_FACE_OCCLUSION`, `NO_FACE_DETECTED`) the user always gets a second attempt with actionable feedback. |
| `status_rules`                                  | array   | Optional custom status rules.                                                                                                                                                                                                                                                                                                                                                                                  |

## Face Match

Feature value: `FACE_MATCH`.

| Config field                         | Type    | Description                                                                                                   |
| ------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------- |
| `face_match_score_decline_threshold` | integer | Decline threshold.                                                                                            |
| `face_match_score_review_threshold`  | integer | Review threshold.                                                                                             |
| `face_match_max_attempts`            | integer | Total face-match submissions per session, `1` to `3`. Default `3` means one initial attempt plus two retries. |
| `status_rules`                       | array   | Optional custom status rules.                                                                                 |

## Age Estimation

Feature value: `AGE_ESTIMATION`.

| Config field                                    | Type    | Description                                                                                                                                                                                                                                                                                                                                                                                                    |
| ----------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `enable_id_verification_fallback`               | boolean | Runs ID Verification when age estimation lands in the borderline range.                                                                                                                                                                                                                                                                                                                                        |
| `minimum_age_threshold`                         | integer | Minimum accepted age, `1` to `100`.                                                                                                                                                                                                                                                                                                                                                                            |
| `borderline_minimum_age_threshold`              | integer | Lower bound for the borderline range, `1` to `100`.                                                                                                                                                                                                                                                                                                                                                            |
| `borderline_maximum_age_threshold`              | integer | Upper bound for the borderline range, `1` to `100`.                                                                                                                                                                                                                                                                                                                                                            |
| `face_liveness_method`                          | string  | One of `ACTIVE_3D`, `FLASHING`, or `PASSIVE`.                                                                                                                                                                                                                                                                                                                                                                  |
| `face_liveness_flash_mode`                      | string  | Flash mode for the `ACTIVE_3D` and `FLASHING` methods. `"0"` (not strict, default) verifies that the colors flashed on screen reflect on the user's face; `"1"` (strict) additionally requires the reflections to match the exact flashed color sequence.                                                                                                                                                      |
| `face_liveness_score_decline_threshold`         | number  | Decline threshold for the liveness check used by age estimation.                                                                                                                                                                                                                                                                                                                                               |
| `face_liveness_score_review_threshold`          | number  | Review threshold for the liveness check used by age estimation.                                                                                                                                                                                                                                                                                                                                                |
| `face_liveness_possible_duplicated_face_action` | action  | Action when the face may be duplicated.                                                                                                                                                                                                                                                                                                                                                                        |
| `face_liveness_multiple_faces_action`           | action  | Action when multiple faces are detected.                                                                                                                                                                                                                                                                                                                                                                       |
| `face_privacy_mode_enabled`                     | boolean | Enables privacy mode for face assets.                                                                                                                                                                                                                                                                                                                                                                          |
| `face_quality_review_threshold`                 | integer | Review threshold for face quality.                                                                                                                                                                                                                                                                                                                                                                             |
| `face_quality_decline_threshold`                | integer | Decline threshold for face quality.                                                                                                                                                                                                                                                                                                                                                                            |
| `face_luminance_min_threshold`                  | integer | Minimum luminance threshold.                                                                                                                                                                                                                                                                                                                                                                                   |
| `face_luminance_min_action`                     | action  | Action when luminance is too low.                                                                                                                                                                                                                                                                                                                                                                              |
| `face_luminance_max_threshold`                  | integer | Maximum luminance threshold.                                                                                                                                                                                                                                                                                                                                                                                   |
| `face_luminance_max_action`                     | action  | Action when luminance is too high.                                                                                                                                                                                                                                                                                                                                                                             |
| `face_liveness_max_attempts`                    | integer | Total liveness submissions per session, `1` to `3`. Default `3` means one initial attempt plus two retries. Setting `1` does not disable retries for capture-quality failures: when every warning on the attempt is environmental (`LOW_FACE_LUMINANCE`, `HIGH_FACE_LUMINANCE`, `LOW_FACE_QUALITY`, `HIGH_FACE_OCCLUSION`, `NO_FACE_DETECTED`) the user always gets a second attempt with actionable feedback. |
| `status_rules`                                  | array   | Optional custom status rules.                                                                                                                                                                                                                                                                                                                                                                                  |

## Phone Verification

Feature value: `PHONE_VERIFICATION`.

| Config field                         | Type    | Description                                                                                                                                                                                                                                                                                                           |
| ------------------------------------ | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `code_size`                          | integer | OTP size, `4` to `8`.                                                                                                                                                                                                                                                                                                 |
| `phone_max_retries`                  | integer | Maximum send retries, `1` to `5`.                                                                                                                                                                                                                                                                                     |
| `phone_max_check_attempts`           | integer | Maximum OTP check attempts, `1` to `5`.                                                                                                                                                                                                                                                                               |
| `phone_verification_countries`       | object  | ISO2 country code to channel config. Example: `{ "US": { "sms": { "enabled": true } } }`.                                                                                                                                                                                                                             |
| `disposable_number_action`           | action  | Action for disposable numbers.                                                                                                                                                                                                                                                                                        |
| `voip_number_action`                 | action  | Action for VoIP numbers.                                                                                                                                                                                                                                                                                              |
| `duplicated_phone_number_action`     | action  | Action for duplicated phone numbers.                                                                                                                                                                                                                                                                                  |
| `high_risk_phone_action`             | action  | Action when the delivery provider blocks the OTP send. Only `DECLINE` or `REVIEW`; default `DECLINE`. Applied only when every block on the step carries `risk_factors` of exactly `["device_attribute"]`; any other risk factor, any mix including it, or no risk factors at all declines regardless of this setting. |
| `phone_shared_device_mode`           | boolean | Allows shared-device phone verification mode.                                                                                                                                                                                                                                                                         |
| `phone_enrichment_enabled`           | boolean | Enables phone intelligence enrichment (line-type risk, trust index, carrier, porting / SIM-swap history, fraud-risk score). **Charged \$0.05 per verification** on top of the phone verification price.                                                                                                               |
| `phone_intelligence_score_action`    | action  | Action when the phone fraud-risk score is at or above `phone_intelligence_score_threshold`.                                                                                                                                                                                                                           |
| `phone_intelligence_score_threshold` | integer | Fraud-risk score (`0`–`100`, higher is riskier) that triggers `phone_intelligence_score_action`. Default `80`.                                                                                                                                                                                                        |
| `phone_type_risk_action`             | action  | Action when the number is flagged as a high-risk phone type.                                                                                                                                                                                                                                                          |
| `recent_port_action`                 | action  | Action when the number was recently ported (SIM-swap / porting signal).                                                                                                                                                                                                                                               |
| `low_phone_trust_action`             | action  | Action when the phone trust index is at or below `phone_trust_index_threshold`.                                                                                                                                                                                                                                       |
| `phone_trust_index_threshold`        | integer | Trust index (`0`–`100`, lower is riskier) at or below which `low_phone_trust_action` is applied. Default `30`.                                                                                                                                                                                                        |
| `status_rules`                       | array   | Optional custom status rules.                                                                                                                                                                                                                                                                                         |

Phone Verification is disabled until the organization completes its first top-up.

<Note>
  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.
</Note>

## Email Verification

Feature value: `EMAIL_VERIFICATION`.

| Config field                         | Type    | Description                                                                                                                                                                                    |
| ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `email_code_size`                    | integer | OTP size, `4` to `8`.                                                                                                                                                                          |
| `email_max_retries`                  | integer | Maximum send retries, `1` to `5`.                                                                                                                                                              |
| `email_max_check_attempts`           | integer | Maximum OTP check attempts, `1` to `5`.                                                                                                                                                        |
| `email_alphanumeric_code`            | boolean | Uses alphanumeric email codes.                                                                                                                                                                 |
| `breached_email_action`              | action  | Action for breached emails.                                                                                                                                                                    |
| `disposable_email_action`            | action  | Action for disposable emails.                                                                                                                                                                  |
| `duplicated_email_action`            | action  | Action for duplicated emails.                                                                                                                                                                  |
| `only_corporate_emails_allowed`      | boolean | Rejects non-corporate email addresses.                                                                                                                                                         |
| `email_enrichment_enabled`           | boolean | Enables email intelligence enrichment (deliverability, domain reputation, data-breach exposure, fraud-risk score). **Charged \$0.05 per verification** on top of the email verification price. |
| `email_intelligence_score_action`    | action  | Action when the email fraud-risk score is at or above `email_intelligence_score_threshold`.                                                                                                    |
| `email_intelligence_score_threshold` | integer | Fraud-risk score (`0`–`100`, higher is riskier) that triggers `email_intelligence_score_action`. Default `80`.                                                                                 |
| `recent_email_breach_action`         | action  | Action when the email appears in a recent known data breach.                                                                                                                                   |
| `frequent_email_breach_action`       | action  | Action when the email appears across many known data breaches.                                                                                                                                 |
| `status_rules`                       | array   | Optional custom status rules.                                                                                                                                                                  |

<Note>
  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.
</Note>

## Database Validation

Feature value: `DATABASE_VALIDATION`.

| Config field                                | Type   | Description                                                                                                                                                                                            |
| ------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `database_validation_countries`             | object | ISO3 country code to `{ "services": ["service_id"] }`. Use service IDs from the Database Validation catalog.                                                                                           |
| `database_validation_partial_match_action`  | action | Action when database validation returns a partial match.                                                                                                                                               |
| `database_validation_no_match_action`       | action | Action when database validation returns no match.                                                                                                                                                      |
| `database_validation_not_applicable_action` | action | Action when database validation cannot run because the document does not carry the identifier the configured services require (e.g. a passport without a national ID number). Defaults to `NO_ACTION`. |
| `status_rules`                              | array  | Optional custom status rules.                                                                                                                                                                          |

Example:

```json theme={null}
{
  "feature": "DATABASE_VALIDATION",
  "config": {
    "database_validation_countries": {
      "ESP": {
        "services": ["SERVICE_ID_FROM_CATALOG"]
      }
    },
    "database_validation_no_match_action": "REVIEW"
  }
}
```

## AML

Feature value: `AML`.

For KYC person screening, use these fields:

| Config field                        | Type    | Description                                                                                   |
| ----------------------------------- | ------- | --------------------------------------------------------------------------------------------- |
| `is_aml_ongoing_monitoring_enabled` | boolean | Enables ongoing AML monitoring.                                                               |
| `aml_score_approve_threshold`       | integer | Approve threshold.                                                                            |
| `aml_score_review_threshold`        | integer | Review threshold.                                                                             |
| `aml_match_score_threshold`         | integer | Match score threshold for possible matches.                                                   |
| `aml_name_weight`                   | integer | Name weight. If any AML weight is provided, name, DOB, and country weights must sum to `100`. |
| `aml_dob_weight`                    | integer | Date of birth weight.                                                                         |
| `aml_country_weight`                | integer | Country weight.                                                                               |
| `status_rules`                      | array   | Optional custom status rules.                                                                 |

For KYB company screening, use these fields:

| Config field                            | Type    | Description                                                               |
| --------------------------------------- | ------- | ------------------------------------------------------------------------- |
| `kyb_score_approve_threshold`           | integer | Company AML approve threshold.                                            |
| `kyb_score_review_threshold`            | integer | Company AML review threshold.                                             |
| `kyb_enable_ongoing_monitoring`         | boolean | Enables KYB ongoing AML monitoring.                                       |
| `kyb_company_aml_match_score_threshold` | integer | Company AML match score threshold.                                        |
| `kyb_company_aml_name_weight`           | integer | Company name weight. Company AML weights must sum to `100` when provided. |
| `kyb_company_aml_dob_weight`            | integer | Incorporation date or DOB weight.                                         |
| `kyb_company_aml_country_weight`        | integer | Country weight.                                                           |

## Device & IP Analysis

Feature value: `IP_ANALYSIS`.

| Config field                  | Type    | Description                                                                                                                                                                                                              |
| ----------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `ip_mismatch_action`          | action  | Action when IP geolocation does not match expected data.                                                                                                                                                                 |
| `vpn_detection_action`        | action  | Action when VPN or proxy usage is detected.                                                                                                                                                                              |
| `expected_ip_mismatch_action` | action  | Action when the IP does not match the expected IP.                                                                                                                                                                       |
| `duplicated_ip_action`        | action  | Action when the IP is reused suspiciously.                                                                                                                                                                               |
| `duplicated_device_action`    | action  | Action when the same persistent device fingerprint is reused across sessions from different `vendor_data` values.                                                                                                        |
| `recovered_device_action`     | action  | Action when v2 fingerprint recovery links the session to a previously seen device with high confidence after the persistent device ID changed.                                                                           |
| `is_ip_geofencing_enabled`    | boolean | Enables IP geofencing restrictions. When `false`, `ip_geofencing_by_country` is preserved but not enforced.                                                                                                              |
| `ip_geofencing_by_country`    | object  | Per-country IP location rules keyed by ISO-3 country code: `{"USA": {"allowed": true, "states": {"California": {"allowed": false}}}}`. State/region entries override the country flag; countries not listed are allowed. |
| `ip_geofencing_action`        | action  | Action when the session IP is located in a country or state/region that is not allowed. Defaults to `DECLINE`.                                                                                                           |
| `status_rules`                | array   | Optional custom status rules.                                                                                                                                                                                            |

Example:

```json theme={null}
{
  "feature": "IP_ANALYSIS",
  "config": {
    "vpn_detection_action": "REVIEW",
    "duplicated_device_action": "REVIEW",
    "recovered_device_action": "REVIEW",
    "is_ip_geofencing_enabled": true,
    "ip_geofencing_by_country": {
      "USA": { "allowed": true, "states": { "California": { "allowed": false } } },
      "RUS": { "allowed": false, "states": null }
    },
    "ip_geofencing_action": "DECLINE"
  }
}
```

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`.

| Config field                               | Type              | Description                                                                                        |
| ------------------------------------------ | ----------------- | -------------------------------------------------------------------------------------------------- |
| `poa_documents_allowed`                    | object            | ISO3 country code to POA document type config. At least one valid document type should be enabled. |
| `poa_languages_allowed`                    | object            | ISO 639-1 language code to `0` or `1`. At least one language should be enabled.                    |
| `poa_name_or_address_mismatch_action`      | action            | Action when the name or address does not match expected data.                                      |
| `poa_document_issues_action`               | action            | Action when the document has quality or extraction issues.                                         |
| `poa_max_attempts_exceeded_action`         | restricted action | Action when the user exceeds retry attempts. Use `DECLINE` or `REVIEW`.                            |
| `poa_document_authenticity_action`         | restricted action | Action when authenticity checks fail. Use `DECLINE` or `REVIEW`.                                   |
| `poa_unsupported_document_type_action`     | action            | Action when the document type is unsupported.                                                      |
| `poa_unsupported_language_action`          | action            | Action when the document language is unsupported.                                                  |
| `poa_issuer_not_identified_action`         | action            | Action when the document issuer is not identified.                                                 |
| `poa_issue_date_not_detected_action`       | action            | Action when the issue date is missing.                                                             |
| `poa_unparsable_or_invalid_address_action` | action            | Action when the address is invalid or cannot be parsed.                                            |
| `poa_name_match_score_threshold`           | integer           | Name match threshold.                                                                              |
| `poa_max_retry_attempts`                   | integer           | Retry limit, `2` to `5`.                                                                           |
| `status_rules`                             | array             | Optional custom status rules.                                                                      |

## Questionnaire

Feature value: `QUESTIONNAIRE`.

| Config field                    | Type    | Description                                                                                |
| ------------------------------- | ------- | ------------------------------------------------------------------------------------------ |
| `questionnaire_uuid`            | UUID    | Required. Use the `questionnaire_id` returned by `POST /v3/questionnaires/`.               |
| `review_questionnaire_manually` | boolean | Sends questionnaire responses to manual review.                                            |
| `status_rules`                  | array   | Optional custom status rules. You can target `questionnaire.answers.<question_id>` fields. |

## KYB Registry

Feature value: `KYB_REGISTRY`.

| Config field                 | Type   | Description                                                                                              |
| ---------------------------- | ------ | -------------------------------------------------------------------------------------------------------- |
| `kyb_accepted_countries`     | object | ISO3 country allow-list for business registry lookup.                                                    |
| `kyb_manual_company_action`  | action | Action when the company requires manual handling.                                                        |
| `kyb_registry_fields_config` | object | Per-field visibility and requiredness for the registry form in the hosted flow. See below.               |
| `kyb_vat_invalid_action`     | action | Action when the company's VAT number fails EU VIES validation. Defaults to `REVIEW`.                     |
| `kyb_vat_unverified_action`  | action | Action when the VAT number could not be validated because VIES was unavailable. Defaults to `NO_ACTION`. |
| `status_rules`               | array  | Optional custom status rules.                                                                            |

`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.

```json theme={null}
{
  "kyb_registry_fields_config": {
    "registration_number": { "enabled": true, "required": true },
    "incorporation_date": { "enabled": true, "required": true },
    "vat_number": { "enabled": true, "required": false },
    "control_scheme": { "enabled": false, "required": false }
  }
}
```

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](/business-verification/company-data#configurable-registry-form-fields) for the end-user behavior and [VAT validation](/business-verification/company-data#vat-validation-vies) for how `vat_number` is checked against VIES.

## KYB Documents

Feature value: `KYB_DOCUMENTS`.

| Config field                                | Type              | Description                                                         |
| ------------------------------------------- | ----------------- | ------------------------------------------------------------------- |
| `kyb_required_document_groups`              | object or array   | Required. Required KYB document groups.                             |
| `kyb_document_subtype_config`               | object            | Per-document subtype enablement and age configuration.              |
| `kyb_document_tampering_action`             | restricted action | Action when tampering is detected. Use `DECLINE` or `REVIEW`.       |
| `kyb_document_critical_mismatch_action`     | restricted action | Action for critical document mismatches. Use `DECLINE` or `REVIEW`. |
| `kyb_document_non_critical_mismatch_action` | action            | Action for non-critical document mismatches.                        |
| `kyb_document_age_action`                   | action            | Action when document age rules fail.                                |
| `kyb_document_max_retry_attempts`           | integer           | Retry limit for KYB documents.                                      |
| `kyb_document_max_attempts_exceeded_action` | restricted action | Action when max attempts are exceeded. Use `DECLINE` or `REVIEW`.   |
| `status_rules`                              | array             | Optional custom status rules.                                       |

## KYB Key People

Feature value: `KYB_KEY_PEOPLE`.

| Config field                              | Type            | Description                                                                                                                                                               |
| ----------------------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `kyb_ubo_ownership_threshold`             | integer         | UBO ownership threshold, `0` to `100`.                                                                                                                                    |
| `kyb_shareholder_ownership_threshold`     | integer         | Shareholder ownership threshold, `0` to `100`. It cannot be higher than `kyb_ubo_ownership_threshold`.                                                                    |
| `kyb_key_people_ownership_required`       | boolean         | Requires an ownership percentage on every submitted key person. Enforced at submission and surfaced to the hosted UI, which marks the field as required. Default `false`. |
| `kyb_require_ubo_kyc`                     | boolean         | Requires UBOs to complete a person verification workflow.                                                                                                                 |
| `kyb_ubo_verification_workflow`           | UUID            | Required when `kyb_require_ubo_kyc` is `true`. Must reference a non-KYB workflow in the same application.                                                                 |
| `kyb_require_officer_kyc`                 | boolean         | Requires officers to complete person verification.                                                                                                                        |
| `kyb_shareholder_verification_workflow`   | UUID            | Person verification workflow for shareholders.                                                                                                                            |
| `kyb_officer_verification_workflow`       | UUID            | Person verification workflow for officers.                                                                                                                                |
| `kyb_require_corporate_ubo_kyb`           | boolean         | Requires corporate UBOs to complete KYB.                                                                                                                                  |
| `kyb_corporate_ubo_verification_workflow` | UUID            | Required when `kyb_require_corporate_ubo_kyb` is `true`. Must reference a KYB workflow in the same application.                                                           |
| `kyb_reject_if_ubo_rejected`              | boolean         | Rejects the business when a required UBO verification is rejected.                                                                                                        |
| `kyb_wait_for_all_ubos`                   | boolean         | Waits for all required UBO verifications before deciding the KYB session.                                                                                                 |
| `kyb_role_config`                         | object or array | Per-role configuration. Each required KYC role must include a `verification_workflow`.                                                                                    |
| `kyb_reuse_verified_individuals`          | boolean         | Reuses already verified individuals when possible.                                                                                                                        |
| `kyb_notify_parties_by_email`             | boolean         | Sends email notifications to invited key people.                                                                                                                          |
| `status_rules`                            | array           | Optional custom status rules.                                                                                                                                             |

## 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`.

| Config field                                 | Type              | Description                                                                                                                                 |
| -------------------------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `document_ai_documents`                      | array             | Required. The documents to request (at most `3`). Each entry is a document object (see below).                                              |
| `document_ai_unreadable_document_action`     | action            | Action when the document cannot be read or no data can be extracted.                                                                        |
| `document_ai_missing_required_fields_action` | action            | Action when a required field cannot be extracted.                                                                                           |
| `document_ai_document_tampering_action`      | restricted action | Action when the document shows signs of manipulation. Use `DECLINE` or `REVIEW`.                                                            |
| `document_ai_name_mismatch_action`           | action            | Action when the extracted full name does not match the verified identity. Requires a field marked with `is_full_name`.                      |
| `document_ai_unsupported_file_action`        | action            | Action when the uploaded file type is not supported.                                                                                        |
| `document_ai_max_attempts_exceeded_action`   | restricted action | Action when the user exceeds the retry attempts. Use `DECLINE` or `REVIEW`.                                                                 |
| `document_ai_name_match_score_threshold`     | integer           | Minimum score (`0`–`100`) for the extracted full name to match the verified identity. Below it, `document_ai_name_mismatch_action` applies. |
| `document_ai_max_retry_attempts`             | integer           | Retry limit, `2` to `5`.                                                                                                                    |
| `status_rules`                               | array             | Optional custom status rules. You can target `document_ai.<key>` fields.                                                                    |

Each entry in `document_ai_documents` is a document:

| Document field     | Type   | Description                                                                                    |
| ------------------ | ------ | ---------------------------------------------------------------------------------------------- |
| `document_key`     | string | Required. Stable identifier for the document, unique within the step.                          |
| `title`            | string | Required. Title shown to the user.                                                             |
| `description`      | string | Required. Instructions shown to the user about what to upload.                                 |
| `title_i18n`       | object | Optional. Locale code to translated title (e.g. `{ "es": "Comprobante de fondos" }`).          |
| `description_i18n` | object | Optional. Locale code to translated description.                                               |
| `fields`           | array  | Required. The fields to extract (at least one). Field keys must be unique within the document. |

Each entry in a document's `fields` is a field:

| Field          | Type    | Description                                                                                                                                                                                                                                                                                                                                                                                                          |
| -------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `key`          | string  | Required. Stable JSON key for the extracted value, unique within the document. Branch on it as `document_ai.<key>`.                                                                                                                                                                                                                                                                                                  |
| `name`         | string  | Required. Human-readable field label.                                                                                                                                                                                                                                                                                                                                                                                |
| `name_i18n`    | object  | Optional. Locale code to translated field name.                                                                                                                                                                                                                                                                                                                                                                      |
| `instruction`  | string  | Optional. Instruction telling the model exactly what to extract for this field.                                                                                                                                                                                                                                                                                                                                      |
| `type`         | string  | Field type: `text`, `number`, or `date`. Defaults to `text`.                                                                                                                                                                                                                                                                                                                                                         |
| `required`     | boolean | Whether the field must be present. Defaults to `false`. When `true` and the value is missing, `document_ai_missing_required_fields_action` applies.                                                                                                                                                                                                                                                                  |
| `is_full_name` | boolean | Optional, defaults to `false`. Marks the field whose value is the document holder's full name, compared against the verified identity (the ID-verification name, or the session's expected details). **At most one field per document** may set it `true`, and it is **not mandatory** — a document may mark none, in which case no name comparison runs for that document. Only `text` fields can be the full name. |

Example:

```json theme={null}
{
  "feature": "DOCUMENT_AI",
  "config": {
    "document_ai_documents": [
      {
        "document_key": "proof_of_funds",
        "title": "Proof of Funds",
        "description": "Upload a recent bank statement.",
        "title_i18n": { "es": "Comprobante de fondos" },
        "fields": [
          {
            "key": "account_holder",
            "name": "Account holder",
            "instruction": "The full name of the account holder as printed on the statement.",
            "type": "text",
            "required": true,
            "is_full_name": true
          },
          {
            "key": "closing_balance",
            "name": "Closing balance",
            "instruction": "The closing balance amount.",
            "type": "number",
            "required": false
          }
        ]
      }
    ],
    "document_ai_missing_required_fields_action": "REVIEW",
    "document_ai_name_mismatch_action": "REVIEW",
    "document_ai_name_match_score_threshold": 80
  }
}
```
