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

# Configurações de recursos de workflow: referência da API

> Campos de configuração aceitos por POST e PATCH /v3/workflows/ da Didit para criar workflows lineares simples com o array features.

Use estes campos de `config` dentro de cada item do array `features` em [`POST /v3/workflows/`](https://docs.didit.me/pt-br/management-api/workflows/create) e [`PATCH /v3/workflows/{settings_uuid}/`](https://docs.didit.me/pt-br/management-api/workflows/update).

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

A API v3 de workflows monta um workflow linear baseado em nós, a partir do array ordenado `features`. Envie os recursos na ordem exata de execução.

> [!NOTE]
>
> Qual mecanismo executa um recurso, o próprio da Didit ou o de um provedor terceirizado, não é um dos campos de configuração abaixo. Isso é gerenciado pelo [Marketplace](https://docs.didit.me/pt-br/console/marketplace.md) do console, que define `provider_key` e `fallback_to_native` no objeto `config` do recurso para você.

## Regras de validação

* `OCR` usa por padrão todos os países e tipos de documento compatíveis quando `config.documents_allowed` é omitido, `null` ou `{}`. Se você enviar um objeto `documents_allowed` personalizado, ele deve conter pelo menos um país válido e um tipo de documento habilitado. Cada configuração de documento pode definir `sides` como `1` para captura apenas da frente ou `2` para captura da frente e do verso.
* `QUESTIONNAIRE` exige `config.questionnaire_uuid`.
* `KYB_DOCUMENTS` exige `config.kyb_required_document_groups`.
* `SIGNATURE` recusa `signature_level: "qes"` com `qes_not_available` até que assinaturas qualificadas estejam disponíveis, e recusa uma nova etapa com `signature_level: "aes"` com `aes_not_available` enquanto `signature_availability.aes` for `false` no fluxo. Os documentos devem existir quando uma sessão é criada: com `signature_documents_source` definido como `workflow`, a etapa precisa de documentos enviados no console, e uma etapa sem nenhum documento pode continuar como rascunho, mas não pode entrar em produção; com `session`, toda chamada de criação deve enviar `sign.documents`.
* `FACE_MATCH` deve vir depois de `OCR` em requisições de fluxo simples.
* `NFC` e `DATABASE_VALIDATION` exigem `OCR` quando aparecem no mesmo fluxo. `AML` precisa de um entre `OCR`, `KYB_REGISTRY` ou `DOCUMENT_AI` antes dele; com apenas `DOCUMENT_AI` à frente, o `full_name` analisado precisa poder ser preenchido, seja a partir de um campo anterior do Document AI já com a chave `full_name`, que é mapeado para você, seja a partir de uma entrada explícita em `config.aml_field_sources` (consulte [AML](#aml)).
* Sub-recursos de KYB, como `KYB_DOCUMENTS` e `KYB_KEY_PEOPLE`, exigem `KYB_REGISTRY` em uma etapa anterior do fluxo.
* Um fluxo é de pessoa (KYC) ou de empresa (KYB), nunca os dois. Um fluxo que usa qualquer recurso de KYB (`KYB_REGISTRY`, `KYB_DOCUMENTS`, `KYB_KEY_PEOPLE`) só pode combiná-lo com `AML`, `DOCUMENT_AI`, `QUESTIONNAIRE`, `PHONE_VERIFICATION`, `EMAIL_VERIFICATION`, `IP_ANALYSIS` e `SIGNATURE`. Ele não pode incluir recursos exclusivos de pessoa, como `OCR`, `LIVENESS`, `FACE_MATCH`, `NFC`, `PROOF_OF_ADDRESS`, `DATABASE_VALIDATION` ou `AGE_ESTIMATION`, e um fluxo de pessoa não pode incluir recursos de KYB. Em um fluxo de empresa, `DOCUMENT_AI` compara qualquer campo marcado com `is_full_name` com a empresa verificada, em vez de uma pessoa. Para verificar as pessoas por trás de uma empresa, crie um fluxo de KYC separado e faça referência a ele a partir do nó `KYB_KEY_PEOPLE` usando `kyb_ubo_verification_workflow`, `kyb_officer_verification_workflow` ou `kyb_shareholder_verification_workflow`.
* Campos de ação usam `DECLINE`, `REVIEW` ou `NO_ACTION`, a menos que o campo abaixo indique uma restrição.
* Campos de pontuação e de limiar são números de `0` a `100`, a menos que um intervalo mais estreito seja indicado.

## Regras de status comuns

Todo recurso aceita um array opcional `status_rules`. Use-o para substituir o status do recurso quando a condição de um campo for atendida.

```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"
    }
  ]
}
```

| Campo | Tipo | Descrição |
| - | - | - |
| `field` | string | Caminho do campo a verificar, como `kyc.issuing_state` ou `kyc.document_type`. |
| `operator` | string | Um entre `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` ou `fuzzy_match`. |
| `value` | any | Valor de comparação. Omita ou envie `null` para operadores que não precisam de valor. |
| `status` | string | Um entre `Approved`, `Declined`, `In Review` ou `No Action`. |
| `value_type` | string | Opcional. `literal` por padrão. Use `field` para comparar com outro campo, `list` para resolver o UUID de uma lista da Didit em tempo de execução ou `relative_date` para comparar um campo de data com a data de hoje mais ou menos um intervalo. |
| `score` | number | Obrigatório para `fuzzy_match`. Pontuação mínima de similaridade, de `0` a `100`. A regra é atendida quando a similaridade calculada é maior ou igual a esse valor (`similarity >= score`). Por exemplo, `Software Engineer` pode corresponder a `Soft. Engineer` quando a similaridade for de pelo menos `80`. |

Leia o exemplo acima assim: `kyc.extra_fields.profession` tem correspondência aproximada com `Soft. Engineer` com pontuação mínima de `80` → definir o status do recurso como `Declined`.

Na Verificação de identidade, use como alvo valores extraídos de `extra_fields`, como `kyc.extra_fields.profession`, datas de validade das categorias da carteira de habilitação, como `kyc.extra_fields.dl_class_code_b_from` e `kyc.extra_fields.dl_class_code_b_to`, ou códigos de restrição/informação por categoria, como `kyc.extra_fields.dl_class_code_b_notes` (coluna 12 das carteiras de habilitação do Reino Unido). Esses valores vêm do objeto `extra_fields` do resultado do OCR; eles não fazem parte de `expected_details`.

> [!NOTE]
>
> `dl_class_code_*_from` e `dl_class_code_*_to` são sempre uma data ISO válida ou ficam ausentes de `extra_fields`: a Didit nunca retorna texto de OCR ilegível em um campo de data. Se a célula da tabela de categorias não puder ser lida, o campo é omitido em vez de ser enviado como string bruta; por isso, use o operador `is_empty` para direcionar datas de categoria ilegíveis em vez de presumir que o campo está sempre presente.

Para campos de data, use `value_type: "relative_date"` com um objeto de valor no formato `{ "direction": "past" | "future", "amount": number, "unit": "days" | "months" | "years" }`. Por exemplo, `operator: "less_than"` com `{ "direction": "past", "amount": 3, "unit": "years" }` corresponde a datas com mais de três anos em relação a hoje.

### Comparar com uma etapa específica

Um fluxo de verificação em grafo pode executar o mesmo recurso mais de uma vez, por exemplo, três etapas de Verificação de identidade.
Com `value_type: "field"`, acrescente `@<node_id>` ao valor para lê-lo de uma etapa específica.
O nó referenciado deve ser uma etapa de recurso que sempre é executada antes da etapa da própria regra, em todos os caminhos que chegam a ela, ou a própria etapa da regra.
Um valor sem o sufixo é lido da etapa da própria regra.

```json theme={null}
{
  "status_rules": [
    {
      "field": "kyc.full_name",
      "operator": "fuzzy_match",
      "value": "kyc.full_name@ocr_1",
      "value_type": "field",
      "score": 80,
      "status": "Declined"
    }
  ]
}
```

Leia esta regra, definida na terceira etapa de Verificação de identidade, assim: o `kyc.full_name` desta etapa tem correspondência aproximada com o nome completo lido pela etapa `ocr_1` com pontuação mínima de `80` → definir o status do recurso como `Declined`.
No console, o seletor de variáveis lista cada etapa elegível pelo número dela na tela e armazena o sufixo para você.

## OCR / Verificação de identidade

Valor do recurso: `OCR`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `documents_allowed` | objeto | Opcional. Omita-o, envie `null` ou envie `{}` para permitir todos os países e tipos de documento compatíveis. Envie um mapeamento de código de país ISO3 para configuração de tipo de documento somente quando quiser restringir os documentos permitidos. Pelo menos um documento personalizado deve ter `enabled: 1`. As configurações de documento podem incluir `sides: 1` para captura apenas da frente ou `sides: 2` para captura da frente e do verso. Os tipos de documento incluem `P`, `ID`, `DL`, `RP`, `HIC`, `TC`, `SSC` e outros valores aceitos por país. |
| `methods` | objeto | Quais dos três [métodos de Verificação de identidade](https://docs.didit.me/pt-br/core-technology/id-verification/verification-methods.md) cada país pode usar: captura de documento, consulta sem documento a uma fonte governamental ou outra fonte oficial, e carteiras de identidade digital. Se você omitir a chave, um país ou um método dentro de um país, esse país usará apenas captura de documento. Cada método e carteira deve estar marcado como disponível para o país no catálogo de capacidades; caso contrário, o salvamento é rejeitado. Consulte [Métodos por país](#métodos-por-país) abaixo. |
| `document_blur_fields_by_country` | objeto | Mapeamento de código de país ISO3 para os nomes dos campos a desfocar nas imagens do documento, para ocultá-los. |
| `image_capture_methods_allowed` | string\[] | Métodos de captura permitidos. Os valores incluem `CAMERA_SCAN` e `UPLOAD`. |
| `duplicated_user_action` | ação | Ação para um usuário duplicado. |
| `is_age_restrictions_enabled` | booleano | Ativa as verificações de idade mínima e máxima. |
| `age_restrictions_by_country` | objeto | Mapeamento de código de país ISO3 para uma configuração de idade com `minimum_age`, `maximum_age` opcional e `states` opcional. |
| `minimum_age` | inteiro | Idade mínima global, de `1` a `120`. |
| `minimum_age_action` | ação | Ação quando o usuário está abaixo de `minimum_age`. |
| `maximum_age` | inteiro | Idade máxima global, de `1` a `120`. |
| `maximum_age_action` | ação | Ação quando o usuário está acima de `maximum_age`. |
| `expiration_date_not_detected_action` | ação | Ação quando a data de validade do documento está ausente. |
| `invalid_code_action` | ação | Ação quando um código de barras ou código legível por máquina é inválido. |
| `invalid_mrz_action` | ação | Ação quando a MRZ é inválida. |
| `inconsistent_data_action` | ação | Ação quando os campos extraídos do documento são conflitantes. |
| `invalid_validation_action` | ação | Ação quando a validação do documento falha. |
| `expected_details_mismatch_action` | ação | Ação quando os dados esperados do usuário não correspondem ao documento. |
| `image_too_blurry_action` | ação | Ação para imagens de documento desfocadas. |
| `image_too_dark_action` | ação | Ação para imagens de documento escuras. |
| `image_too_bright_action` | ação | Ação para imagens de documento superexpostas. |
| `unparsed_address_action` | ação | Ação quando não é possível interpretar o endereço do documento. |
| `address_validation_enabled` | booleano | Valida o endereço que esta etapa lê (impresso no documento de identidade) com dados postais de referência: confirma que o endereço existe e o normaliza, e nunca o vincula a uma pessoa. O resultado é o objeto `address_validation` da etapa na decisão. **Cobrado \$0.10 por endereço validado**; uma validação que não pôde ser executada (`unavailable`) é gratuita. Desativado por padrão. |
| `address_not_verified_action` | ação | Ação quando a Validação de endereço não conseguiu confirmar o endereço até o nível do edifício (`ADDRESS_NOT_VERIFIED`: `partially_verified` ou `not_verified`). Aplica-se apenas enquanto `address_validation_enabled` estiver ativado. O padrão é `NO_ACTION`, que apenas registra o aviso. |
| `document_or_personal_number_format_mismatch_action` | ação | Ação quando o formato do número do documento ou do número pessoal não corresponde ao padrão esperado. |
| `critical_field_occlusion_action` | ação | Ação quando a verificação de oclusão informa que um campo impresso crítico (um número de identidade, um nome, a data de nascimento ou a data de validade) foi fisicamente coberto no documento capturado. Cobrir um número de identidade é um sinal de adulteração, e não de qualidade de captura, por isso o padrão é `REVIEW`; o valor lido de um campo coberto é descartado da extração em qualquer caso. Eleve para `DECLINE` quando um documento com dados ocultados nunca puder chegar a um revisor. |
| `document_without_portrait_action` | ação | Ação quando o tipo de documento reconhecido nunca traz foto de retrato em nenhum dos lados (algumas autorizações de residência, cartões de saúde, certificados de registro e outras famílias de documentos sem retrato conhecidas no catálogo). O padrão é `REVIEW`. Considere `DECLINE` quando a Correspondência facial for a base da verificação de identidade do fluxo. |
| `is_document_selfie_portrait_match_enabled` | booleano | Ativa a comparação entre o retrato do documento e a selfie. |
| `document_selfie_portrait_match_decline_threshold` | inteiro | Limiar de recusa para a correspondência entre o retrato do documento e a selfie. |
| `document_selfie_portrait_match_review_threshold` | inteiro | Limiar de revisão para a correspondência entre o retrato do documento e a selfie. |
| `document_selfie_face_search_enabled` | booleano | Executa a [Busca facial 1:N](https://docs.didit.me/pt-br/core-technology/face-search/overview.md#a-selfie-tirada-durante-a-captura-do-documento) na selfie tirada durante a captura do documento (requer `is_document_selfie_portrait_match_enabled`): compara-a com a lista de bloqueio de rostos e com usuários verificados anteriormente. A selfie é apenas comparada; seu template nunca é armazenado. Ativado por padrão. `false` ignora a busca e deixa as ações de rosto duplicado da selfie do documento sem nada sobre o que agir; `face_search_enabled: false` na etapa de Prova de vida também a ignora, já que essa desativação abrange todas as selfies da sessão. |
| `document_selfie_duplicated_face_action` | ação | Veredito quando a selfie da captura do documento corresponde, ou possivelmente corresponde, ao rosto de um usuário já verificado nesta aplicação. O padrão é `NO_ACTION`. |
| `document_selfie_duplicated_face_name_mismatch_action` | ação | Veredito quando a selfie da captura do documento corresponde a um usuário já verificado com um nome diferente. Só pode agravar `document_selfie_duplicated_face_action`. O padrão é `REVIEW`. |
| `document_selfie_duplicated_face_document_mismatch_action` | ação | Veredito quando a selfie da captura do documento corresponde a um usuário já verificado com uma data de nascimento diferente em seu documento de identidade. A mesma pessoa com um documento diferente ou renovado não é sinalizada. Só pode agravar `document_selfie_duplicated_face_action`. O padrão é `REVIEW`. |
| `id_verification_name_match_score_threshold` | integer | Limiar de correspondência de nome entre várias verificações de identidade. |
| `id_verification_max_retry_attempts` | integer | Limite de novas tentativas na verificação de identidade, de `2` a `5`. |
| `id_document_quality_threshold` | integer | Pontuação mínima de qualidade de captura (`0` a `100`) que a imagem do documento precisa atingir para ser aceita. A verificação de qualidade sempre é executada; só este limiar é configurável. O padrão é `20`, calibrado para que capturas degradadas e no limite (desfoque, movimento, texto ilegível) sejam rejeitadas e documentos legíveis sejam aprovados; aumente-o para exigir capturas mais rigorosas. O console exibe este valor em um controle deslizante perceptual, no qual o padrão `20` aparece como um equilibrado 50%. |
| `cross_org_fraud_document_action` | action | Veredito quando este documento foi sinalizado como fraudulento por outra organização da rede. |
| `document_audio_recording_enabled` | boolean | Grava o microfone durante a captura do documento, para que um revisor possa ouvir a sessão. Desativado por padrão. |
| `document_liveness_portrait_replace_decline_threshold` | integer | Pontuação de substituição de retrato (`0` a `100`, quanto maior, mais provável que seja autêntico) abaixo da qual a sessão é recusada. O padrão é `35`. Consulte [limiares de prova de vida do documento](https://docs.didit.me/pt-br/core-technology/id-verification/warnings-id-verification.md#configurar-os-limiares-de-prova-de-vida-do-documento). |
| `document_liveness_portrait_replace_review_threshold` | integer | Pontuação de substituição de retrato abaixo da qual a sessão vai para Em revisão, quando ainda não foi recusada. Em `100`, quase todas as sessões ficam retidas. O padrão é `70`. Consulte [limiares de prova de vida do documento](https://docs.didit.me/pt-br/core-technology/id-verification/warnings-id-verification.md#configurar-os-limiares-de-prova-de-vida-do-documento). |
| `document_liveness_printed_copy_decline_threshold` | integer | Pontuação de cópia impressa (`0` a `100`, quanto maior, mais provável que seja autêntico) abaixo da qual a sessão é recusada. O padrão é `35`. Consulte [limiares de prova de vida do documento](https://docs.didit.me/pt-br/core-technology/id-verification/warnings-id-verification.md#configurar-os-limiares-de-prova-de-vida-do-documento). |
| `document_liveness_printed_copy_review_threshold` | integer | Pontuação de cópia impressa abaixo da qual a sessão vai para Em revisão, quando ainda não foi recusada. Em `100`, quase todas as sessões ficam retidas. O padrão é `77`. Consulte [limiares de prova de vida do documento](https://docs.didit.me/pt-br/core-technology/id-verification/warnings-id-verification.md#configurar-os-limiares-de-prova-de-vida-do-documento). |
| `document_liveness_screen_replay_decline_threshold` | integer | Pontuação de captura de tela (`0` a `100`, quanto maior, mais provável que seja autêntico) abaixo da qual a sessão é recusada. O padrão é `30`. Consulte [limiares de prova de vida do documento](https://docs.didit.me/pt-br/core-technology/id-verification/warnings-id-verification.md#configurar-os-limiares-de-prova-de-vida-do-documento). |
| `document_liveness_screen_replay_review_threshold` | integer | Pontuação de captura de tela abaixo da qual a sessão vai para Em revisão, quando ainda não foi recusada. Em `100`, quase todas as sessões ficam retidas. O padrão é `70`. Consulte [limiares de prova de vida do documento](https://docs.didit.me/pt-br/core-technology/id-verification/warnings-id-verification.md#configurar-os-limiares-de-prova-de-vida-do-documento). |
| `id_verification_injection_attack_action` | action | Veredito quando o documento, ou a selfie tirada para uma consulta de identidade, foi injetado em vez de capturado pela própria câmera do dispositivo (`INJECTION_ATTACK_DETECTED`): uma câmera virtual por software, um feed de câmera gerado pela página ou por automação de navegador, uma câmera interceptada ou uma ferramenta de instrumentação conectada ao app. Valores: `DECLINE`, `REVIEW`, `NO_ACTION`. O padrão é `DECLINE`. Sinais que uma pessoa real pode produzir nunca o acionam. Na prova de vida e na correspondência facial, o risco segue `frame_injection_action`. |
| `image_quality_too_low_action` | action | Veredito quando a qualidade geral da imagem do documento está abaixo do mínimo exigido. |
| `is_image_capture_review_screen_enabled` | boolean | Mostra ao usuário uma tela de revisão após cada captura de documento, permitindo que ele tire a foto novamente antes do envio. Desativado por padrão. |
| `is_ocr_id_verification_data_review_enabled` | boolean | Permite que o usuário revise e corrija os dados de identidade extraídos antes de a etapa ser concluída. Desativado por padrão. Cada correção é avaliada com base em `ocr_id_verification_data_review_critical_fields`, e uma divergência recebe a ação crítica ou a ação menor, conforme o caso. A revisão continua sendo executada quando o fluxo inclui NFC; uma leitura posterior do chip simplesmente a substitui. |
| `ocr_id_verification_data_review_critical_fields` | string\[] | Quais campos de identidade extraídos contam como críticos quando o usuário edita o resultado do OCR, para que uma divergência receba a ação crítica em vez da menor. Formato: `["first_name" \| "last_name" \| "date_of_birth" \| ...]`. |
| `ocr_id_verification_data_review_critical_mismatch_action` | restricted action | Veredito quando a edição do usuário diverge do OCR em um campo crítico. |
| `ocr_id_verification_data_review_minor_mismatch_action` | action | Veredito quando a edição do usuário diverge do OCR em um campo não crítico. |
| `status_rules` | array | Regras de status personalizadas opcionais. |

> [!NOTE]
>
> A prova de vida do documento é configurada com os seis limiares `document_liveness_*` acima, e não com
> campos de ação por sinal. `portrait_replacement_action`, `printed_copy_action` e
> `screen_capture_action` são configurações no nível da conta e **não** são aceitas na configuração
> de recursos de um fluxo: a API remove chaves de configuração desconhecidas ao salvar, então enviá-las ali não tem
> efeito. Cada sinal tem um limiar de recusa e um limiar de revisão em uma escala de `0`-`100`, na qual
> uma pontuação mais alta significa que é mais provável que o documento seja autêntico.

Exemplo:

```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"]
  }
}
```

### Métodos por país

`methods` é indexado pelo código de país [ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3). Cada país tem até três objetos de método; tudo o que você omitir assume o valor padrão.

```json theme={null}
{
  "feature": "OCR",
  "config": {
    "methods": {
      "ZAF": {
        "document": { "enabled": true },
        "id_lookup": {
          "enabled": true,
          "max_attempts": 2,
          "skip_liveness_and_face_match": true,
          "on_partial_match": "fallback_to_document",
          "on_no_match": "fallback_to_document",
          "on_provider_error": "fallback_to_document"
        },
        "wallet": { "enabled": false, "providers": [], "on_failure": "fallback_to_document" }
      },
      "DNK": {
        "document": { "enabled": true },
        "id_lookup": { "enabled": true, "on_no_match": "decline" }
      }
    }
  }
}
```

Para deixar os documentos fora da primeira tela e oferecê-los apenas quando uma carteira ou uma consulta não der certo, defina `document.fallback_only`. O exemplo usa a Finlândia, onde a Finnish Trust Network vem primeiro e a captura de documento é a alternativa. A Finlândia também precisa ter seus tipos de documento habilitados em `documents_allowed` (por exemplo, passaporte e carteira de identidade) para que a alternativa tenha documentos a oferecer.

```json theme={null}
{
  "FIN": {
    "document": { "enabled": true, "fallback_only": true },
    "wallet": { "enabled": true, "providers": ["ftn"], "on_failure": "fallback_to_document" }
  }
}
```

As duas consultas acima estão `available` no catálogo atual, então essa configuração é salva como está. O bloco de carteira está desativado de propósito: **nenhuma carteira está ativa em produção ainda**, então `wallet.enabled: true` é rejeitado e faz todo o salvamento falhar, incluindo a configuração das consultas. Quando o catálogo marcar uma carteira como `available` em um país, adicione-a a esse país:

```json theme={null}
{
  "DNK": {
    "document": { "enabled": true },
    "wallet": { "enabled": true, "providers": ["mitid"], "on_failure": "fallback_to_document" }
  }
}
```

| Chave | Tipo | Padrão | Descrição |
| - | - | - | - |
| `<ISO3>.document.enabled` | boolean | `true` | Se um documento fotografado é aceito neste país. Quais documentos são aceitos continua sendo definido em `documents_allowed`. |
| `<ISO3>.document.fallback_only` | boolean | `false` | Mantém a captura de documento ativada, mas não a oferece na primeira tela. Os usuários começam pela carteira ou pela consulta de identidade do país, e somente os usuários cujo login na carteira falha, é cancelado ou expira, ou cuja consulta não tem correspondência (conforme os seletores `on_failure`, `on_partial_match`, `on_no_match` e `on_provider_error` definidos como `fallback_to_document`) são levados à captura de documento. Com uma única carteira, o usuário vai direto para essa carteira. Sem essa opção, a carteira ou a consulta aparece lado a lado com a captura de documento. Recusado com HTTP 400, a menos que `document.enabled` seja `true` e pelo menos uma carteira ou consulta de identidade do país recorra à captura de documento. |
| `<ISO3>.id_lookup.enabled` | boolean | `false` | Oferece a consulta sem documento ao governo desse país ou a outra fonte oficial. Recusado quando o catálogo não marca a fonte do país como `available`. |
| `<ISO3>.id_lookup.max_attempts` | integer | `1` | De `1` a `5`. Quantas consultas **respondidas** o usuário tem antes de o seletor de fallback ser acionado. Um número que não passa na verificação de formato no cliente nunca chega ao registro, então não conta nem é cobrado. |
| `<ISO3>.id_lookup.skip_liveness_and_face_match` | boolean | `true` | Após uma correspondência com um registro que retorna um retrato, pula as etapas de Prova de vida e Correspondência facial do próprio fluxo, pois a consulta já executou a prova de vida passiva na selfie e a comparou com esse retrato. Normalizado para `false` ao salvar quando a fonte não retorna retrato, caso em que o seletor não teria efeito. |
| `<ISO3>.id_lookup.on_partial_match` | `fallback_to_document` \| `decline` | `fallback_to_document` | O que acontece quando o registro respondeu, mas alguns campos não corresponderam. |
| `<ISO3>.id_lookup.on_no_match` | `fallback_to_document` \| `decline` | `fallback_to_document` | O que acontece quando o registro respondeu e não contém nenhum registro correspondente. |
| `<ISO3>.id_lookup.on_provider_error` | `fallback_to_document` \| `decline` | `fallback_to_document` | O que acontece quando não foi possível acessar o registro. Nunca é cobrado. |
| `<ISO3>.id_lookup.response_fields` | string\[] \| null | `null` | Subconjunto opcional das chaves de campo da resposta da fonte. Chaves desconhecidas são recusadas e os campos obrigatórios da fonte são sempre adicionados de volta, então o valor salvo é sempre uma seleção válida. A implementação atual em staging aplica essa seleção à saída da comparação, ao gênero opcional e aos retratos do registro retidos. Os campos de identidade obrigatórios permanecem. Veja a nota sobre implantação e retenção abaixo. |
| `<ISO3>.wallet.enabled` | boolean | `false` | Oferece login com carteira de identidade digital nesse país. |
| `<ISO3>.wallet.providers` | string\[] | `[]` | IDs de carteira do catálogo que esse país aceita: uma lista de permissões, nunca uma classificação. A ordem enviada é normalizada para a ordem do catálogo. Pelo menos uma carteira é obrigatória quando `enabled` é `true`. Uma carteira que não é oferecida no país, ou que ainda está marcada como em breve, é recusada. |
| `<ISO3>.wallet.on_failure` | `fallback_to_document` \| `decline` | `fallback_to_document` | O que acontece quando o login é cancelado, expira ou falha. |

Validações que a API aplica ao salvar:

* Um código de país desconhecido, uma chave desconhecida dentro de um país ou uma chave desconhecida dentro de um método é recusado: nada é descartado silenciosamente.
* Um país sem nenhum método ativado é recusado, pois ninguém nele conseguiria se verificar.
* Uma carteira ou consulta só pode recorrer à captura de documento quando a captura de documento está ativada para aquele país. `fallback_to_document` em um país onde `document.enabled` é `false` resulta em recusa em tempo de execução, porque não há para onde recorrer.
* `document.fallback_only: true` é recusado com HTTP 400, a menos que `document.enabled` seja `true` e pelo menos uma carteira ou consulta de identidade nesse país recorra à captura de documento.

> [!WARNING]
>
> A implementação atual em staging aplica `id_lookup.response_fields` à saída da comparação, ao gênero opcional e aos retratos do registro retidos. Os campos de identidade obrigatórios continuam fazendo parte do registro da verificação. Isso não garante que todo payload intermediário do provedor seja excluído do processamento. A implantação em produção ainda não foi verificada para essa mudança; confirme o comportamento no seu ambiente de destino antes de depender da seleção de campos para requisitos de retenção.

Leia o catálogo de recursos antes de escrever `methods`, pela aba **Países** do console ou com a ferramenta MCP [`didit_workflow_get_id_verification_methods_catalog`](https://docs.didit.me/pt-br/integration/mcp/tools). Comportamento, cobertura e faturamento estão em [Métodos de Verificação de identidade](https://docs.didit.me/pt-br/core-technology/id-verification/verification-methods.md).

## NFC / ePassport

Valor do recurso: `NFC`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `allow_nfc_skip` | boolean | Permite que os usuários pulem a etapa de NFC quando o documento deles suporta a leitura do chip. |
| `skip_nfc_action` | action | Ação quando o usuário pula a etapa de NFC. |
| `unverified_chip_action` | action | Ação quando a verificação do chip falha. |
| `trust_anchor_missing_action` | action | Veredito quando os hashes dos grupos de dados do chip estão íntegros, mas a cadeia de certificados não pode ser verificada porque a âncora de confiança CSCA do país emissor não está carregada. |
| `jpki_request_attributes` | boolean | My Number Card do Japão ([JPKI](https://docs.didit.me/pt-br/core-technology/nfc-verification/overview.md#my-number-card-do-japão-jpki), apenas SDKs nativos): também lê o certificado de assinatura, que exige o PIN de assinatura do cartão e contém o nome, a data de nascimento, o sexo e o endereço do titular, comparados com os dados da verificação de identidade. Padrão `true`. Com `false`, lê apenas o certificado de autenticação do usuário (PIN de 4 dígitos), que comprova o cartão e o PIN, mas não contém dados do titular. |
| `jpki_certificate_invalid_action` | action | Veredito quando um certificado do My Number Card não se encadeia à autoridade certificadora JPKI, está fora do período de validade ou não é um certificado de cartão do tipo solicitado (`JPKI_CERTIFICATE_INVALID`). Padrão `DECLINE`. |
| `jpki_signature_invalid_action` | action | Veredito quando a assinatura do My Number Card sobre o desafio de uso único não é validada, de modo que a posse do cartão e o conhecimento do PIN não são comprovados (`JPKI_SIGNATURE_INVALID`). Padrão `DECLINE`. |
| `jpki_certificate_revoked_action` | action | Veredito quando a verificação de revogação informa que um certificado do My Number Card foi revogado (`JPKI_CERTIFICATE_REVOKED`). Padrão `DECLINE`. |
| `jpki_revocation_unchecked_action` | action | Veredito quando o My Number Card foi verificado, mas nenhuma resposta de revogação estava disponível, de modo que não é possível descartar um cartão revogado (`JPKI_REVOCATION_UNCHECKED`). Padrão `REVIEW`. |
| `jpki_inconsistent_data_action` | action | Veredito quando o nome, a data de nascimento, o sexo ou o endereço no certificado de assinatura do My Number Card diferem dos dados da verificação de identidade do mesmo cartão (`JPKI_AND_OCR_DATA_NOT_SAME`). Padrão `REVIEW`. |
| `status_rules` | array | Regras de status personalizadas opcionais. |

## Prova de vida

Valor do recurso: `LIVENESS`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `face_liveness_method` | string | Um de `ACTIVE_3D`, `FLASHING` ou `PASSIVE`. |
| `face_liveness_mode` | string | Substituição do modo de prova de vida. |
| `face_liveness_flash_mode` | string | Modo de flash para os métodos `ACTIVE_3D` e `FLASHING`. `"0"` (não estrito, padrão) verifica se as cores exibidas na tela se refletem no rosto do usuário; `"1"` (estrito) também exige que os reflexos correspondam à sequência exata de cores exibidas. É mais robusto contra ataques de replay e de injeção de vídeo, mas gera mais rejeições indevidas. |
| `face_liveness_score_decline_threshold` | integer | Limiar de recusa. |
| `face_liveness_score_review_threshold` | integer | Limiar de revisão. |
| `face_liveness_possible_duplicated_face_action` | action | Ação quando o rosto pode estar duplicado. |
| `face_liveness_multiple_faces_action` | action | Ação quando vários rostos são detectados. |
| `face_liveness_video_anomaly_action` | action | Ação quando a gravação armazenada contém uma sequência de movimento repetida. Padrão `NO_ACTION`; `REVIEW` e `DECLINE` podem escalar de forma assíncrona uma verificação já decidida. Quadros estáticos esparsos ou repetidos, por si só, não acionam essa ação. |
| `face_liveness_attack_face_match_action` | action | Ação quando o rosto da prova de vida corresponde a um rosto de uma sessão anterior desta aplicação, de outro usuário, cuja captura foi considerada um ataque à prova de vida com alta confiança (aviso `FACE_MATCHES_LIVENESS_ATTACK`). Aceita `NO_ACTION` ou `REVIEW`; `DECLINE` é aceito, mas aplicado como `REVIEW`, porque um usuário legítimo pode ser rejeitado uma vez por engano e depois ser aprovado. O padrão é `NO_ACTION`. |
| `race_map_similarity_thresholds` | object | Limiares de similaridade por grupo demográfico. |
| `face_privacy_mode_enabled` | boolean | Ativa o modo de privacidade para os arquivos faciais. |
| `face_quality_review_threshold` | integer | Limiar de revisão para a qualidade da imagem do rosto. |
| `face_quality_decline_threshold` | integer | Limiar de recusa para a qualidade da imagem do rosto. Deve ser menor ou igual ao limiar de revisão. |
| `face_luminance_min_threshold` | integer | Limiar mínimo de luminância. Deve ser menor que `face_luminance_max_threshold`. |
| `face_luminance_min_action` | action | Ação quando a luminância está baixa demais. |
| `face_luminance_max_threshold` | integer | Limiar máximo de luminância. |
| `face_luminance_max_action` | action | Ação quando a luminância está alta demais. |
| `face_liveness_max_attempts` | integer | Total de envios de prova de vida por sessão, de `1` a `3`. O padrão `3` significa uma tentativa inicial mais duas novas tentativas. Definir `1` não desativa as novas tentativas por falhas de qualidade de captura: quando todos os avisos da tentativa são ambientais (`LOW_FACE_LUMINANCE`, `HIGH_FACE_LUMINANCE`, `LOW_FACE_QUALITY`, `HIGH_FACE_OCCLUSION`, `NO_FACE_DETECTED`), o usuário sempre recebe uma segunda tentativa com orientações práticas. |
| `cross_org_fraud_face_action` | action | **Obsoleto e não é mais aplicado.** Tratava um rosto como se carregasse um veredito de fraude, o que uma identidade biométrica estável não pode carregar. Continua aceito para que os fluxos existentes continuem sendo validados. Use `cross_org_identity_claim_pattern_action`. |
| `cross_org_identity_claim_pattern_action` | action | Veredito quando outras organizações da rede registraram eventos de declaração de identidade para esta mesma pessoa nos quais a identidade declarada não correspondia. Apenas Revisão ou Nenhuma ação: um Recusar definido aqui é rebaixado para Revisão. Consulte [Declarações de identidade entre organizações](https://docs.didit.me/pt-br/core-technology/liveness/cross-organization-identity-claims.md). |
| `external_capture_device_action` | action | Veredito quando um dispositivo de captura externo é detectado. |
| `face_audio_recording_enabled` | boolean | Grava o microfone durante a captura da selfie, para que um revisor possa ouvir a sessão. Desativado por padrão. |
| `face_search_enabled` | boolean | Executa a [Busca facial 1:N](https://docs.didit.me/pt-br/core-technology/face-search/overview.md#desativando-a-busca-facial-automática) automática na selfie: compara-a com usuários verificados anteriormente, com a lista de bloqueio e a lista de permissões de rostos, e armazena seu template biométrico para correspondências futuras. Ativado por padrão. `false` ignora a busca, não mantém nenhum template facial para esta etapa e deixa as ações de rosto duplicado sem nada a que se aplicar. |
| `face_liveness_uncertain_retry_enabled` | boolean | Apenas para a prova de vida ativa do SDK nativo. Quando ativado, uma captura cuja pontuação de prova de vida fica estritamente entre `face_liveness_score_decline_threshold` e `face_liveness_score_review_threshold` nunca é decidida, qualquer que seja o veredito que o mecanismo tenha atribuído a ela: a pessoa é informada de que o resultado não ficou claro e é solicitada a fazer outra captura, todas as vezes, fora do limite de `face_liveness_max_attempts` (que continua valendo para as capturas que o mecanismo não conseguiu pontuar). Desativado por padrão; o fluxo web o ignora. |
| `face_liveness_duplicated_face_name_mismatch_action` | action | Veredito quando um rosto duplicado é encontrado com um nome diferente. |
| `face_liveness_duplicated_face_document_mismatch_action` | action | Veredito quando um rosto duplicado é encontrado e o documento de identidade do usuário correspondente mostra uma data de nascimento diferente. A mesma pessoa com um documento diferente ou renovado não é sinalizada. O padrão é `REVIEW`. |
| `frame_injection_action` | action | Veredito quando são detectados quadros de vídeo injetados. |
| `screen_capture_action` | action | Veredito quando a selfie é uma foto de uma tela. |
| `virtual_camera_action` | action | Veredito quando é detectado o feed de uma câmera virtual. |
| `status_rules` | array | Regras de status personalizadas opcionais. |

## Correspondência facial

Valor do recurso: `FACE_MATCH`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `face_match_score_decline_threshold` | inteiro | Limiar de recusa. |
| `face_match_score_review_threshold` | inteiro | Limiar de revisão. |
| `face_match_max_attempts` | inteiro | Total de envios de correspondência facial por sessão, de `1` a `3`. O padrão `3` equivale a uma tentativa inicial mais duas novas tentativas. |
| `face_match_not_computed_action` | ação restrita | Veredito quando não foi possível gerar uma pontuação de correspondência facial (retrato ou selfie ausente). |
| `face_match_eyes_covered_action` | ação | Veredito quando a região dos olhos está coberta na selfie. O padrão é `NO_ACTION`, que registra a evidência sem alterar o resultado da Correspondência facial. Esse sinal ainda está sendo calibrado, por isso permanece apenas em modo sombra (shadow) até que a região seja indicada como calibrada: defina `REVIEW` ou `DECLINE` agora e a configuração passa a valer a partir desse momento. |
| `face_match_mouth_covered_action` | ação | Veredito quando a região da boca está coberta na selfie. Mesmo padrão `NO_ACTION` e mesma ressalva de calibração de `face_match_eyes_covered_action`. |
| `face_match_face_covered_action` | ação | Veredito quando o rosto como um todo está coberto na selfie. Mesmo padrão `NO_ACTION` e mesma ressalva de calibração de `face_match_eyes_covered_action`. |
| `status_rules` | array | Regras de status personalizadas opcionais. |

## Estimativa de idade

Valor do recurso: `AGE_ESTIMATION`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `enable_id_verification_fallback` | booleano | Executa a Verificação de identidade quando a estimativa de idade cai na faixa limítrofe. |
| `minimum_age_threshold` | inteiro | Idade mínima aceita, de `1` a `100`. |
| `borderline_minimum_age_threshold` | inteiro | Limite inferior da faixa limítrofe, de `1` a `100`. |
| `borderline_maximum_age_threshold` | inteiro | Limite superior da faixa limítrofe, de `1` a `100`. |
| `face_liveness_method` | string | Um destes: `ACTIVE_3D`, `FLASHING` ou `PASSIVE`. |
| `face_liveness_flash_mode` | string | Modo de flash para os métodos `ACTIVE_3D` e `FLASHING`. `"0"` (não estrito, padrão) verifica se as cores exibidas na tela se refletem no rosto do usuário; `"1"` (estrito) exige, além disso, que os reflexos correspondam à sequência exata de cores exibidas. |
| `face_liveness_score_decline_threshold` | número | Limiar de recusa da verificação de prova de vida usada pela estimativa de idade. |
| `face_liveness_score_review_threshold` | número | Limiar de revisão da verificação de prova de vida usada pela estimativa de idade. |
| `face_liveness_possible_duplicated_face_action` | ação | Ação quando o rosto pode estar duplicado. |
| `face_liveness_multiple_faces_action` | ação | Ação quando vários rostos são detectados. |
| `face_liveness_video_anomaly_action` | ação | Ação quando a gravação armazenada contém uma sequência em movimento repetida. Padrão `NO_ACTION`; `REVIEW` e `DECLINE` podem escalar de forma assíncrona uma verificação já decidida. Quadros estáticos esparsos ou repetidos, por si sós, não a acionam. |
| `face_liveness_attack_face_match_action` | ação | Ação quando o rosto da prova de vida corresponde a um rosto de uma sessão anterior desta aplicação, de outro usuário cuja captura foi considerada um ataque à prova de vida com alta confiança (aviso `FACE_MATCHES_LIVENESS_ATTACK`). Aceita `NO_ACTION` ou `REVIEW`; `DECLINE` é aceito, mas aplicado como `REVIEW`, porque um usuário legítimo pode ser rejeitado uma vez por engano e depois ser aprovado. O padrão é `NO_ACTION`. |
| `face_privacy_mode_enabled` | booleano | Ativa o modo de privacidade para os arquivos faciais. |
| `face_quality_review_threshold` | inteiro | Limiar de revisão para a qualidade do rosto. |
| `face_quality_decline_threshold` | inteiro | Limiar de recusa para a qualidade do rosto. |
| `face_luminance_min_threshold` | inteiro | Limiar mínimo de luminância. |
| `face_luminance_min_action` | ação | Ação quando a luminância é baixa demais. |
| `face_luminance_max_threshold` | inteiro | Limiar máximo de luminância. |
| `face_luminance_max_action` | ação | Ação quando a luminância é alta demais. |
| `face_liveness_max_attempts` | inteiro | Total de envios de prova de vida por sessão, de `1` a `3`. O padrão `3` significa uma tentativa inicial mais duas novas tentativas. Definir `1` não desativa as novas tentativas em falhas de qualidade de captura: quando todos os avisos da tentativa são ambientais (`LOW_FACE_LUMINANCE`, `HIGH_FACE_LUMINANCE`, `LOW_FACE_QUALITY`, `HIGH_FACE_OCCLUSION`, `NO_FACE_DETECTED`), o usuário sempre recebe uma segunda tentativa com orientações práticas. |
| `external_capture_device_action` | ação | Veredito quando um dispositivo de captura externo é detectado. |
| `face_audio_recording_enabled` | booleano | Grava o microfone durante a captura da selfie, para que um revisor possa ouvir a sessão. Desativado por padrão. |
| `face_search_enabled` | booleano | Executa a [Busca facial 1:N](https://docs.didit.me/pt-br/core-technology/face-search/overview.md#desativando-a-busca-facial-automática) automática na selfie: compara-a com usuários verificados anteriormente, com a lista de bloqueio e a lista de permissão de rostos, e armazena seu template biométrico para correspondências futuras. Ativado por padrão. `false` ignora a busca, não mantém nenhum template facial para esta etapa e deixa as ações de rosto duplicado sem nenhum rosto sobre o qual atuar. |
| `face_liveness_uncertain_retry_enabled` | booleano | Somente para a prova de vida ativa do SDK nativo. Quando ativado, uma captura cuja pontuação de prova de vida fica estritamente entre `face_liveness_score_decline_threshold` e `face_liveness_score_review_threshold` nunca é decidida, qualquer que seja o veredito que o mecanismo tenha atribuído a ela: a pessoa é informada de que o resultado não ficou claro e é solicitada a capturar novamente, todas as vezes, fora do limite de `face_liveness_max_attempts` (que continua valendo para as capturas que o mecanismo não conseguiu pontuar). Desativado por padrão; o fluxo web o ignora. |
| `face_liveness_duplicated_face_name_mismatch_action` | ação | Veredito quando um rosto duplicado é encontrado com um nome diferente. |
| `face_liveness_duplicated_face_document_mismatch_action` | ação | Veredito quando um rosto duplicado é encontrado e o documento de identidade do usuário correspondente mostra uma data de nascimento diferente. A mesma pessoa com um documento diferente ou renovado não é sinalizada. O padrão é `REVIEW`. |
| `frame_injection_action` | ação | Veredito quando quadros de vídeo injetados são detectados. |
| `screen_capture_action` | ação | Veredito quando a selfie é uma foto de uma tela. |
| `virtual_camera_action` | ação | Veredito quando o sinal de uma câmera virtual é detectado. |
| `status_rules` | array | Regras de status personalizadas opcionais. |

## Verificação de telefone

Valor do recurso: `PHONE_VERIFICATION`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `code_size` | inteiro | Tamanho do OTP, de `4` a `8`. |
| `phone_max_retries` | inteiro | Número máximo de reenvios, de `1` a `5`. |
| `phone_max_check_attempts` | inteiro | Número máximo de tentativas de validação do OTP, de `1` a `5`. |
| `phone_verification_countries` | objeto | Mapeia o código de país ISO2 para a configuração de canais. Exemplo: `{ "US": { "sms": { "enabled": true } } }`. |
| `disposable_number_action` | ação | Ação para números descartáveis. |
| `voip_number_action` | ação | Ação para números VoIP. |
| `duplicated_phone_number_action` | ação | Ação para números de telefone duplicados. |
| `high_risk_phone_action` | ação | Ação quando o provedor de entrega bloqueia o envio do OTP. Somente `DECLINE` ou `REVIEW`; padrão `DECLINE`. Aplicada somente quando todos os bloqueios na etapa têm `risk_factors` exatamente igual a `["device_attribute"]`; qualquer outro fator de risco, qualquer combinação que o inclua ou a ausência de fatores de risco resulta em recusa, independentemente desta configuração. |
| `phone_shared_device_mode` | booleano | Permite o modo de verificação de telefone em dispositivo compartilhado. |
| `phone_enrichment_enabled` | booleano | Ativa o enriquecimento com inteligência de telefone (risco por tipo de linha, índice de confiança, operadora, histórico de portabilidade / troca de SIM, pontuação de risco de fraude). **Cobrado a \$0.05 por verificação**, além do preço da verificação de telefone. |
| `phone_intelligence_score_action` | ação | Ação quando a pontuação de risco de fraude do telefone é igual ou superior a `phone_intelligence_score_threshold`. |
| `phone_intelligence_score_threshold` | inteiro | Pontuação de risco de fraude (`0`–`100`, quanto maior, mais arriscado) que aciona `phone_intelligence_score_action`. Padrão `80`. |
| `phone_type_risk_action` | ação | Ação quando o número é sinalizado como um tipo de telefone de alto risco. |
| `recent_port_action` | ação | Ação quando o número passou recentemente por portabilidade (sinal de troca de SIM / portabilidade). |
| `low_phone_trust_action` | ação | Ação quando o índice de confiança do telefone é igual ou inferior a `phone_trust_index_threshold`. |
| `phone_trust_index_threshold` | inteiro | Índice de confiança (`0`–`100`, quanto menor, mais arriscado) igual ou abaixo do qual `low_phone_trust_action` é aplicada. Padrão `30`. |
| `phone_social_enabled` | booleano | Ativa a verificação de presença em plataformas online: em quais plataformas de mensagens, redes sociais, e-commerce e serviços profissionais o número verificado está registrado. **Cobrado a \$0.05 por verificação**, além do preço da verificação de telefone, independentemente de `phone_enrichment_enabled`. |
| `phone_no_social_presence_action` | ação | Ação quando a verificação de presença em plataformas online não encontra o número registrado em nenhuma das plataformas que cobre, um sinal comum de identidade sintética. Padrão `NO_ACTION`. |
| `cross_org_fraud_phone_action` | ação | Veredito quando este número foi sinalizado como fraudulento por outra organização da rede. |
| `status_rules` | array | Regras de status personalizadas opcionais. |

A Verificação de telefone fica desativada até que a organização faça sua primeira recarga.

> [!NOTE]
>
> O enriquecimento com inteligência de telefone é um complemento opcional. Quando `phone_enrichment_enabled` é `true`, cada verificação de telefone concluída é enriquecida com inteligência de telefone e **cobrada a \$0.05 por requisição**, além do custo padrão da verificação de telefone. As ações baseadas em pontuação só entram em vigor quando a pontuação do enriquecimento está disponível; as ações de índice de confiança, tipo de telefone e portabilidade se aplicam assim que o enriquecimento é executado.
>
> A verificação de presença em plataformas online é um segundo complemento, separado. Quando `phone_social_enabled` é `true`, cada verificação de telefone concluída também informa em quais plataformas online o número está registrado (mensagens, redes sociais, e-commerce e serviços profissionais) e é **cobrada a \$0.05 por requisição**. Ela pode ser ativada com ou sem `phone_enrichment_enabled`: os dois complementos têm preço e faturamento independentes. Uma consulta que não encontra o número em nenhuma das plataformas que cobre é uma resposta válida e cobrável, e aciona `phone_no_social_presence_action`. Use `phone.social_profiles_registered` (o número de plataformas em que o número está registrado) para criar ramificações com base no resultado em um grafo de fluxo de trabalho.

## Verificação de e-mail

Valor do recurso: `EMAIL_VERIFICATION`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `email_code_size` | inteiro | Tamanho do OTP, de `4` a `8`. |
| `email_max_retries` | inteiro | Número máximo de novas tentativas de envio, de `1` a `5`. |
| `email_max_check_attempts` | inteiro | Número máximo de tentativas de verificação do OTP, de `1` a `5`. |
| `email_alphanumeric_code` | booleano | Usa códigos de e-mail alfanuméricos. |
| `breached_email_action` | ação | Ação para e-mails expostos em vazamentos de dados. |
| `disposable_email_action` | ação | Ação para e-mails descartáveis. |
| `duplicated_email_action` | ação | Ação para e-mails duplicados. |
| `only_corporate_emails_allowed` | booleano | Rejeita endereços de e-mail não corporativos. |
| `email_enrichment_enabled` | booleano | Ativa o enriquecimento de inteligência de e-mail (capacidade de entrega, reputação do domínio, exposição a vazamentos de dados, pontuação de risco de fraude). **Cobrado a \$0.05 por verificação**, além do preço da verificação de e-mail. |
| `email_intelligence_score_action` | ação | Ação quando a pontuação de risco de fraude do e-mail é igual ou superior a `email_intelligence_score_threshold`. |
| `email_intelligence_score_threshold` | inteiro | Pontuação de risco de fraude (`0`–`100`; quanto maior, mais arriscado) que aciona `email_intelligence_score_action`. Padrão: `80`. |
| `recent_email_breach_action` | ação | Ação quando o e-mail aparece em um vazamento de dados conhecido e recente. |
| `frequent_email_breach_action` | ação | Ação quando o e-mail aparece em muitos vazamentos de dados conhecidos. |
| `email_social_enabled` | booleano | Ativa a verificação de presença online: em quais plataformas de e-mail, redes sociais, serviços profissionais, de e-commerce e de entretenimento o endereço verificado está cadastrado. **Cobrado a \$0.05 por verificação**, além do preço da verificação de e-mail, independentemente de `email_enrichment_enabled`. |
| `email_no_social_presence_action` | ação | Ação quando a verificação de presença online não encontra o endereço cadastrado em nenhuma das plataformas que cobre, um sinal comum de identidade sintética. Padrão: `NO_ACTION`. |
| `cross_org_fraud_email_action` | ação | Veredito quando este endereço foi sinalizado como fraudulento por outra organização da rede. |
| `status_rules` | array | Regras de status personalizadas opcionais. |

> [!NOTE]
>
> O enriquecimento de inteligência de e-mail é um complemento opcional. Quando `email_enrichment_enabled` é `true`, cada verificação de e-mail concluída é enriquecida com inteligência de e-mail e **cobrada a \$0.05 por requisição**, além do custo padrão da verificação de e-mail. A ação baseada na pontuação entra em vigor assim que a pontuação do enriquecimento estiver disponível; as ações de vazamento se aplicam assim que o enriquecimento é executado.
>
> A verificação de presença online é um segundo complemento, separado. Quando `email_social_enabled` é `true`, cada verificação de e-mail concluída também informa em quais plataformas online o endereço está cadastrado (provedores de e-mail, redes sociais e serviços profissionais, de e-commerce e de entretenimento) e é **cobrada a \$0.05 por requisição**. Ela pode ser ativada com ou sem `email_enrichment_enabled`: os dois complementos têm preços e cobranças independentes. Uma consulta que não encontra o endereço em nenhuma das plataformas que cobre é uma resposta válida e cobrável, e aciona `email_no_social_presence_action`. Use `email.social_profiles_registered` (o número de plataformas em que o endereço está cadastrado) para criar ramificações com base no resultado em um grafo de fluxo de trabalho.

## Validação de banco de dados

Valor do recurso: `DATABASE_VALIDATION`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `database_validation_countries` | object | Código de país ISO3 mapeado para `{ "services": ["service_id"] }`. Use IDs de serviço do catálogo de Validação de banco de dados. |
| `database_validation_partial_match_action` | action | Ação quando a validação de banco de dados retorna uma correspondência parcial. |
| `database_validation_no_match_action` | action | Ação quando a validação de banco de dados não retorna nenhuma correspondência. |
| `database_validation_not_applicable_action` | action | Ação quando a validação de banco de dados não pode ser executada porque o documento não contém o identificador exigido pelos serviços configurados (por exemplo, um passaporte sem número de identidade nacional). O padrão é `NO_ACTION`. |
| `database_validation_field_sources` | object | De onde ler um dado de entrada para a validação de banco de dados que nenhuma etapa anterior do grafo consegue preencher. `source` indica o produtor e `key` indica o valor dentro dele: uma chave de campo do Document AI para `document_ai`, um ID de nó do questionário para `questionnaire` e `expected_details.<field>` ou `metadata.<key>` para `expected_data`. Correspondências exatas de chave com uma etapa anterior são resolvidas automaticamente e, de propósito, não são persistidas, para que renomear um campo do Document AI nunca congele um mapeamento desatualizado na configuração. Uma entrada malformada é rejeitada com um `400` que indica o seu campo de entrada. Formato: `{"<db_validation_input_field>": {"source": "document_ai"\|"questionnaire"\|"expected_data", "key": "<docai field key>\|<questionnaire node id>\|expected_details.<field>\|metadata.<key>"}}`. |
| `status_rules` | array | Regras de status personalizadas opcionais. |

Exemplo:

```json theme={null}
{
  "feature": "DATABASE_VALIDATION",
  "config": {
    "database_validation_countries": {
      "BRA": {
        "services": ["SERVICE_ID_FROM_CATALOG"]
      }
    },
    "database_validation_field_sources": {
      "tax_id": {
        "source": "expected_data",
        "key": "expected_details.document_number"
      }
    },
    "database_validation_no_match_action": "REVIEW",
    "database_validation_partial_match_action": "REVIEW"
  }
}
```

> [!WARNING]
>
> É `database_validation_countries` que faz esta etapa funcionar. Um recurso `DATABASE_VALIDATION`
> salvo sem ele é aceito, mas depois não executa nenhuma verificação. Por isso, sempre envie pelo menos um
> país com pelo menos um ID de serviço.

Um ID de serviço que a etapa não consegue executar é rejeitado com um `400` que o identifica e explica o motivo, e nada é salvo.
Isso inclui um ID que não está no catálogo, um ID que pertence a outro país, um serviço que ainda não está disponível e um serviço oferecido apenas pelo [`POST /v3/database-validation/`](https://docs.didit.me/pt-br/core-technology/database-validation/overview) independente.
Um serviço cujas entradas não são fornecidas por nenhuma etapa anterior é rejeitado da mesma forma, com a lista das entradas ausentes.
Um serviço que o fluxo salvo já contém, mas que não pode mais ser executado, é removido quando você o salva novamente.

Por exemplo, este fluxo da Argentina lê o número do DNI e o gênero da Verificação de identidade e os confere com o RENAPER sem selfie:

```json theme={null}
{
  "workflow_label": "Argentina DNI check",
  "features": [
    {"feature": "OCR"},
    {
      "feature": "DATABASE_VALIDATION",
      "config": {"database_validation_countries": {"ARG": {"services": ["arg_renaper_data"]}}}
    }
  ]
}
```

Use `arg_renaper` em vez disso, após uma etapa `LIVENESS`, para também comparar a selfie com a foto que o RENAPER mantém.
Consulte [RENAPER](https://docs.didit.me/pt-br/api-reference/database-validation/argentina/renaper.md) para ver a pontuação de correspondência facial e o limiar.

## Verificação bancária

Valor do recurso: `BANK_VERIFICATION`.

> [!WARNING]
>
> A Verificação bancária ainda não está habilitada em produção.
> Até que esteja, salvar um fluxo de produção que inclua este nó é recusado.

O usuário verifica uma conta bancária, e o titular da conta informado pelo banco é comparado com a identidade estabelecida por uma etapa anterior do fluxo. O usuário faz isso por um de dois métodos: o login no banco (`open_banking`), em que ele entra na conta pelo próprio banco, ou a verificação de conta (`account_lookup`), em que ele digita os dados da conta e o banco confirma o nome registrado nela. `bank_method_order` e os `methods` de cada país definem quais métodos um país oferece e qual vem primeiro; veja [Métodos de verificação bancária](https://docs.didit.me/pt-br/core-technology/bank-verification/verification-methods.md). A etapa produz evidências (uma pontuação do nome do titular, a comparação que gerou essa pontuação e códigos de motivo), e as chaves `bank_*_action` transformam essas evidências em um status.

Duas coisas decidem se o nó faz alguma coisa. `bank_countries` é uma lista de permissão, então um mapa vazio não oferece nenhum banco e não executa nenhuma verificação. Além disso, o titular precisa ser comparado com alguma coisa: coloque uma etapa `OCR`, `DATABASE_VALIDATION` ou `QUESTIONNAIRE` antes dele, envie `expected_details` na criação da sessão ou mapeie os campos você mesmo com `bank_field_sources`. Sem nenhuma dessas opções, a propriedade só pode ser `unknown`, e é `bank_reference_identity_missing_action` que decide o que acontece nesse caso.

> [!NOTE]
>
> A Verificação bancária ainda está sendo liberada, então um nó `BANK_VERIFICATION` só é aceito em uma conta em que ela tenha sido habilitada. Em qualquer outra conta, o salvamento é rejeitado com uma mensagem informando isso. A rota que executa a etapa também não é configurada aqui: ela é definida pelo par `provider_key` e `fallback_to_native`, que o [Marketplace](https://docs.didit.me/pt-br/console/marketplace.md) do console configura para você.

### Conectar uma conta

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `bank_countries` | object | Em quais países o usuário pode conectar um banco. É uma lista de permissão: um mapa vazio significa que o nó não oferece nada e não executa nada. `institutions` restringe o seletor a IDs de instituição específicos, e `"all"` oferece todos os bancos do país com suporte a identidade. Um país que nenhuma rota do nó atende é mantido: ele oferece apenas suas alternativas e Continuar sem seu banco; veja [Quando a pessoa não consegue verificar o banco](https://docs.didit.me/pt-br/core-technology/bank-verification/fallbacks.md). Um código que não corresponde a nenhum país é recusado ao salvar. `methods` define quais métodos o país oferece, entre o login no banco (`open_banking`) e a verificação de conta (`account_lookup`), e em que ordem, com prioridade sobre `bank_method_order`: o usuário começa pelo primeiro e recebe o segundo como alternativa. Um país habilitado cujo `methods` cite um método que nenhuma rota do nó atende nesse país é recusado ao salvar, assim como um país atendido por uma rota em que `methods` não deixe nenhum método. Formato: `{"<ISO3>": {"enabled": true\|false, "institutions": ["<institution_id>", ...]\|"all", "methods"?: ["open_banking"\|"account_lookup", ...]}}`. |
| `bank_method_order` | string\[] | Quais dos dois métodos a etapa oferece, e em que ordem, em todos os países que não definem seus próprios `methods`: `open_banking` (login no banco: o usuário entra na conta pelo próprio banco, e só este método lê saldos, transações e renda) e `account_lookup` (verificação de conta: sem login, apenas propriedade). Em cada país, o usuário começa pelo primeiro método que uma rota atende ali e recebe o outro como alternativa; um método que nenhuma rota atende em um país fica de fora nesse país. Pelo menos um método. Um salvamento que não envie nenhum recebe `["open_banking", "account_lookup"]`, a menos que envie `bank_open_banking_enabled` ou `bank_account_lookup_enabled`, que então definem o valor. |
| `bank_scopes` | object | O que o usuário é solicitado a consentir em compartilhar. `ownership` é o que o produto verifica e não pode ser desativado. `identifiers` revela o IBAN ou o número da conta; `balances`, `transactions` e `income` leem dados financeiros reais, são cobrados separadamente e são recusados ao salvar, a menos que sua aplicação tenha a habilitação para dados financeiros. Só o login no banco lê dados: um país que oferece a verificação de conta não é recusado, e um usuário que verifica pela verificação de conta é aprovado sem os dados, que o resultado lista em `financial_data.not_collected`. Um escopo desativado nunca é solicitado, então o banco nunca o exibe na tela de consentimento. O padrão é somente `ownership`. Formato: `{"ownership": true, "identifiers": true\|false, "balances": true\|false, "transactions": true\|false, "income": true\|false}`. |
| `bank_eligible_account_types` | string\[] | Quais tipos de conta o usuário pode escolher: `checking`, `current`, `savings`, `business` ou `other`. Cartões de crédito, empréstimos e contas de investimento nunca são elegíveis, porque não comprovam a propriedade de uma conta de pagamento. O padrão é conta corrente (current e checking). |
| `bank_account_selection` | string | `user` permite que o usuário escolha qual das contas conectadas é verificada; `auto` usa a primeira conta elegível. |
| `bank_require_oauth_only` | boolean | Oferece apenas instituições acessíveis por OAuth ou app-to-app, nunca uma tela legada de captura de credenciais. Em mercados em que o open banking já torna o OAuth a única rota, isso não muda nada. |
| `bank_max_attempts` | integer | Quantas tentativas de login no banco o usuário tem, de `1` a `5`; um microdepósito ou um envio de extrato também consome uma. A verificação de conta tem seu próprio `bank_account_check_max_attempts`. Quando todas as formas de verificação ainda oferecidas ao usuário, incluindo o envio de extrato, tiverem esgotado suas tentativas sem uma conexão bem-sucedida, `bank_attempts_exhausted_action` decide. |
| `bank_connection_timeout_minutes` | integer | Por quanto tempo uma conexão iniciada fica aberta antes de a tentativa ser abandonada, de `5` a `60` minutos. |
| `bank_allow_skip` | boolean | Substituído por `bank_continue_without_bank`: agora o usuário sempre pode continuar sem um banco. É lido durante uma versão em um salvamento que não envie `bank_continue_without_bank`: `true` define `from_start`, e qualquer outro valor define `when_needed`. Todo salvamento grava o valor de volta: `true` para `from_start`, `false` para `when_needed`. |

### Quando o usuário não consegue verificar

O usuário sempre pode continuar sem um banco, e a etapa nunca o deixa sem saída. Veja [Quando a pessoa não consegue verificar o banco](https://docs.didit.me/pt-br/core-technology/bank-verification/fallbacks.md).

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `bank_continue_without_bank` | string | Quando a etapa mostra **Continue without your bank**. `when_needed`, o padrão, mostra a opção quando nenhum método funciona para o país ou o banco do usuário, quando não é possível acessar o banco dele e nenhum outro método conseguiu verificá-lo (por exemplo, porque a verificação de conta também não conseguiu acessar o banco) ou quando ele informa que não tem internet banking. `from_start` também a mostra na primeira tela. Não é possível desativá-la. Um salvamento que não envia esta chave nem `bank_allow_skip` recebe `when_needed`. |
| `bank_statement_standalone_enabled` | boolean | Com `bank_statement_enabled`, também oferece o envio do extrato quando não houve nenhuma tentativa bancária, em qualquer país, inclusive em um país não atendido por nenhuma rota de login no banco ou de verificação de conta. Nesse caso, ele é cobrado separadamente, como `bank_statement_upload`, a USD 0.20 por extrato avaliado, antes da sua tarifa contratual ou do seu preço especial: consulte [Preços](https://docs.didit.me/pt-br/core-technology/bank-verification/fallbacks.md#preços). Sessões de sandbox podem testá-lo sem cobrança. Ativado por padrão. |

O efeito de continuar sobre a sessão é definido por `bank_unsupported_action`, `bank_attempts_exhausted_action` ou `bank_skipped_action`, conforme o motivo pelo qual o usuário continuou, a menos que uma tentativa avaliada antes já tenha decidido a etapa: consulte [Ações de veredito](#ações-de-veredito).

### Comparação do titular

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `bank_reference_identity` | string | Qual etapa anterior fornece a identidade com a qual o titular é comparado: `kyc` (Verificação de identidade), `database_validation`, `expected_details` (o que você enviou na criação da sessão), `questionnaire` ou `auto`, para usar a que o fluxo tiver produzido. A etapa que efetivamente forneceu a identidade é retornada no resultado como `reference_identity_source`. |
| `bank_field_sources` | object | De onde ler um campo da identidade de referência quando nenhuma etapa anterior do grafo consegue preenchê-lo. A CHAVE do mapa é uma destas: `full_name`, `first_name`, `last_name`, `address`. `source` indica o produtor e `key` indica o valor dentro dele: uma chave de campo do Document AI para `document_ai`, um id de nó do questionário para `questionnaire` e `expected_details.<field>` ou `metadata.<key>` para `expected_data`. Um valor sob `expected_details.` só pode indicar um campo que o payload de criação da sessão de fato contém: `address`, `country`, `date_of_birth`, `first_name`, `gender`, `id_country`, `identification_number`, `ip_address`, `last_name`, `nationality` ou `poa_country`. Uma entrada malformada é recusada ao salvar, e não descartada. Formato: `{"full_name"\|"first_name"\|"last_name"\|"address": {"source": "document_ai"\|"questionnaire"\|"expected_data", "key": "<docai field key>\|<questionnaire node id>\|expected_details.<field>\|metadata.<key>"}}`. |
| `bank_name_match_threshold` | integer | A partir desta pontuação, inclusive, o nome do titular é considerado uma correspondência. De `50` a `100`, com padrão `85`. |
| `bank_partial_match_floor` | integer | Abaixo desta pontuação, o nome do titular é considerado uma não correspondência. De `0` a `99`, com padrão `70`. A faixa entre o piso e o limiar é a correspondência parcial, portanto o piso deve ser estritamente menor que o limiar; caso contrário, o salvamento é recusado. Aqui, um `null` explícito significa "usar o padrão", e é por isso que um limiar de `50` sem piso é recusado: ele é verificado como `50` em relação ao piso padrão de `70`. |
| `bank_require_address_match` | boolean | Também exige que o endereço do titular corresponda. Um nome que atingiu o limiar, mas cujo endereço tem pontuação abaixo dele, cai para correspondência parcial. Uma instituição que não retorna endereço dispensa a exigência. Já uma sessão sem endereço próprio para comparação não a dispensa e resulta em correspondência parcial. Desativado por padrão. |
| `bank_use_provider_score` | boolean | Também lê a pontuação do nome do titular calculada pela própria instituição e deixa que ela decida quando for maior que a da Didit ou quando a Didit não tiver nenhum nome de titular para pontuar. Um resultado decidido dessa forma informa `provider_only` como método de correspondência, e uma conexão que não retornou essa pontuação registra um aviso `provider_score_unavailable`. Ativado por padrão. |
| `bank_show_match_result_to_user` | boolean | Mostra o resultado de propriedade ao usuário dentro do fluxo de verificação. Desativado, o resultado é registrado na sessão, mas nunca é mostrado ao usuário. |

### Verificação de conta

Estas chaves se aplicam apenas à verificação de conta. O login no banco mantém suas próprias correspondências próximas e seu próprio `bank_max_attempts`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `bank_account_check_accept_close_match` | boolean | Ativado (o padrão), um nome que o banco pontua entre `bank_partial_match_floor` e `bank_name_match_threshold` é uma correspondência próxima: o usuário confirma o nome registrado no banco quando `bank_suggest_holder_name` está ativado, e `bank_partial_match_action` decide. Desativado, essa correspondência próxima é uma não correspondência (`OWNER_NAME_MISMATCH`, decidida por `bank_no_match_action`) e consome a tentativa. |
| `bank_account_check_max_attempts` | integer | Quantas verificações de conta o usuário tem, de `1` a `5`, ou `3` quando não definido: quantas vezes ele pode digitar os dados da conta para uma verificação respondida pelo banco. É uma contagem separada de `bank_max_attempts`. Uma verificação recusada pelo que foi digitado (um IBAN inválido) ou que o banco não conseguiu responder não consome nenhuma tentativa. |

### Dados financeiros

`bank_expected_currencies` funciona apenas com o consentimento padrão `ownership`. As outras três chaves leem dados financeiros reais, então cada uma precisa do escopo de consentimento correspondente em `bank_scopes`, e o salvamento é recusado sem ele.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `bank_expected_currencies` | string\[] | Moedas ISO 4217 em que se espera que a conta esteja. Vazio significa qualquer moeda. Uma divergência é informada por meio de `bank_currency_mismatch_action`. |
| `bank_min_balance` | number | Saldo disponível mínimo, na própria moeda da conta. Abaixo dele, `bank_low_balance_action` é acionada. Requer o escopo `balances`. `0` é um corte real e não equivale a omitir a chave: uma conta com saldo negativo aciona a ação. Essa ação tem como padrão `NO_ACTION`, que mantém o veredito inalterado, portanto recusar uma conta com saldo negativo também exige `bank_low_balance_action: "DECLINE"`. |
| `bank_transactions_history_days` | integer | Até quanto tempo atrás o histórico de transações é lido, de `30` a `365` dias. O padrão é `90`. Requer o escopo `transactions`. |
| `bank_refresh_enabled` | boolean | Busca novamente os dados financeiros da conta depois que a etapa já foi decidida, enquanto durar o consentimento bancário. Requer pelo menos um dos escopos `balances`, `transactions` ou `income`. Um consentimento que expire depois disso é tratado por `bank_consent_expired_action`. |

### O que é armazenado

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `bank_store_full_identifiers` | boolean | Armazena os identificadores da conta sem máscara, em vez de mascarados. Requer o escopo `identifiers`. Mesmo assim, a forma sem máscara só é retornada a quem faz a chamada e tem a permissão de leitura de verificação bancária. |
| `bank_store_raw_owner_data` | boolean | Mantém os dados do titular retornados pela instituição junto com a evidência de propriedade. Desativado significa que apenas a comparação em si é retida: pontuações, método de correspondência e códigos de motivo. |

### Ações de veredito

Toda chave aqui aceita `DECLINE`, `REVIEW` ou `NO_ACTION`, a menos que esteja marcada como restrita, e recorre ao padrão abaixo quando você a omite ou envia `null`. Nada que não seja evidência positiva de propriedade aprova por padrão, e somente evidência demonstrável contra o usuário recusa.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `bank_no_match_action` | ação restrita | Veredito quando o titular da conta comprovadamente não é a pessoa verificada: a melhor pontuação de nome fica abaixo de `bank_partial_match_floor`. Use `DECLINE` ou `REVIEW`. O padrão é `DECLINE`. |
| `bank_partial_match_action` | ação | Veredito quando o nome do titular fica entre `bank_partial_match_floor` e `bank_name_match_threshold`. O padrão é `REVIEW`, e nunca aprova por padrão. |
| `bank_not_verifiable_action` | ação | Veredito quando a instituição se conectou, mas não retornou nenhuma identidade do titular para comparar. O padrão é `REVIEW`. |
| `bank_unknown_action` | ação | Veredito quando a evidência não pôde ser obtida após novas tentativas, uma falha transitória. O padrão é `REVIEW`. |
| `bank_reference_identity_missing_action` | ação | Veredito quando nenhuma etapa anterior produziu uma identidade com a qual comparar o titular, de modo que a propriedade só pode ser `unknown`. O padrão é `REVIEW`. |
| `bank_joint_account_action` | ação | Veredito quando a conta tem mais de um titular. O padrão é `NO_ACTION`. |
| `bank_business_account_action` | ação | Veredito quando a instituição classifica o titular como empresa, e não como pessoa. O padrão é `REVIEW` em um fluxo de pessoa física e `NO_ACTION` em um fluxo de empresa (KYB), em que um titular empresarial é o que a sessão espera encontrar. |
| `bank_unsupported_action` | ação | Veredito quando o usuário continua sem banco porque nenhum método conseguiu verificar o país ou o banco dele: nenhuma rota de login bancário ou de verificação de conta atende o país, ou o banco escolhido não pode ser usado nesta etapa. O resultado então tem `continued_without_bank` verdadeiro e `NOT_COVERED` nos códigos de motivo. O padrão é `REVIEW`. |
| `bank_skipped_action` | ação restrita | Veredito quando o usuário escolheu Continuar sem seu banco mesmo havendo uma forma de verificar disponível. O resultado então tem `continued_without_bank` verdadeiro e `SKIPPED` nos códigos de motivo. Use `DECLINE` ou `REVIEW`. O padrão é `REVIEW`. |
| `bank_attempts_exhausted_action` | ação restrita | Veredito quando o usuário esgotou as tentativas de todas as formas de verificação ainda oferecidas a ele, incluindo o envio de extrato (`bank_max_attempts` e `bank_account_check_max_attempts` quando o país oferece a verificação de conta), sem uma conexão bem-sucedida, inclusive quando ele depois continua sem banco. Use `DECLINE` ou `REVIEW`. O padrão é `DECLINE`. |
| `bank_consent_expired_action` | ação | Veredito quando o consentimento bancário expira depois que a etapa já foi decidida. Só tem efeito com `bank_refresh_enabled`. O padrão é `NO_ACTION`. |
| `bank_currency_mismatch_action` | ação | Veredito quando a moeda da conta não está em `bank_expected_currencies`. O padrão é `NO_ACTION`. |
| `bank_country_mismatch_action` | ação | Veredito quando o país da instituição difere do país esperado ou do país do documento. O padrão é `NO_ACTION`. |
| `bank_low_balance_action` | ação | Veredito quando o saldo disponível está abaixo de `bank_min_balance`. Requer o escopo `balances`. O padrão é `NO_ACTION`. |
| `status_rules` | array | Regras de status personalizadas opcionais. |

### Mais controles

Estas chaves são opcionais. Cada chave de ação aceita `DECLINE`, `REVIEW` ou `NO_ACTION`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `bank_abandoned_action` | ação | Veredito quando a etapa termina sem correspondência depois que a pessoa saiu para o banco e nunca voltou (uma tentativa expirou por tempo limite). |
| `bank_account_age_action` | ação | Veredito quando a conta é mais recente que `bank_account_age_days`, um padrão comum de conta laranja. |
| `bank_account_age_days` | integer | Uma conta cujo histórico começa há menos que esse número de dias conta como nova, de 1 a 365, com padrão de 30. É lido do histórico de transações, portanto só com o escopo `transactions`. |
| `bank_account_lookup_enabled` | boolean | Descontinuado: use `bank_method_order` e `bank_countries.<ISO3>.methods`. É lido por uma versão a partir de um salvamento que não envie `bank_method_order`: com `bank_open_banking_enabled`, ele define a ordem, com a verificação de conta após o login bancário quando ativado, e omitida quando desativado ou não definido. Todo salvamento o regrava indicando se algum país oferece a verificação de conta. |
| `bank_account_type_action` | ação | Veredito quando a conta verificada é uma conta poupança. |
| `bank_address_match_threshold` | integer | A partir desta pontuação, o endereço do titular corresponde, de 50 a 100, com padrão de 70. Só é lido com `bank_require_address_match`. |
| `bank_address_mismatch_action` | ação | Veredito quando o endereço do titular difere, o que transforma uma correspondência em uma correspondência próxima. Só com `bank_require_address_match`. |
| `bank_auto_add_countries` | boolean | Oferece todos os países que uma rota deste nó consegue atender, inclusive os adicionados depois que o nó foi salvo, exceto os países que `bank_countries` desativa. Desativado quando a chave está ausente, para que um nó existente nunca se amplie sozinho. |
| `bank_cash_flow_action` | ação | Veredito quando o dinheiro entra e sai logo em seguida, ou quando chegam muitas transferências pequenas (fluxo de caixa de passagem). Requer o escopo `transactions`. |
| `bank_dob_match_enabled` | booleano | Compara a data de nascimento do titular, quando o banco a informa, com a data verificada. Uma divergência nunca altera o resultado de propriedade: ela dispara `bank_dob_mismatch_action`. Ativado por padrão. |
| `bank_dob_match_threshold` | inteiro | A partir desta pontuação, inclusive, a data de nascimento corresponde. Vai de 50 a 100, com padrão 70. Uma data é o mesmo dia ou não, então a pontuação é 100 ou 0. |
| `bank_dob_mismatch_action` | ação | Veredito quando a data de nascimento do titular é diferente. Somente com `bank_dob_match_enabled`. |
| `bank_email_match_enabled` | booleano | Compara o e-mail registrado no banco com o e-mail verificado da sessão. Uma divergência dispara `bank_email_mismatch_action`. Desativado por padrão. |
| `bank_email_match_threshold` | inteiro | A partir desta pontuação, inclusive, o e-mail corresponde. Vai de 50 a 100, com padrão 70. |
| `bank_email_mismatch_action` | ação | Veredito quando o e-mail do titular é diferente. Somente com `bank_email_match_enabled`. |
| `bank_evidence_retention_days` | inteiro | Exclui as evidências bancárias este número de dias após o veredito: 30, 90, 365 ou 1825. Null as mantém junto com a sessão. São excluídos: os dados do titular, a identidade com que foram comparados, os identificadores da conta, os dados financeiros e um extrato enviado; uma conexão ainda ativa é revogada. O veredito, as pontuações e os códigos de motivo permanecem. Excluir a sessão exclui tudo, o que ocorrer primeiro. |
| `bank_fallback_used_action` | ação | Veredito quando a conta foi verificada com microdepósitos ou com o envio de um extrato. |
| `bank_match_any_holder` | booleano | Uma conta conjunta ou em cotitularidade corresponde quando QUALQUER titular listado corresponde à pessoa. Desativado: somente o primeiro titular listado pelo banco pode corresponder. Ativado por padrão. |
| `bank_microdeposits_enabled` | booleano | Oferece microdepósitos como alternativa: dois depósitos pequenos chegam à conta e a pessoa informa os valores. Oferecido apenas em um país cuja rota consiga enviá-los, após uma tentativa cobrada de verificação bancária na mesma sessão. Incluído sem custo adicional; o cliente paga o preço da rota uma única vez. Sessões de sandbox podem testá-lo sem cobrança. O titular é o nome verificado pela sessão, em nome do qual a pessoa declara estar a conta, então uma conta verificada registra um aviso `holder_declared`. Ativado por padrão. |
| `bank_mule_score_action` | ação | Veredito quando a pontuação de conta laranja é igual ou superior a `bank_mule_score_threshold`. |
| `bank_mule_score_threshold` | inteiro | A partir desta pontuação de conta laranja, inclusive, de 0 a 100, `bank_mule_score_action` é disparado; o padrão é 70. A pontuação combina conta nova, fluxo de caixa de passagem, saldo esvaziado e muitas transferências pequenas recebidas, lidos do histórico de transações (o escopo `transactions`). |
| `bank_open_banking_enabled` | booleano | Descontinuado: use `bank_method_order` e `bank_countries.<ISO3>.methods`. Lido durante uma versão a partir de um salvamento que não envia `bank_method_order`: com `bank_account_lookup_enabled`, define a ordem, com o login no banco quando ativado ou não definido. Todo salvamento o regrava indicando se algum país oferece login no banco. |
| `bank_phone_match_enabled` | booleano | Compara o telefone registrado no banco com o telefone verificado da sessão. Uma divergência dispara `bank_phone_mismatch_action`. Desativado por padrão. |
| `bank_phone_match_threshold` | inteiro | A partir desta pontuação, inclusive, o telefone corresponde. Vai de 50 a 100, com padrão 70. |
| `bank_phone_mismatch_action` | ação | Veredito quando o telefone do titular é diferente. Somente com `bank_phone_match_enabled`. |
| `bank_popular_mode` | string | `auto` (o padrão) ordena os bancos populares pelos que as pessoas do país mais conectam; `manual` mostra, em vez disso, as `popular_institutions` de cada país definidas em `bank_countries`, na ordem delas. |
| `bank_statement_document_checks_action` | ação | Veredito quando um extrato enviado apresenta indícios de edição ou adulteração. O padrão é `REVIEW`. |
| `bank_statement_enabled` | booleano | Oferece o envio de extrato bancário como alternativa: um extrato dos últimos 3 meses, verificado quanto a adulteração, cujo nome do titular é comparado da mesma forma que o de um banco. Incluído sem custo adicional após uma tentativa cobrada de verificação bancária na mesma sessão. Com `bank_statement_standalone_enabled`, também é oferecido sem nenhuma tentativa bancária anterior, em qualquer país, e nesse caso é cobrado separadamente. Sessões de sandbox podem testá-lo sem cobrança. Desativado por padrão. |
| `bank_suggest_holder_name` | booleano | Em uma correspondência próxima, mostra à pessoa o nome em que o banco mantém a conta e pede que ela confirme que é o dela ou que conecte outra conta. A resposta é registrada como `holder_confirmation`; confirmar encerra a etapa com `bank_partial_match_action`. Ativado por padrão. |
| `fallback_to_native` | booleano | Define se uma conexão de marketplace que não pode ser estabelecida recorre à rota nativa da Didit. Desativado por padrão: um fallback silencioso gastaria seu saldo da Didit em uma sessão que você esperava executar no contrato com seu próprio provedor. Uma conexão de fallback é registrada como `credential_source = native` e cobrada pelo preço nativo. |
| `provider_key` | string | Qual rota executa a etapa. Vazio (o padrão) é a Verificação bancária nativa da Didit, um produto independente de provedor que a Didit direciona ao fornecedor regional de open banking que atende o país e a instituição do usuário, com os contratos e o faturamento da Didit. Um valor indica um provedor do MARKETPLACE cujas próprias credenciais esta aplicação conectou - a sessão então é executada, cobrada e revogada na sua conta do provedor, e a Didit cobra apenas a taxa de plataforma do marketplace. Um provedor que não está conectado é recusado ao salvar. |

Exemplo de objeto `config`, para uma conta em que a Verificação bancária está ativada e a rota selecionada cobre o país listado:

```json theme={null}
{
  "bank_method_order": ["open_banking", "account_lookup"],
  "bank_countries": {
    "ESP": { "enabled": true, "institutions": "all" }
  },
  "bank_scopes": { "ownership": true },
  "bank_eligible_account_types": ["checking", "current"],
  "bank_name_match_threshold": 85,
  "bank_partial_match_floor": 70,
  "bank_partial_match_action": "REVIEW",
  "bank_no_match_action": "DECLINE"
}
```

> [!WARNING]
>
> `bank_countries` é o que faz esta etapa ter efeito, e é verificado em relação à rota em que o
> nó é executado, não a uma lista global. Um país em que essa rota não consegue estabelecer a propriedade
> da conta é rejeitado ao salvar e citado no erro; portanto, leia o erro em vez de presumir
> que o país foi aceito e será ignorado em tempo de execução.

## AML

Valor do recurso: `AML`.

Para a triagem de pessoas em KYC, use estes campos:

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `is_aml_ongoing_monitoring_enabled` | boolean | Ativa o monitoramento AML contínuo. |
| `aml_score_approve_threshold` | integer | Limiar de aprovação. |
| `aml_score_review_threshold` | integer | Limiar de revisão. |
| `aml_match_score_threshold` | integer | Limiar da pontuação de correspondência para possíveis correspondências. |
| `aml_name_weight` | integer | Peso do nome. Se qualquer peso de AML for informado, os pesos de nome, data de nascimento e país devem somar `100`. |
| `aml_dob_weight` | integer | Peso da data de nascimento. |
| `aml_country_weight` | integer | Peso do país. |
| `create_cases_on_hit` | boolean | Abre um caso automaticamente quando a triagem retorna uma correspondência, em vez de deixar a correspondência para triagem a partir da sessão. Desativado por padrão. |
| `case_blueprint` | uuid | O blueprint de caso que serve de base para o caso criado automaticamente. Só tem efeito com `create_cases_on_hit`; quando não definido, é usado o padrão da conta. |
| `status_rules` | array | Regras de status personalizadas opcionais. |

Para a triagem de empresas em KYB, use estes campos:

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `kyb_score_approve_threshold` | integer | Limiar de aprovação de AML da empresa. |
| `kyb_score_review_threshold` | integer | Limiar de revisão de AML da empresa. |
| `kyb_enable_ongoing_monitoring` | boolean | Ativa o monitoramento AML contínuo de KYB. |
| `kyb_company_aml_match_score_threshold` | integer | Limiar da pontuação de correspondência de AML da empresa. |
| `kyb_company_aml_name_weight` | integer | Peso do nome da empresa. Os pesos de AML da empresa devem somar `100` quando informados. |
| `kyb_company_aml_dob_weight` | integer | Peso da data de constituição ou da data de nascimento. |
| `kyb_company_aml_country_weight` | integer | Peso do país. |

### Triagem de uma entidade extraída por uma etapa de Document AI

Uma etapa de AML normalmente lê quem deve ser triado a partir da etapa `OCR` (uma pessoa) ou da etapa `KYB_REGISTRY` (uma empresa). Um fluxo de verificação (workflow) cuja única etapa de extração é `DOCUMENT_AI` (documentos não padronizados, como uma certidão fiscal ou um contrato social) não tem nenhuma delas, por isso precisa indicar de onde vem cada dado de entrada da triagem.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `aml_field_sources` | object | De onde obter os dados da entidade analisada por esta etapa. `source` indica a origem e `key` indica o valor dentro dela: uma chave de campo do Document AI para `document_ai`, um id de nó do questionário para `questionnaire` e `expected_details.<field>` ou `metadata.<key>` para `expected_data`. A CHAVE do mapa é um dos quatro dados de entrada da triagem (`full_name`, `date_of_birth`, `nationality`, `document_number`), lidos, no caso de uma empresa, como razão social, data de constituição, país e número de registro. Um campo do Document AI cuja chave já seja um desses quatro é mapeado automaticamente e, de propósito, não é persistido, de modo que renomeá-lo nunca congela um mapeamento desatualizado. Um mapeamento explícito prevalece tanto sobre o mapeamento automático quanto sobre o documento de identidade, e um mapeamento que não é resolvido para nenhum valor em tempo de execução deixa o dado de entrada vazio, em vez de recorrer a outra origem. Em um fluxo de empresa (KYB), a empresa retornada por uma etapa `KYB_REGISTRY` prevalece: somente um mapeamento explícito substitui um de seus dados de entrada, o mapeamento automático não é aplicado sobre um registro do cadastro e, sem uma etapa de registro, o mapeamento define toda a identidade. Formato: `{"full_name"\|"date_of_birth"\|"nationality"\|"document_number": {"source": "document_ai"\|"questionnaire"\|"expected_data", "key": "<docai field key>\|<questionnaire node id>\|expected_details.<field>\|metadata.<key>"}}`. |
| `aml_entity_type` | string | `person` ou `company`. O padrão é `person` em um fluxo de pessoa (KYC) e `company` em um fluxo de empresa (KYB). Defina `company` para triar a empresa indicada em um documento enviado sem uma etapa `KYB_REGISTRY`: o provedor pesquisa registros de empresas e a pontuação de correspondência é calculada como a de uma empresa. |
| `aml_incomplete_data_action` | action | Veredito quando a triagem foi executada com menos do que uma identidade completa (nome, data de nascimento e país). `REVIEW` é o padrão. `NO_ACTION` prossegue com dados reduzidos em um fluxo que, de forma consciente, contém apenas um nome. A triagem é executada em qualquer caso, e o registro de dados parciais é gravado em qualquer caso: isso decide apenas o efeito sobre o status. |

Exemplo: triagem da empresa indicada em uma *acta constitutiva* mexicana, sem nenhum documento de identidade no fluxo:

```json theme={null}
{
  "feature": "AML",
  "config": {
    "aml_entity_type": "company",
    "aml_field_sources": {
      "full_name": { "source": "document_ai", "key": "razon_social" },
      "document_number": { "source": "document_ai", "key": "rfc" },
      "date_of_birth": { "source": "document_ai", "key": "fecha_constitucion" },
      "nationality": { "source": "document_ai", "key": "pais" }
    },
    "aml_incomplete_data_action": "REVIEW"
  }
}
```

> [!WARNING]
>
> Sem uma etapa `OCR` e sem uma etapa `KYB_REGISTRY` antes dela, uma etapa `AML` precisa conseguir preencher
> `full_name`: não há pesquisa no provedor sem um nome. Um fluxo que não mapeia nada, ou que mapeia
> uma chave do Document AI que nenhuma etapa anterior extrai, é rejeitado ao salvar, em vez de ser salvo e ficar
> sem triar nada. A precisão do AML depende diretamente de quantos identificadores você fornece: uma
> triagem só com o nome é o que gera um alto volume de falsos positivos.

## Análise de dispositivo e IP

Valor do recurso: `IP_ANALYSIS`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `ip_mismatch_action` | action | Ação quando a geolocalização do IP não corresponde aos dados esperados. |
| `ip_location_not_determined_action` | action | Veredito quando nenhum endereço IP que identifique o usuário final foi registrado e, portanto, a sessão não tem nenhuma localização de IP: país, cidade, provedor de internet, coordenadas e fuso horário ficam indisponíveis, e `ip_geofencing_by_country`, a comparação com o país do documento e as verificações de VPN/data center não podem ser executadas. O padrão é `NO_ACTION`, que mantém o aviso `IP_LOCATION_NOT_DETERMINED` visível na sessão sem alterar o veredito; defina `REVIEW` ou `DECLINE` se uma sessão sem localização não puder ser aprovada. |
| `vpn_detection_action` | action | Ação quando é detectado o uso de VPN ou proxy. |
| `expected_ip_mismatch_action` | action | Ação quando o IP não corresponde ao IP esperado. |
| `duplicated_ip_action` | action | Ação quando o IP é reutilizado de forma suspeita. |
| `duplicated_device_action` | action | Ação quando a mesma impressão digital persistente do dispositivo é reutilizada em sessões com valores de `vendor_data` diferentes. |
| `recovered_device_action` | action | Ação quando a recuperação de impressão digital v2 vincula a sessão, com alta confiança, a um dispositivo já visto anteriormente depois que o ID persistente do dispositivo mudou. |
| `is_ip_geofencing_enabled` | boolean | Ativa as restrições de geofencing por IP. Quando `false`, `ip_geofencing_by_country` é mantido, mas não é aplicado. |
| `ip_geofencing_by_country` | object | Regras de localização de IP por país, indexadas pelo código de país ISO-3: `{"USA": {"allowed": true, "states": {"California": {"allowed": false}}}}`. As entradas de estado/região substituem a configuração do país; países não listados são permitidos. |
| `ip_geofencing_action` | action | Ação quando o IP da sessão está localizado em um país ou estado/região não permitido. O padrão é `DECLINE`. |
| `automation_detected_action` | action | Veredito quando a sessão parece ser conduzida por automação, e não por uma pessoa. |
| `cross_org_fraud_device_action` | action | Veredito quando este dispositivo foi sinalizado como fraudulento por outra organização da rede. |
| `cross_org_fraud_ip_action` | action | Veredito quando este IP foi sinalizado como fraudulento por outra organização da rede. |
| `device_app_tampered_action` | action | Veredito quando o binário da aplicação hospedeira parece ter sido adulterado. |
| `device_blocklist_action` | action | Veredito quando o dispositivo está na lista de bloqueio da organização. |
| `device_debugger_action` | action | Veredito quando há um depurador conectado à aplicação hospedeira. |
| `device_emulator_action` | action | Veredito quando o dispositivo é um emulador, e não um hardware real. |
| `device_hooking_action` | action | Veredito quando é detectado hooking ou instrumentação em tempo de execução. |
| `device_integrity_missing_action` | action | Veredito quando nenhum atestação de integridade do dispositivo foi retornado pela plataforma. |
| `device_rooted_action` | action | Veredito quando o dispositivo tem root ou jailbreak. |
| `multiple_devices_action` | action | Veredito quando a sessão foi conduzida a partir de mais de um dispositivo. |
| `device_liveness_attack_history_action` | action | Ação quando o mesmo dispositivo (identificado pelo seu ID persistente de dispositivo) foi usado em uma sessão anterior de outro usuário cuja captura de prova de vida foi considerada um ataque (aviso `DEVICE_LINKED_TO_LIVENESS_ATTACK`). O padrão é `NO_ACTION`. |
| `device_model_inconsistency_action` | action | Ação quando o mesmo dispositivo (identificado pelo seu ID persistente de dispositivo) foi identificado como um modelo de dispositivo diferente em uma sessão anterior (aviso `DEVICE_MODEL_INCONSISTENT`). O padrão é `NO_ACTION`. |
| `status_rules` | array | Regras de status personalizadas opcionais. |

Exemplo:

```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` separadamente de `duplicated_device_action` quando quiser monitorar dispositivos identificados por recuperação com alta confiança antes de recusá-los automaticamente. Isso é útil durante a implantação, porque as correspondências por recuperação de dispositivo são projetadas para detectar redes de fraude, mas ainda devem ser calibradas com base no seu próprio tráfego.

## Verificação de localização

Valor do recurso: `GEOLOCATION`.

Verifica onde a pessoa está durante a verificação, pela posição do dispositivo ou pela localização do IP da conexão, em relação às áreas permitidas e bloqueadas, à localização do IP e ao endereço do documento.
Consulte [Verificação de localização](https://docs.didit.me/pt-br/core-technology/location-verification/overview.md) para saber como a etapa funciona e [o relatório dela](https://docs.didit.me/pt-br/core-technology/location-verification/report-location-verification.md) para os campos de decisão.
Coloque-a depois da Verificação de identidade ou do Comprovante de endereço se quiser a distância até o endereço de um documento, porque a distância só é medida quando há um endereço registrado.
Com `geolocation_position_source` não definido, a distância até a localização do IP exige uma etapa de Análise de dispositivo e IP no mesmo fluxo.
Todas as chaves são opcionais: uma etapa com `config` vazio pede ao dispositivo uma posição com precisão de 250 m e com no máximo 120 segundos, dá 3 tentativas à pessoa e não aplica nenhuma regra de área.

Cada constatação tem sua própria chave de ação. Uma chave de ação que você deixa sem definir assume o padrão do `geolocation_preset` escolhido ou, se você não escolheu nenhum, o padrão por chave listado abaixo.
Uma localização incerta ou recusada tem `REVIEW` como padrão, nunca `DECLINE`, porque uma permissão negada ou um raio amplo não é evidência de fraude.
Uma ação definida explicitamente sempre prevalece sobre o preset.
Um desafio reproduzido (`LOCATION_REPLAY_DETECTED`) e uma falha na atestação do dispositivo (`LOCATION_INTEGRITY_FAILED`) sempre resultam em recusa e não têm chave de ação.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `geolocation_position_source` | string | De onde vem a posição. `device_and_ip` pede a posição do dispositivo e a compara com a localização do IP da conexão pela qual ela é enviada (com uma consulta de inteligência de IP quando esse IP ainda não está em cache). Sem definição (o padrão), também pede a posição do dispositivo e, como antes de esta chave existir, a compara com a localização do IP observada pela etapa de Análise de dispositivo e IP da sessão; por isso, sem essa etapa não há distância, e a conexão nunca é consultada. A exceção é um nó que age sobre uma constatação de VPN, proxy ou Tor (por ação própria ou pelo preset): ele consulta a conexão para essa constatação e compara o dispositivo com ela, exatamente como faz `device_and_ip`. `device_only` nunca compara com a localização do IP e só consulta a conexão para essas constatações; `ip_only` nunca pergunta à pessoa e avalia a localização do IP da conexão, em nível de cidade com um raio de 50 km, sem regra de precisão, de atualidade ou de permissão aproximada; com `geolocation_areas`, uma cidade costeira é avaliada como dentro do seu país, a menos que outro país esteja dentro desse raio. Em um nó que pergunta ao dispositivo, uma tentativa sem posição do dispositivo é avaliada como a recusa ou a falha que ela é: a localização do IP nunca a substitui. |
| `geolocation_preset` | string | Os padrões que toda ação não definida deste nó assume. `licensing`: fora de uma área, em uma área bloqueada, VPN, Tor ou emulador resultam em recusa, proxy e as demais constatações vão para revisão, e a ausência de atestação do dispositivo continua como Sem ação. `fraud_screening`: o mesmo, exceto que o que o Licensing recusa vai para revisão. Null mantém os padrões tradicionais. Uma ação definida explicitamente sempre prevalece. |
| `geolocation_accuracy_mode` | string | O que é pedido ao dispositivo. `precise` pede ao sistema operacional uma posição precisa, e uma pessoa que concede apenas uma aproximada recebe um novo pedido enquanto houver tentativas e depois é avaliada por `geolocation_approximate_action`; `approximate_allowed` aceita uma permissão aproximada sem esse veredito. `geolocation_max_accuracy_radius_m` se aplica em ambos os casos. `precise` quando não definido. |
| `geolocation_max_accuracy_radius_m` | integer | O maior raio de incerteza, em metros, que uma posição do dispositivo pode ter e ainda ser considerada. De 10 a 50000 metros; 250 quando não definido. Uma posição mais ampla, ou uma que não informa raio, faz o que `geolocation_low_accuracy_behavior` determina e é avaliada por `geolocation_low_accuracy_action`. Um nó `ip_only` não tem raio do dispositivo e nunca o aplica. |
| `geolocation_max_accuracy_radius_unit` | string | A unidade em que o console mostra `geolocation_max_accuracy_radius_m`. Apenas para exibição: o valor armazenado é sempre em metros, nenhuma regra depende dele, e os dados da etapa apenas o repassam para que um cliente possa mostrar a mesma unidade. |
| `geolocation_low_accuracy_behavior` | string | O que acontece com uma posição mais ampla que `geolocation_max_accuracy_radius_m`, ou sem raio: `ask_again` (o padrão) pede que a pessoa tente novamente enquanto houver tentativas; `fail` encerra a etapa na primeira. |
| `geolocation_max_age_seconds` | integer | A idade máxima, em segundos, que uma posição do dispositivo pode ter quando o servidor a recebe. De 5 a 3600 segundos; 120 quando não definido. Uma mais antiga gera um novo pedido enquanto houver tentativas e depois é avaliada por `geolocation_stale_fix_action`. |
| `geolocation_timeout_seconds` | integer | Por quanto tempo, em segundos, o cliente deixa o dispositivo procurar uma posição em cada tentativa; o servidor o repassa nos dados da etapa e não impõe nada por conta própria. De 5 a 120 segundos; 20 quando não definido. Uma tentativa que não encontra posição a tempo é enviada como `timeout`, gera um novo pedido enquanto houver tentativas e depois é avaliada por `geolocation_unavailable_action`. |
| `geolocation_max_attempts` | integer | Quantas tentativas a pessoa tem neste nó. De 1 a 5 tentativas; 3 quando não definido. Uma tentativa que a pessoa ainda pode mudar (uma recusa, uma posição ampla, desatualizada ou aproximada, ou uma constatação de área ou de anonimizador sobre a qual o nó age) gera um novo pedido enquanto houver tentativas, e a última decide a etapa. Uma posição simulada, ou um emulador sobre o qual o nó age, encerra a etapa na tentativa que o informou. |
| `geolocation_allow_qr_handoff` | boolean | Oferece continuar em um celular com um QR code enquanto a etapa ainda está aberta (`allow_qr_handoff` nos dados da etapa, `can_handoff` em cada resposta de envio). Os SDKs nativos já rodam no celular e nunca mostram o código. Ativado por padrão. |
| `geolocation_allow_skip` | boolean | Permite que a pessoa siga sem localização a qualquer momento, pela introdução ou por uma tela de nova tentativa (`skipped: true`). Pular encerra a etapa e é avaliado por `geolocation_unavailable_action`, exceto quando o pulo responde a uma recusa em um `geolocation_refusal_path` `continue_without_location`, caso em que é registrado como essa recusa. Desativado por padrão. |
| `geolocation_deep_link_enabled` | boolean | Encaminhado ao cliente como `deep_link_enabled` nos dados da etapa: oferece abrir o próprio aplicativo do cliente. O servidor não aplica nenhuma regra a ele. Desativado por padrão. |
| `geolocation_refusal_path` | string | O caminho oferecido quando o acesso à localização é recusado. `retry_then_handoff` (o padrão) pede novamente enquanto restarem tentativas e oferece a transferência para o celular. `continue_without_location` permite que a pessoa continue e registra a recusa. `end_session` encerra a etapa e a sessão na primeira recusa. Ele exige que `geolocation_permission_denied_action` seja Revisar ou Recusar e um fluxo com um final de decisão Recusado, Em revisão ou Final. A sessão é decidida a partir das etapas executadas e nunca é Aprovada: em um fluxo que não pode terminar nessa decisão, ela assume o outro final que não aprova (Recusado em vez de Em revisão, Em revisão em vez de Recusado). |
| `is_geolocation_geofencing_enabled` | boolean | Ativa as regras de área: `geolocation_areas`, ou o antigo `geolocation_geofencing_by_country`, só se aplicam enquanto este campo for true, e só então os dados da etapa listam `available_areas`. Desativado por padrão. Com ele ativado, uma lista `geolocation_areas` precisa de pelo menos uma área permitida. |
| `geolocation_areas` | array | Áreas permitidas e bloqueadas, aplicadas enquanto `is_geolocation_geofencing_enabled` for true. Só passa uma posição dentro de uma área permitida, e uma área bloqueada sempre prevalece sobre uma permitida. Uma posição é avaliada por todo o seu círculo de precisão: um círculo que cruza uma borda decisiva para a resposta é indeterminado, nunca fora. Um país ou região termina onde começa outro território, nunca na linha costeira. Uma posição que os contornos não colocam em nenhuma terra (uma orla ou um píer que a linha costeira simplificada cortou) é indeterminada para todo país ou região dentro do seu raio mais 12 milhas náuticas. `id` é o nome usado pelas regras de ramificação e por `geolocation.inside_areas` / `geolocation.blocked_areas`. `kind` escolhe a forma: um `country` inteiro (ISO 3166-1 alfa-3 com contorno publicado; um território que os contornos desenham como região de outro país é essa `region`, como Reunião, que é `FR-RE` da França, ou Bonaire, Santo Eustáquio e Saba, de `NL-BQ1` a `NL-BQ3`), `region` (códigos ISO 3166-2 de um país com limites publicados), `circle` (de 1 a 500 km) ou `polygon` (de 3 a 200 pontos, um anel cujas arestas nunca se cruzam nem se tocam). No máximo 50 áreas, com ids únicos, e pelo menos uma área permitida enquanto o geofencing estiver ativado. Não pode ser combinado com `geolocation_geofencing_by_country`. |
| `geolocation_geofencing_by_country` | object | Regras de permissão/bloqueio por país e região para a própria posição do dispositivo, aplicadas apenas enquanto `is_geolocation_geofencing_enabled` for true. Mesmo formato de `ip_geofencing_by_country` da Análise de IP, exceto que as chaves de `states` são códigos ISO 3166-2 (`US-NJ`), não nomes de estados, porque a posição é resolvida para uma subdivisão, e não para o rótulo de cidade de um provedor. Um país que não está listado é permitido. Salvar uma regra de região para um país sem limites ISO 3166-2 publicados é rejeitado, em vez de ser ignorado silenciosamente. |
| `geolocation_ip_distance_km` | integer | A distância máxima, em quilômetros, entre a posição do dispositivo e a localização do IP, depois de subtraídos os dois raios de incerteza, antes que `geolocation_ip_distance_action` se aplique. 200 quando a chave é omitida; null desativa a comparação. Só faz a comparação um nó cujo `geolocation_position_source` seja `device_and_ip` ou não esteja definido; essa chave indica com qual localização de IP ele compara. |
| `geolocation_ip_distance_unit` | string | A unidade em que o console mostra `geolocation_ip_distance_km`. Apenas para exibição: o valor armazenado é sempre em quilômetros e nenhuma regra depende dele. |
| `geolocation_document_distance_km` | integer | A distância máxima, em quilômetros, entre a posição (a localização do IP em um nó `ip_only`) e o endereço indicado por `geolocation_document_distance_basis` antes que `geolocation_document_distance_action` se aplique. Não definido ou null (o padrão) significa desativado. |
| `geolocation_document_distance_unit` | string | A unidade em que o console mostra `geolocation_document_distance_km`. Apenas para exibição: o valor armazenado é sempre em quilômetros e nenhuma regra depende dele. |
| `geolocation_document_distance_basis` | string | A partir de qual endereço `geolocation_document_distance_km` é medido: `document` (o padrão: o endereço do documento de identidade e, depois, o comprovante de endereço), apenas `proof_of_address`, ou `declared` (o `expected_details.address` informado na criação da sessão, geocodificado). |
| `geolocation_travel_tolerance_enabled` | boolean | Desconsidera a distância do endereço quando a mesma pessoa (mesmo `vendor_data`) foi vista a até `geolocation_travel_usual_area_km` dele nos últimos `geolocation_travel_max_days` dias. Nunca desconsidera uma VPN, uma posição falsificada, uma área bloqueada ou estar fora das áreas permitidas. Só uma posição medida pelo dispositivo conta como ter sido vista ali: uma localização forjada ou simulada, um emulador ou uma atestação com falha nunca contam. |
| `geolocation_travel_usual_area_km` | integer | Raio em torno do endereço que conta como a área habitual da pessoa. De 10 a 500 km; 100 quando não definido. |
| `geolocation_travel_max_days` | integer | Por quanto tempo, depois de a pessoa ser vista na área habitual, uma posição distante ainda é considerada viagem. De 1 a 90 dias; 14 quando não definido. |
| `geolocation_consecutive_mismatch_count` | integer | Gera LOCATION\_CONSECUTIVE\_MISMATCHES quando esta verificação e as verificações anteriores da mesma pessoa (mesmo `vendor_data`) ficaram fora das áreas permitidas, em uma área bloqueada ou longe demais do endereço esse número de vezes seguidas. Uma verificação que não comparou nada não estende nem interrompe a sequência. O mesmo vale para uma posição que o dispositivo não mediu (uma localização forjada ou simulada, um emulador, uma atestação com falha). De 2 a 10; null (o padrão) significa desativado. |
| `geolocation_approximate_action` | action | Veredito quando o usuário concedeu uma localização aproximada enquanto `geolocation_accuracy_mode` exige uma precisa. O padrão é `REVIEW`. |
| `geolocation_blocked_area_action` | action | Veredito quando a posição, com todo o seu círculo de precisão, fica dentro de uma área bloqueada de `geolocation_areas`. O padrão é Recusar. |
| `geolocation_consecutive_mismatch_action` | action | Veredito quando se atinge `geolocation_consecutive_mismatch_count` divergências seguidas. O padrão é Revisão. |
| `geolocation_document_distance_action` | action | Veredito quando a posição do dispositivo está mais distante do endereço do documento do que `geolocation_document_distance_km`. O endereço é geocodificado de forma aproximada, então este é um sinal fraco. O padrão é `REVIEW`. |
| `geolocation_emulator_action` | action | Veredito quando o aplicativo que compartilhou a localização informou estar rodando em um emulador. Navegadores não conseguem informar isso. A menos que seja Nenhuma ação, encerra a etapa nessa tentativa: verificar novamente não muda o dispositivo. Nenhuma ação, a menos que seja definido ou que um preset diga o contrário. |
| `geolocation_geofence_undetermined_action` | action | Veredito quando não é possível situar a posição dentro ou fora da cerca, porque seu círculo de precisão alcança o limite. A incerteza nunca é informada como estando fora. O padrão é `REVIEW`. |
| `geolocation_geofencing_action` | action | Veredito quando a posição do dispositivo, junto com todo o seu círculo de incerteza, fica fora de `geolocation_geofencing_by_country`. O padrão é `DECLINE`. |
| `geolocation_integrity_missing_action` | action | Veredito quando um cliente nativo enviou uma posição sem token de atestação do dispositivo. O padrão é Nenhuma ação; clientes web são registrados como não suportados, e não como ausentes, porque nenhum navegador consegue fazer a atestação. |
| `geolocation_ip_distance_action` | action | Veredito quando a posição do dispositivo e a localização do IP da sessão estão mais distantes entre si do que `geolocation_ip_distance_km`, depois de subtraídos os dois raios de incerteza. O padrão é `REVIEW`. |
| `geolocation_low_accuracy_action` | action | Veredito quando nenhuma tentativa alcançou a precisão exigida: a melhor posição tem um raio de incerteza maior que `geolocation_max_accuracy_radius_m` ou não informou raio nenhum. Uma posição sem raio nunca é considerada dentro do limite. O padrão é `REVIEW`. |
| `geolocation_mock_location_action` | action | Veredito quando o sistema operacional informou a posição como simulada, e não medida (provedor de localização simulada no Android, simulada por software no iOS). O padrão é `REVIEW`. |
| `geolocation_permission_denied_action` | action | Veredito quando o usuário recusou ou dispensou a solicitação de localização em todas as tentativas permitidas. O padrão é Revisão: uma recusa é uma escolha, não um sinal de fraude. |
| `geolocation_proxy_action` | action | Veredito quando a conexão que compartilhou a localização passa por um proxy aberto, anônimo ou de retransmissão privada. Nenhuma ação, a menos que seja definido ou que um preset diga o contrário. |
| `geolocation_stale_fix_action` | action | Veredito quando a posição foi medida mais de `geolocation_max_age_seconds` antes de o servidor recebê-la. O padrão é `REVIEW`. |
| `geolocation_tor_action` | action | Veredito quando a conexão que compartilhou a localização é um nó de saída do Tor. Nenhuma ação, a menos que seja definido ou que um preset diga o contrário. |
| `geolocation_unavailable_action` | action | Veredito quando não foi possível obter nenhuma posição: serviços de localização desativados ou restritos, o sistema de posicionamento não retornou nada, a tentativa expirou, o usuário pulou a etapa ou o cliente é antigo demais para dar suporte a ela. O padrão é `REVIEW`. |
| `geolocation_vpn_action` | action | Veredito quando a conexão que compartilhou a localização é uma VPN comercial. A menos que seja Nenhuma ação, a pessoa é solicitada a desativá-la e verificar novamente enquanto houver tentativas restantes. Nenhuma ação, a menos que seja definido ou que um preset diga o contrário. |
| `status_rules` | array | Regras de status personalizadas opcionais. Você pode usar como alvo os campos `geolocation.*` listados em [Relatório de verificação de localização](https://docs.didit.me/pt-br/core-technology/location-verification/report-location-verification.md#campos-para-regras-de-status-e-ramificações). |

### Formatos de área

Cada item de `geolocation_areas` tem um `id` (de 1 a 64 caracteres de `A-Z a-z 0-9 _ -`, único na lista), um `label` opcional (até 80 caracteres), um `type` igual a `allowed` ou `blocked` e um `kind` que define o formato.

| `kind` | Campos adicionais | Significado |
| - | - | - |
| `country` | `country` (ISO 3166-1 alpha-3) | Um país inteiro que tem um contorno publicado. |
| `region` | `country`, `regions` (códigos ISO 3166-2 desse país) | Uma ou mais subdivisões de um país com limites publicados. |
| `circle` | `center` (`latitude`, `longitude`), `radius_km` (de 1 a 500) | Todos os pontos dentro do raio a partir do centro. |
| `polygon` | `points` (de 3 a 200 itens de `latitude`, `longitude`) | Um anel fechado cujas arestas nunca se cruzam nem se tocam. |

Uma lista comporta no máximo 50 áreas e precisa de pelo menos uma área `allowed` enquanto `is_geolocation_geofencing_enabled` for `true`.
`geolocation_areas` e `geolocation_geofencing_by_country` não podem ser enviados juntos, e `geolocation_refusal_path: "end_session"` exige que `geolocation_permission_denied_action` seja `REVIEW` ou `DECLINE`.
A API recusa uma área que nunca poderia corresponder, como uma região de um país sem limites publicados, em vez de salvá-la.

Exemplo:

```json theme={null}
{
  "feature": "GEOLOCATION",
  "config": {
    "geolocation_position_source": "device_and_ip",
    "geolocation_preset": "licensing",
    "geolocation_max_accuracy_radius_m": 250,
    "geolocation_max_attempts": 3,
    "is_geolocation_geofencing_enabled": true,
    "geolocation_areas": [
      { "id": "spain", "label": "Spain", "type": "allowed", "kind": "country", "country": "ESP" },
      { "id": "ceuta-melilla", "type": "blocked", "kind": "region", "country": "ESP", "regions": ["ES-CE", "ES-ML"] }
    ],
    "geolocation_ip_distance_km": 200,
    "geolocation_ip_distance_action": "REVIEW",
    "geolocation_vpn_action": "DECLINE"
  }
}
```

## Comprovante de endereço

Valor do recurso: `PROOF_OF_ADDRESS`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `poa_documents_allowed` | objeto | Mapeia o código de país ISO3 para a configuração de tipos de documento de comprovante de endereço. Pelo menos um tipo de documento válido deve estar habilitado. |
| `poa_languages_allowed` | objeto | Mapeia o código de idioma ISO 639-1 para `0` ou `1`. Pelo menos um idioma deve estar habilitado. |
| `poa_name_or_address_mismatch_action` | ação | Ação quando o nome ou o endereço não corresponde aos dados esperados. |
| `poa_document_issues_action` | ação | Ação quando o documento tem problemas de qualidade ou de extração. |
| `poa_max_attempts_exceeded_action` | ação restrita | Ação quando o usuário excede as tentativas permitidas. Use `DECLINE` ou `REVIEW`. |
| `poa_document_authenticity_action` | ação restrita | Ação quando as verificações de autenticidade falham. Use `DECLINE` ou `REVIEW`. |
| `poa_unsupported_document_type_action` | ação | Ação quando o tipo de documento não é suportado. |
| `poa_unsupported_language_action` | ação | Ação quando o idioma do documento não é suportado. |
| `poa_issuer_not_identified_action` | ação | Ação quando o emissor do documento não foi identificado. |
| `poa_issue_date_not_detected_action` | ação | Ação quando a data de emissão está ausente. |
| `poa_unparsable_or_invalid_address_action` | ação | Ação quando o endereço é inválido ou não pode ser analisado. |
| `address_validation_enabled` | booleano | Valida o endereço que esta etapa lê (impresso no comprovante de endereço; somente um envio que passou nas verificações do documento é validado) com base em dados de referência postal: confirma que o endereço existe e o normaliza, e nunca o vincula a uma pessoa. O resultado é o objeto `address_validation` da etapa na decisão. **Cobrado \$0.10 por endereço validado**; uma validação que não pôde ser executada (`unavailable`) é gratuita. Desativado por padrão. |
| `address_not_verified_action` | ação | Ação quando a Validação de endereço não conseguiu confirmar o endereço até o nível do edifício (`ADDRESS_NOT_VERIFIED`: `partially_verified` ou `not_verified`). Aplica-se somente enquanto `address_validation_enabled` estiver ativado. O padrão é `NO_ACTION`, que apenas registra o aviso. |
| `poa_name_match_score_threshold` | inteiro | Limiar de correspondência do nome. |
| `poa_max_retry_attempts` | inteiro | Limite de novas tentativas, de `2` a `5`. |
| `status_rules` | array | Regras de status personalizadas opcionais. |

## Questionário

Valor do recurso: `QUESTIONNAIRE`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `questionnaire_uuid` | UUID | Obrigatório. Use o `questionnaire_id` retornado por `POST /v3/questionnaires/`. |
| `review_questionnaire_manually` | booleano | Envia as respostas do questionário para revisão manual. |
| `status_rules` | array | Regras de status personalizadas opcionais. Você pode direcionar regras aos campos `questionnaire.answers.<question_id>`. |

## Registro KYB

Valor do recurso: `KYB_REGISTRY`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `kyb_accepted_countries` | objeto | Lista legada de países permitidos (ISO3) para a consulta ao registro de empresas. Substituída por `kyb_registry_countries_config`; ainda pode ser lida e ainda é derivada dela nos fluxos existentes, mas não é mais a forma de configurar novos fluxos. |
| `kyb_manual_company_action` | ação | Ação quando a empresa exige tratamento manual. |
| `kyb_registry_fields_config` | objeto | Visibilidade e obrigatoriedade por campo do formulário de registro no fluxo hospedado. Veja abaixo. |
| `kyb_registry_countries_config` | objeto | Roteamento do registro por país, no formato `{"<ISO2>": {"enabled": bool, "tier": "basic" \| "shareholders" \| "ubo"}}`. Cada país habilitado define o nível de dados cobrado quando uma empresa é selecionada (`basic` é o nível Lite), e só podem ser habilitados os níveis que o [endpoint de preços](https://docs.didit.me/pt-br/getting-started/kyb-registry-pricing.md) marca como disponíveis para aquele país. Pelo menos um país deve estar habilitado: uma verificação de registro que não pesquisa em lugar nenhum é rejeitada. Empresas inseridas manualmente são cobradas separadamente e não usam esta configuração. |
| `kyb_registry_monitoring_enabled` | booleano | Mantém o registro da empresa sob monitoramento contínuo após um resultado Shareholders ou UBO: uma mudança de status, de administradores, de propriedade ou de endereço leva a sessão de volta para revisão e dispara um webhook. Disponível somente onde o provedor do registro oferece monitoramento. USD 2.00 por empresa por ano, cancelável a qualquer momento. Desativado por padrão. |
| `kyb_vat_invalid_action` | ação | Ação quando o número de VAT da empresa falha na validação do VIES da UE. O padrão é `REVIEW`. |
| `kyb_vat_unverified_action` | ação | Ação quando o número de VAT não pôde ser validado porque o VIES estava indisponível. O padrão é `NO_ACTION`. |
| `status_rules` | array | Regras de status personalizadas opcionais. |

`kyb_registry_fields_config` mapeia cada chave de campo configurável para `{"enabled": bool, "required": bool}`. `enabled: false` oculta o campo, `enabled: true, required: false` o exibe como opcional e `enabled: true, required: true` o torna obrigatório no envio. `company_name`, `country_code` e `region` são sempre exibidos e obrigatórios e não podem ser configurados. Quando o objeto é omitido, `null` ou `{}`, aplica-se o padrão: somente `incorporation_date` é obrigatório e todos os outros campos são opcionais.

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

Chaves de campo configuráveis: `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`. Veja [campos configuráveis do formulário de registro](https://docs.didit.me/pt-br/business-verification/company-data.md#campos-configuráveis-do-formulário-de-registro) para o comportamento do usuário final e [validação de VAT e de identificação fiscal](https://docs.didit.me/pt-br/business-verification/company-data.md#validação-de-vat-e-de-identificação-fiscal) para saber como `vat_number` e `tax_number` são verificados.

## Documentos KYB

Valor do recurso: `KYB_DOCUMENTS`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `kyb_required_document_groups` | objeto ou array | Obrigatório. Grupos de documentos KYB exigidos. |
| `kyb_document_subtype_config` | objeto | Ativação e configuração de idade por subtipo de documento. |
| `kyb_document_tampering_action` | ação restrita | Ação quando uma adulteração é detectada. Use `DECLINE` ou `REVIEW`. |
| `kyb_document_critical_mismatch_action` | ação restrita | Ação para divergências críticas no documento. Use `DECLINE` ou `REVIEW`. |
| `kyb_document_non_critical_mismatch_action` | ação | Ação para divergências não críticas no documento. |
| `kyb_document_age_action` | ação | Ação quando as regras de idade do documento não são atendidas. |
| `kyb_document_max_retry_attempts` | inteiro | Limite de novas tentativas para documentos KYB. |
| `kyb_document_max_attempts_exceeded_action` | ação restrita | Ação quando o número máximo de tentativas é excedido. Use `DECLINE` ou `REVIEW`. |
| `status_rules` | array | Regras de status personalizadas opcionais. |

## Pessoas-chave KYB

Valor do recurso: `KYB_KEY_PEOPLE`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `kyb_ubo_ownership_threshold` | inteiro | Limiar de propriedade para UBO, de `0` a `100`. |
| `kyb_shareholder_ownership_threshold` | inteiro | Limiar de propriedade para acionistas, de `0` a `100`. Não pode ser maior que `kyb_ubo_ownership_threshold`. |
| `kyb_key_people_ownership_required` | booleano | Exige um percentual de propriedade em cada pessoa-chave enviada. A exigência é aplicada no envio e exibida na interface hospedada, que marca o campo como obrigatório. Padrão `false`. |
| `kyb_require_ubo_kyc` | booleano | Exige que os UBOs concluam um fluxo de verificação de pessoa física. |
| `kyb_ubo_verification_workflow` | UUID | Obrigatório quando `kyb_require_ubo_kyc` é `true`. Deve referenciar um fluxo que não seja de KYB na mesma aplicação. |
| `kyb_require_officer_kyc` | booleano | Exige que os administradores concluam a verificação de pessoa física. |
| `kyb_shareholder_verification_workflow` | UUID | Fluxo de verificação de pessoa física para acionistas. |
| `kyb_officer_verification_workflow` | UUID | Fluxo de verificação de pessoa física para administradores. |
| `kyb_require_corporate_ubo_kyb` | booleano | Exige que UBOs que são pessoas jurídicas concluam o KYB. |
| `kyb_corporate_ubo_verification_workflow` | UUID | Obrigatório quando `kyb_require_corporate_ubo_kyb` é `true`. Deve referenciar um fluxo de KYB na mesma aplicação. |
| `kyb_reject_if_ubo_rejected` | booleano | Rejeita a empresa quando uma verificação de UBO obrigatória é rejeitada. |
| `kyb_wait_for_all_ubos` | booleano | Aguarda todas as verificações de UBO obrigatórias antes de tomar uma decisão sobre a sessão de KYB. |
| `kyb_role_config` | objeto ou array | Configuração por função. Cada função com KYC obrigatório deve incluir um `verification_workflow`. |
| `kyb_reuse_verified_individuals` | booleano | Reutiliza pessoas físicas já verificadas quando possível. |
| `kyb_notify_parties_by_email` | booleano | Envia notificações por e-mail às pessoas-chave convidadas. |
| `kyb_key_people_company_fields` | objeto | Quais dados da empresa são coletados para uma pessoa-chave do tipo CORPORATE. Mesmo formato de lista de descritores e mesmas regras de `kyb_key_people_person_fields`. Formato: `[{"key": "<field key>", "label": "<label>", "type": "text"\|"number"\|"date"\|"phone"\|"email", "required": true\|false, "custom": true\|false}]`. |
| `kyb_key_people_document_mismatch_action` | ação | Decisão quando o documento de uma pessoa-chave diverge dos dados declarados para ela. |
| `kyb_key_people_person_fields` | objeto | Quais dados pessoais são coletados para uma pessoa-chave individual, como uma LISTA ORDENADA de descritores de campo (não um mapa). `key` é obrigatório e não pode ser vazio; `type` deve ser text, number, date, phone ou email; `custom` indica um campo adicionado pelo cliente, e não um dos campos predefinidos. Formato: `[{"key": "<field key>", "label": "<label>", "type": "text"\|"number"\|"date"\|"phone"\|"email", "required": true\|false, "custom": true\|false}]`. |
| `kyb_key_people_prefill_from_registry` | booleano | Preenche previamente a lista de pessoas-chave com o resultado do registro de empresas, para que o cliente confirme e corrija os dados em vez de digitar cada administrador e acionista. |
| `status_rules` | array | Regras de status personalizadas opcionais. |

## Document AI

Valor do recurso: `DOCUMENT_AI`.

Solicita um ou mais documentos ao usuário e extrai, com um modelo de visão, os campos nomeados que você define. Cada campo configurado se torna um valor `document_ai.<key>` que pode ser usado em ramificações, e o resultado da etapa é `document_ai.status`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `document_ai_documents` | array | Obrigatório. Os documentos a solicitar (no máximo `3`). Cada item é um objeto de documento (veja abaixo). |
| `document_ai_unreadable_document_action` | ação | Ação quando o documento não pode ser lido ou nenhum dado pode ser extraído. |
| `document_ai_missing_required_fields_action` | ação | Ação quando um campo obrigatório não pode ser extraído. |
| `document_ai_document_tampering_action` | ação restrita | Ação quando o documento apresenta sinais de manipulação. Use `DECLINE` ou `REVIEW`. |
| `document_ai_name_mismatch_action` | ação | Ação quando o nome completo extraído não corresponde à identidade verificada. Exige um campo marcado com `is_full_name`. |
| `document_ai_unsupported_file_action` | ação | Ação quando o tipo do arquivo enviado não é suportado. |
| `document_ai_max_attempts_exceeded_action` | ação restrita | Ação quando o usuário excede as tentativas permitidas. Use `DECLINE` ou `REVIEW`. |
| `document_ai_name_match_score_threshold` | integer | Pontuação mínima (`0`–`100`) para que o nome completo extraído corresponda à identidade verificada. Abaixo dela, aplica-se `document_ai_name_mismatch_action`. |
| `document_ai_max_retry_attempts` | integer | Limite de novas tentativas, de `2` a `5`. |
| `status_rules` | array | Regras de status personalizadas opcionais. Você pode usar campos `document_ai.<key>` como alvo. |

Cada item em `document_ai_documents` é um documento:

| Campo do documento | Tipo | Descrição |
| - | - | - |
| `document_key` | string | Obrigatório. Identificador estável do documento, único dentro da etapa. |
| `title` | string | Obrigatório. Título exibido ao usuário. |
| `description` | string | Obrigatório. Instruções exibidas ao usuário sobre o que enviar. |
| `title_i18n` | object | Opcional. Código de localidade para o título traduzido (por exemplo, `{ "es": "Comprobante de fondos" }`). |
| `description_i18n` | object | Opcional. Código de localidade para a descrição traduzida. |
| `fields` | array | Obrigatório. Os campos a extrair (pelo menos um). As chaves dos campos devem ser únicas dentro do documento. |

Cada item em `fields` de um documento é um campo:

| Campo | Tipo | Descrição |
| - | - | - |
| `key` | string | Obrigatório. Chave JSON estável para o valor extraído, única dentro do documento. Use-a em ramificações como `document_ai.<key>`. |
| `name` | string | Obrigatório. Rótulo legível do campo. |
| `name_i18n` | object | Opcional. Código de localidade para o nome traduzido do campo. |
| `instruction` | string | Opcional. Instrução que diz ao modelo exatamente o que extrair para este campo. |
| `type` | string | Tipo do campo: `text`, `number` ou `date`. O padrão é `text`. |
| `required` | boolean | Se o campo deve estar presente. O padrão é `false`. Quando `true` e o valor está ausente, aplica-se `document_ai_missing_required_fields_action`. |
| `is_full_name` | boolean | Opcional, o padrão é `false`. Marca o campo cujo valor é o nome completo do titular do documento, comparado com a identidade verificada (o nome verificado na verificação de identidade ou os dados esperados da sessão). **No máximo um campo por documento** pode defini-lo como `true`, e ele **não é obrigatório**: um documento pode não marcar nenhum, e nesse caso nenhuma comparação de nome é executada para esse documento. Apenas campos `text` podem ser o nome completo. |

Exemplo:

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

## Assinatura eletrônica

Valor do recurso: `SIGNATURE`.

Faz com que a pessoa verificada, ou as pessoas-chave de uma empresa, assinem documentos, no nível Simples (padrão) ou Avançado (AES). Coloque-o depois das etapas que verificam o signatário: Verificação de identidade e Verificação de e-mail ou de telefone para o código. Veja [Assinatura eletrônica](https://docs.didit.me/pt-br/core-technology/electronic-signature/overview.md).

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `signature_documents` | array | Os documentos enviados para este fluxo no console, na ordem em que o signatário os vê, no formato `[{"uuid", "title", "file_name", "pages", "size_bytes"}]`. Apenas os valores de `uuid` e a ordem deles são lidos; o restante vem dos arquivos armazenados. Até 20 documentos e 50 MB no total. Padrão `[]`. |
| `signature_documents_source` | string | De onde vêm os documentos: `workflow` (padrão), `session` (`sign.documents` em [criar sessão](https://docs.didit.me/pt-br/sessions-api/create-session.md#documentos-de-assinatura-eletrônica)) ou `both` (documentos do fluxo primeiro). |
| `signature_require_read_to_end` | boolean | O signatário precisa chegar ao fim de cada documento sem campos antes de concordar com ele. Padrão `true`. |
| `signature_consent_per_document` | boolean | O signatário concorda com cada documento sem campos separadamente. Para documentos com campos, os campos guiados e o consentimento final substituem essa concordância. Padrão `true`. |
| `signature_signer` | string | Quem assina: `verified_person` (padrão, KYC) ou, para KYB, `legal_representative` (pessoas-chave com a função `representative` ou `authorized_signatory`) ou `key_people` (cada pessoa-chave que seja pessoa física e tenha uma sessão de KYC). |
| `signature_level` | string | `simple` (padrão): sem verificação de identidade, e-mail, telefone nem código; o signatário digita o próprio nome e assina pelo link da sessão. `aes`: exige uma verificação de identidade aprovada, um e-mail ou telefone verificado e um código de uso único. `simple` é recusado para signatários `legal_representative` e `key_people` com `signature_simple_requires_verified_person`. Enquanto `signature_availability.aes` for `false` no fluxo, salvar uma nova etapa `aes` retorna `400` com `aes_not_available`. `qes` estará disponível em breve: salvá-lo retorna `400` com `qes_not_available`. |
| `signature_format` | string | `pades` (padrão). `xades` e `cades` são recusados para AES com `signature_format_not_supported`. |
| `signature_otp_channel` | string | Para onde vai o código de uso único: `email` (padrão) ou `sms`. Ele é enviado apenas para um contato verificado anteriormente na sessão. |
| `signature_email_signed_copy` | boolean | Envia ao signatário, por e-mail, uma cópia dos documentos assinados. Exige um e-mail verificado. Padrão `true`. |
| `signature_evidence_page` | boolean | Anexa a página de evidências a cada PDF assinado. Padrão `true`. |
| `signature_link_validity_days` | integer | Por quanto tempo o link de assinatura permanece válido, de `1` a `30` dias a partir da criação da sessão. Padrão `7`. |
| `signature_declined_action` | action | Decisão quando o signatário recusa. Nada é cobrado. Padrão `REVIEW`. |
| `signature_otp_failed_action` | action | Decisão após 3 códigos errados ou mais de 5 códigos solicitados. Padrão `DECLINE`. |
| `signature_name_mismatch_action` | action | Decisão quando o nome declarado de uma pessoa-chave não corresponde ao nome verificado dela. Padrão `DECLINE`. |
| `signature_identity_not_verified_action` | action | Decisão quando o signatário não tem evidência de identidade aprovada. Padrão `DECLINE`. |
| `signature_document_changed_action` | action | Decisão quando um documento não corresponde mais ao SHA-256 registrado quando ele foi exibido. Padrão `DECLINE`. |
| `status_rules` | array | Regras de status personalizadas opcionais. Você pode usar como alvo `signature.status`, `signature.level` e `signature.format`. |

Os campos de um documento do fluxo são posicionados no editor de modelos do console. Para documentos da sessão, envie-os em `sign.documents[].fields` e envie os valores dos campos `api.<key>` em `sign.field_values`. Veja [Criar sessão](https://docs.didit.me/pt-br/sessions-api/create-session.md#documentos-de-assinatura-eletrônica).

Exemplo, para documentos enviados com cada sessão:

```json theme={null}
{
  "feature": "SIGNATURE",
  "config": {
    "signature_documents_source": "session",
    "signature_signer": "verified_person",
    "signature_level": "aes",
    "signature_otp_channel": "email",
    "signature_link_validity_days": 14,
    "signature_declined_action": "REVIEW"
  }
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.