> ## 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 funcionalidades de fluxo: API

> Referência de todos os campos de configuração aceites por POST e PATCH /v3/workflows/ para fluxos lineares simples com o array features da Didit.

Use estes campos de `config` dentro de cada item do array `features` em [`POST /v3/workflows/`](https://docs.didit.me/pt/management-api/workflows/create) e [`PATCH /v3/workflows/{settings_uuid}/`](https://docs.didit.me/pt/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 de fluxos v3 cria um fluxo linear baseado em nós a partir do array `features` ordenado. Envie as funcionalidades pela ordem exata de execução.

> [!NOTE]
>
> O motor que executa uma funcionalidade, o da própria Didit ou o de um fornecedor terceiro, não é um dos campos de configuração abaixo. É gerido através do [Marketplace](https://docs.didit.me/pt/console/marketplace.md) da consola, que define `provider_key` e `fallback_to_native` no objeto `config` da funcionalidade por si.

## Regras de validação

* `OCR` usa por defeito todos os países e tipos de documento suportados quando `config.documents_allowed` é omitido, `null` ou `{}`. Se enviar um objeto `documents_allowed` personalizado, este tem de conter pelo menos um país válido e um tipo de documento ativo. 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é as assinaturas qualificadas estarem disponíveis, e recusa um novo passo com `signature_level: "aes"`, devolvendo `aes_not_available` enquanto `signature_availability.aes` for `false` no fluxo. Os respetivos documentos têm de existir quando uma sessão é criada: com `signature_documents_source` definido como `workflow`, o passo precisa de documentos carregados na consola, e um passo sem documentos pode permanecer como rascunho, mas não pode entrar em produção; com `session`, cada pedido de criação tem de enviar `sign.documents`.
* `FACE_MATCH` tem de vir depois de `OCR` em pedidos de fluxo simples.
* `NFC` e `DATABASE_VALIDATION` exigem `OCR` quando aparecem no mesmo fluxo. `AML` precisa de um de `OCR`, `KYB_REGISTRY` ou `DOCUMENT_AI` antes de si; com apenas `DOCUMENT_AI` antes dele, o `full_name` a analisar tem de poder ser preenchido, seja a partir de um campo do Document AI anterior já identificado como `full_name`, que é mapeado automaticamente, seja a partir de uma entrada explícita `config.aml_field_sources` (ver [AML](#aml)).
* As sub-funcionalidades KYB, como `KYB_DOCUMENTS` e `KYB_KEY_PEOPLE`, exigem `KYB_REGISTRY` anteriormente no fluxo.
* Um fluxo é um fluxo de pessoa (KYC) ou um fluxo de empresa (KYB), nunca os dois. Um fluxo que use qualquer funcionalidade KYB (`KYB_REGISTRY`, `KYB_DOCUMENTS`, `KYB_KEY_PEOPLE`) só pode combiná-la com `AML`, `DOCUMENT_AI`, `QUESTIONNAIRE`, `PHONE_VERIFICATION`, `EMAIL_VERIFICATION`, `IP_ANALYSIS` e `SIGNATURE`. Não pode incluir funcionalidades exclusivas de pessoas, como `OCR`, `LIVENESS`, `FACE_MATCH`, `NFC`, `PROOF_OF_ADDRESS`, `DATABASE_VALIDATION` ou `AGE_ESTIMATION`, e um fluxo de pessoa não pode incluir funcionalidades KYB. Num fluxo de empresa, `DOCUMENT_AI` compara qualquer campo marcado com `is_full_name` com a empresa verificada, e não com uma pessoa. Para verificar as pessoas por detrás de uma empresa, crie um fluxo KYC separado e referencie-o no nó `KYB_KEY_PEOPLE` usando `kyb_ubo_verification_workflow`, `kyb_officer_verification_workflow` ou `kyb_shareholder_verification_workflow`.
* Os campos de ação usam `DECLINE`, `REVIEW` ou `NO_ACTION`, salvo se o campo abaixo indicar que é restrito.
* Os campos de pontuação e de limiar são números de `0` a `100`, salvo se for indicado um intervalo mais restrito.

## Regras de estado comuns

Todas as funcionalidades suportam um array opcional `status_rules`. Use-o para substituir o estado da funcionalidade quando uma condição sobre um campo se verifica.

```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 de `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-o ou envie `null` para os operadores que não precisam de valor. |
| `status` | string | Um de `Approved`, `Declined`, `In Review` ou `No Action`. |
| `value_type` | string | Opcional. `literal` por predefinição. Use `field` para comparar com outro campo, `list` para resolver um UUID de lista da Didit em tempo de execução, ou `relative_date` para comparar um campo de data com uma data obtida adicionando ou subtraindo uma duração à data de hoje. |
| `score` | number | Obrigatório para `fuzzy_match`. Pontuação mínima de semelhança, de `0` a `100`. A regra corresponde quando a semelhança calculada é igual ou superior a este valor (`similarity >= score`). Por exemplo, `Software Engineer` pode corresponder a `Soft. Engineer` quando a semelhança é de pelo menos `80`. |

Leia o exemplo acima como: `kyc.extra_fields.profession` tem correspondência difusa com `Soft. Engineer` com uma pontuação mínima de `80` → definir o estado da funcionalidade como `Declined`.

Para a Verificação de identidade, indique valores extraídos de `extra_fields`, como `kyc.extra_fields.profession`, as datas de validade da classe da carta de condução, como `kyc.extra_fields.dl_class_code_b_from` e `kyc.extra_fields.dl_class_code_b_to`, ou os códigos de restrição ou informação por classe, como `kyc.extra_fields.dl_class_code_b_notes` (coluna 12 das cartas de condução do Reino Unido). Estes valores vêm do objeto `extra_fields` do resultado do OCR; não fazem parte de `expected_details`.

> [!NOTE]
>
> Os campos `dl_class_code_*_from` e `dl_class_code_*_to` contêm sempre uma data ISO válida ou estão ausentes de `extra_fields`. A Didit nunca devolve texto OCR ilegível num campo de data. Se a célula da tabela de classes não puder ser lida, o campo é omitido em vez de ser enviado como string bruta, por isso use o operador `is_empty` para encaminhar datas de classe ilegíveis em vez de assumir que o campo está sempre presente.

Para campos de data, use `value_type: "relative_date"` com um objeto de valor da forma `{ "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 relativamente à data de hoje.

### Comparar com um passo específico

Um fluxo em grafo pode executar a mesma funcionalidade mais do que uma vez, por exemplo três passos de Verificação de identidade.
Com `value_type: "field"`, acrescente `@<node_id>` ao valor para o ler de um passo específico.
O nó referenciado tem de ser um passo de funcionalidade que seja sempre executado antes do passo da própria regra, em todos os caminhos que lá cheguem, ou o próprio passo da regra.
Um valor sem o sufixo é lido a partir do passo 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 no terceiro passo de Verificação de identidade, como: o `kyc.full_name` deste passo tem correspondência difusa com o nome completo lido pelo passo `ocr_1`, com uma pontuação mínima de `80` → definir o estado da funcionalidade como `Declined`.
Na consola, o seletor de variáveis lista cada passo elegível pelo seu número no ecrã e guarda o sufixo por si.

## OCR / Verificação de identidade

Valor da funcionalidade: `OCR`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `documents_allowed` | object | Opcional. Omita a chave, envie `null` ou envie `{}` para permitir todos os países e tipos de documento suportados. Envie um código de país ISO3 com a configuração do tipo de documento apenas quando quiser restringir os documentos permitidos. Pelo menos um documento personalizado tem de 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 suportados pelo país. |
| `methods` | object | Quais dos três [métodos de Verificação de identidade](https://docs.didit.me/pt/core-technology/id-verification/verification-methods.md) cada país pode usar: captura do documento, consulta sem documento a uma fonte governamental ou outra fonte oficial, e carteiras de identidade digital. Omitir a chave, um país ou um método dentro de um país significa que esse país usa apenas captura de documento. Cada método e carteira tem de estar marcado como disponível para o país no catálogo de capacidades, caso contrário, a operação de gravação é rejeitada. Ver [Métodos por país](#métodos-por-país) abaixo. |
| `document_blur_fields_by_country` | object | Código de país ISO3 para os nomes dos campos a ocultar nas imagens de documentos. |
| `image_capture_methods_allowed` | string\[] | Métodos de captura permitidos. Os valores incluem `CAMERA_SCAN` e `UPLOAD`. |
| `duplicated_user_action` | action | Ação para um utilizador duplicado. |
| `is_age_restrictions_enabled` | boolean | Ativa as verificações de idade mínima e máxima. |
| `age_restrictions_by_country` | object | Código de país ISO3 para uma configuração de idade com `minimum_age`, `maximum_age` opcional e `states` opcional. |
| `minimum_age` | integer | Idade mínima global, de `1` a `120`. |
| `minimum_age_action` | action | Ação quando o utilizador está abaixo de `minimum_age`. |
| `maximum_age` | integer | Idade máxima global, de `1` a `120`. |
| `maximum_age_action` | action | Ação quando o utilizador está acima de `maximum_age`. |
| `expiration_date_not_detected_action` | action | Ação quando a data de validade do documento não é detetada. |
| `invalid_code_action` | action | Ação quando um código de barras ou um código legível por máquina é inválido. |
| `invalid_mrz_action` | action | Ação quando a MRZ é inválida. |
| `inconsistent_data_action` | action | Ação quando os campos extraídos do documento entram em conflito. |
| `invalid_validation_action` | action | Ação quando a validação do documento falha. |
| `expected_details_mismatch_action` | action | Ação quando os dados esperados do utilizador não correspondem ao documento. |
| `image_too_blurry_action` | action | Ação para imagens de documentos desfocadas. |
| `image_too_dark_action` | action | Ação para imagens de documentos escuras. |
| `image_too_bright_action` | action | Ação para imagens de documentos sobreexpostas. |
| `unparsed_address_action` | action | Ação quando a morada do documento não pode ser interpretada. |
| `address_validation_enabled` | boolean | Valida a morada que este passo lê (impressa no documento de identidade) contra dados de referência postais: confirma que a morada existe e normaliza-a, e nunca a associa a uma pessoa. O resultado é o objeto `address_validation` do passo na decisão. **É cobrado \$0.10 por morada validada**; uma validação que não consegue ser executada (`unavailable`) é gratuita. Desativado por predefinição. |
| `address_not_verified_action` | action | Ação quando a Validação de morada não consegue confirmar a morada até ao edifício (`ADDRESS_NOT_VERIFIED`: `partially_verified` ou `not_verified`). Aplica-se apenas enquanto `address_validation_enabled` estiver ativo. Por predefinição é `NO_ACTION`, que apenas regista o aviso. |
| `document_or_personal_number_format_mismatch_action` | action | 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` | action | Ação quando a verificação de oclusão indica que um campo impresso crítico - um número de identificação, um nome, a data de nascimento ou a data de validade - foi fisicamente tapado no documento capturado. Tapar um número de identificação é um sinal de adulteração e não de qualidade de captura, por isso a predefinição é `REVIEW`; o valor lido de um campo tapado é retirado da extração em qualquer dos casos. Mude para `DECLINE` quando um documento com campos ocultados nunca deva chegar a um revisor. |
| `document_without_portrait_action` | action | Ação quando o tipo de documento reconhecido nunca tem fotografia de retrato em nenhum dos lados (alguns títulos de residência, cartões de saúde, certificados de registo e outras famílias de documentos sem retrato conhecidas no catálogo). Por predefiniçã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` | boolean | Ativa a comparação entre o retrato do documento e a selfie. |
| `document_selfie_portrait_match_decline_threshold` | integer | Limiar de recusa para a correspondência entre o retrato do documento e a selfie. |
| `document_selfie_portrait_match_review_threshold` | integer | Limiar de revisão para a correspondência entre o retrato do documento e a selfie. |
| `document_selfie_face_search_enabled` | boolean | Executa a [Pesquisa facial 1:N](https://docs.didit.me/pt/core-technology/face-search/overview.md#a-selfie-tirada-durante-a-captura-do-documento) sobre a selfie tirada durante a captura do documento (requer `is_document_selfie_portrait_match_enabled`): compara-a com a lista de bloqueio facial e com utilizadores verificados anteriormente. A selfie é apenas comparada, o seu template biométrico nunca é guardado. Ativado por predefinição. `false` ignora a pesquisa e deixa as ações de duplicação facial da selfie do documento sem nada a que reagir; `face_search_enabled: false` no passo de Prova de vida também a ignora, pois essa exclusão abrange todas as selfies da sessão. |
| `document_selfie_duplicated_face_action` | action | Decisão quando a selfie da captura do documento corresponde, ou possivelmente corresponde, ao rosto de um utilizador já verificado nesta aplicação. Por predefinição é `NO_ACTION`. |
| `document_selfie_duplicated_face_name_mismatch_action` | action | Decisão quando a selfie da captura do documento corresponde a um utilizador já verificado com um nome diferente. Só pode agravar `document_selfie_duplicated_face_action`. Por predefinição é `REVIEW`. |
| `document_selfie_duplicated_face_document_mismatch_action` | action | Decisão quando a selfie da captura do documento corresponde a um utilizador já verificado com uma data de nascimento diferente no seu documento de identidade. A mesma pessoa num documento diferente ou renovado não é sinalizada. Só pode agravar `document_selfie_duplicated_face_action`. Por predefinição é `REVIEW`. |
| `id_verification_name_match_score_threshold` | inteiro | Limiar de correspondência de nomes entre várias verificações de identidade. |
| `id_verification_max_retry_attempts` | inteiro | Limite de tentativas para a verificação de identidade, de `2` a `5`. |
| `id_document_quality_threshold` | inteiro | Pontuação mínima de qualidade da captura (`0` a `100`) que a imagem do documento tem de atingir para ser aceite. A verificação de qualidade é sempre executada; apenas este limiar é configurável. Por predefinição é `20`, ajustado para que capturas degradadas e limítrofes (desfocadas, com movimento ou com texto ilegível) sejam recusadas, enquanto os documentos legíveis passam; aumente-o para requisitos de captura mais exigentes. A consola apresenta este valor numa barra deslizante perceptual, onde o valor predefinido de `20` surge como o ponto de equilíbrio, 50%. |
| `cross_org_fraud_document_action` | ação | Veredicto quando este documento foi sinalizado como fraudulento por outra organização da rede. |
| `document_audio_recording_enabled` | booleano | Gravar o microfone durante a captura do documento, para que um revisor possa ouvir a sessão. Desativado por predefinição. |
| `document_liveness_portrait_replace_decline_threshold` | inteiro | Pontuação de substituição do retrato (`0` a `100`, quanto mais alta, maior a probabilidade de ser genuíno) abaixo da qual a sessão é recusada. Por predefinição é `35`. Ver [limiares de prova de vida do documento](https://docs.didit.me/pt/core-technology/id-verification/warnings-id-verification.md#configurar-limiares-de-prova-de-vida-do-documento). |
| `document_liveness_portrait_replace_review_threshold` | inteiro | Pontuação de substituição do retrato abaixo da qual a sessão passa a estar em análise, quando ainda não foi recusada. Com `100`, quase todas as sessões ficam retidas. Por predefinição é `70`. Ver [limiares de prova de vida do documento](https://docs.didit.me/pt/core-technology/id-verification/warnings-id-verification.md#configurar-limiares-de-prova-de-vida-do-documento). |
| `document_liveness_printed_copy_decline_threshold` | inteiro | Pontuação de cópia impressa (`0` a `100`, quanto mais alta, maior a probabilidade de ser genuína) abaixo da qual a sessão é recusada. Por predefinição é `35`. Ver [limiares de prova de vida do documento](https://docs.didit.me/pt/core-technology/id-verification/warnings-id-verification.md#configurar-limiares-de-prova-de-vida-do-documento). |
| `document_liveness_printed_copy_review_threshold` | inteiro | Pontuação de cópia impressa abaixo da qual a sessão passa a estar em análise, quando ainda não foi recusada. Com `100`, quase todas as sessões ficam retidas. Por predefinição é `77`. Ver [limiares de prova de vida do documento](https://docs.didit.me/pt/core-technology/id-verification/warnings-id-verification.md#configurar-limiares-de-prova-de-vida-do-documento). |
| `document_liveness_screen_replay_decline_threshold` | inteiro | Pontuação de captura de ecrã (`0` a `100`, quanto mais alta, maior a probabilidade de ser genuína) abaixo da qual a sessão é recusada. Por predefinição é `30`. Ver [limiares de prova de vida do documento](https://docs.didit.me/pt/core-technology/id-verification/warnings-id-verification.md#configurar-limiares-de-prova-de-vida-do-documento). |
| `document_liveness_screen_replay_review_threshold` | inteiro | Pontuação de captura de ecrã abaixo da qual a sessão passa a estar em análise, quando ainda não foi recusada. Com `100`, quase todas as sessões ficam retidas. Por predefinição é `70`. Ver [limiares de prova de vida do documento](https://docs.didit.me/pt/core-technology/id-verification/warnings-id-verification.md#configurar-limiares-de-prova-de-vida-do-documento). |
| `id_verification_injection_attack_action` | ação | Veredicto quando o documento, ou a selfie tirada para uma consulta de identificação, foi injetado em vez de capturado pela câmara do próprio dispositivo (`INJECTION_ATTACK_DETECTED`): uma câmara virtual de software, um feed de câmara gerado pela página ou pela automação do navegador, uma câmara com hook ou uma ferramenta de instrumentação ligada à aplicação. Valores: `DECLINE`, `REVIEW`, `NO_ACTION`. Por predefinição é `DECLINE`. Sinais que uma pessoa genuína pode produzir nunca o acionam. Na prova de vida e na correspondência facial, o risco segue, em vez disso, `frame_injection_action`. |
| `image_quality_too_low_action` | ação | Veredicto quando a qualidade geral da imagem do documento está abaixo do mínimo exigido. |
| `is_image_capture_review_screen_enabled` | booleano | Mostrar ao utilizador um ecrã de revisão após cada captura do documento, permitindo-lhe repetir a fotografia antes de ser submetida. Desativado por predefinição. |
| `is_ocr_id_verification_data_review_enabled` | booleano | Permitir ao utilizador rever e corrigir os dados de identidade extraídos antes de o passo ser concluído. Desativado por predefinição. Uma correção é comparada com `ocr_id_verification_data_review_critical_fields`, e uma discrepância aciona a ação crítica ou a ação menor, conforme o caso. A revisão continua a ser executada quando o fluxo inclui NFC - uma leitura posterior do chip substitui-a simplesmente. |
| `ocr_id_verification_data_review_critical_fields` | string\[] | Quais os campos de identidade extraídos que contam como críticos quando o utilizador edita o resultado do OCR, de modo que uma discrepância acione a ação crítica e não a menor. Formato: `["first_name" \| "last_name" \| "date_of_birth" \| ...]`. |
| `ocr_id_verification_data_review_critical_mismatch_action` | ação restrita | Veredicto quando a edição do utilizador discorda do OCR num campo crítico. |
| `ocr_id_verification_data_review_minor_mismatch_action` | ação | Veredicto quando a edição do utilizador discorda do OCR num campo não crítico. |
| `status_rules` | array | Regras de estado personalizadas (opcional). |

> [!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 definições ao nível da conta e **não** são aceites numa configuração de funcionalidades de fluxo: a API remove as chaves de configuração desconhecidas ao guardar, por isso enviá-las aí não tem efeito. Cada sinal tem um limiar de recusa e um limiar de análise, numa escala de `0` a `100` em que uma pontuação mais alta significa que o documento tem mais probabilidade de ser genuíno.

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 alfa-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 omitir assume o predefinido.

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

`wallet.on_failure` pode ser `fallback_to_document`, `decline` ou `retry`. `retry` (apenas para a carteira, com a captura de documentos desativada para o país) permite que um utilizador cuja autenticação não terminou no passo da carteira tente novamente; a sessão nunca é recusada por esse motivo e mantém-se aberta até o utilizador concluir ou até expirar. As opções de id\_lookup aceitam apenas `fallback_to_document` ou `decline`.

Para manter os documentos fora do primeiro ecrã e oferecê-los apenas quando uma carteira ou uma consulta não resulta, defina `document.fallback_only`. O exemplo usa a Finlândia, onde a Finnish Trust Network é a primeira opção e a captura de documentos é a alternativa. A Finlândia também precisa de ter os seus tipos de documento ativados em `documents_allowed` (por exemplo, passaporte e cartão de identidade), para que a alternativa tenha documentos para 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, por isso esta configuração é guardada tal como está escrita. O bloco da carteira foi deixado de fora deste exemplo de propósito: a configuração de uma carteira só é guardada num país em que o catálogo a marca como `available`, e `wallet.enabled: true` em qualquer outro lugar é rejeitado e faz falhar a gravação inteira, incluindo a configuração das consultas. Quando o catálogo marcar uma carteira como `available`, acrescente-a a esse país:

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

| Chave | Tipo | Predefinição | Descrição |
| - | - | - | - |
| `<ISO3>.document.enabled` | boolean | `true` | Se um documento fotografado é aceite neste país. Os documentos aceites continuam definidos em `documents_allowed`. |
| `<ISO3>.document.fallback_only` | boolean | `false` | Mantém a captura de documentos ativada, mas não a oferece no primeiro ecrã. Os utilizadores começam pela carteira ou pela consulta de ID do país, e só são encaminhados para a captura de documentos os utilizadores cuja autenticação na carteira falhe, seja cancelada ou exceda o tempo limite, ou cuja consulta não corresponda (de acordo com as opções `on_failure`, `on_partial_match`, `on_no_match` e `on_provider_error` definidas como `fallback_to_document`). Com uma única carteira, o utilizador é levado diretamente para essa carteira. Sem carteira, uma carteira ou consulta é apresentada lado a lado com a captura de documentos. Rejeitado com HTTP 400, a menos que `document.enabled` seja `true` e pelo menos uma carteira ou consulta de ID no país recorra à captura de documentos. |
| `<ISO3>.id_lookup.enabled` | boolean | `false` | Oferece a consulta sem documento a uma fonte oficial ou outra fonte fidedigna deste país. Rejeitado quando o catálogo não marca a fonte do país como `available`. |
| `<ISO3>.id_lookup.max_attempts` | integer | `1` | `1` a `5`. Quantas consultas **respondidas** o utilizador tem antes de a opção de recurso ser acionada. Um número de identificação que falhe a verificação de formato no cliente nunca chega ao registo, por isso não conta nem é faturado. |
| `<ISO3>.id_lookup.skip_liveness_and_face_match` | boolean | `true` | Depois de uma correspondência com um registo que devolve um retrato, ignora os passos de Prova de vida e de Correspondência facial do próprio fluxo, porque a consulta já executou a prova de vida passiva sobre a selfie e a comparou com esse retrato. Normalizado para `false` ao guardar, para uma fonte que não devolve retrato, onde a opção não teria significado. |
| `<ISO3>.id_lookup.on_partial_match` | `fallback_to_document` \| `decline` | `fallback_to_document` | O que acontece quando o registo respondeu, mas alguns campos não correspondem. |
| `<ISO3>.id_lookup.on_no_match` | `fallback_to_document` \| `decline` | `fallback_to_document` | O que acontece quando o registo respondeu e não tem nenhum registo correspondente. |
| `<ISO3>.id_lookup.on_provider_error` | `fallback_to_document` \| `decline` | `fallback_to_document` | O que acontece quando não foi possível contactar o registo. Nunca é faturado. |
| `<ISO3>.id_lookup.response_fields` | string\[] \| null | `null` | Subconjunto opcional das chaves dos campos de resposta da fonte. As chaves desconhecidas são rejeitadas e os campos obrigatórios da fonte são sempre acrescentados de volta, pelo que o valor guardado é sempre uma seleção válida. A implementação atual no ambiente de staging aplica esta seleção ao resultado da comparação, ao género opcional e aos retratos do registo retidos. Os campos de identidade obrigatórios mantêm-se. Consulte a nota sobre lançamento e retenção abaixo. |
| `<ISO3>.wallet.enabled` | boolean | `false` | Oferece o início de sessão com carteira de identidade digital neste país. |
| `<ISO3>.wallet.providers` | string\[] | `[]` | IDs de carteiras do catálogo aceites neste país, uma lista de aceitação e nunca um ranking. A ordem enviada é normalizada para a ordem do catálogo. É obrigatória pelo menos uma carteira quando `enabled` é `true`. Uma carteira que não seja oferecida no país, ou que ainda esteja marcada como em breve, é rejeitada. |
| `<ISO3>.wallet.on_failure` | `fallback_to_document` \| `decline` \| `retry` | `fallback_to_document` | O que acontece quando o início de sessão é cancelado, expira o tempo limite ou falha. `retry` mantém o utilizador no passo da carteira para tentar novamente (apenas carteira); é recusado em conjunto com `document.fallback_only`. |

Validação que a API aplica ao guardar:

* Um código de país desconhecido, uma chave desconhecida dentro de um país ou uma chave desconhecida dentro de um método é rejeitado; nada é descartado silenciosamente.
* Um país em que nenhum método esteja ativado é rejeitado: ninguém nesse país poderia ser verificado.
* Uma carteira ou consulta só pode recorrer à captura de documentos quando a captura de documentos está ativada nesse país. `fallback_to_document` num país onde `document.enabled` é `false` é recusado em tempo de execução, porque não há para onde recorrer.
* `document.fallback_only: true` é rejeitado com HTTP 400, a menos que `document.enabled` seja `true` e pelo menos uma carteira ou consulta de ID desse país recorra à captura de documentos.

> [!WARNING]
>
> A implementação atual no ambiente de staging aplica `id_lookup.response_fields` ao resultado da comparação, ao género opcional e aos retratos do registo retidos. Os campos de identidade obrigatórios continuam a fazer parte do registo de verificação. Isto não garante que todos os payloads intermédios do fornecedor fiquem excluídos do processamento. O lançamento em produção desta alteração não foi verificado; confirme o comportamento no ambiente de destino antes de depender da seleção de campos para requisitos de retenção.

Leia o catálogo de capacidades antes de escrever `methods`, através do separador **Países** da consola ou com a ferramenta MCP [`didit_workflow_get_id_verification_methods_catalog`](https://docs.didit.me/pt/integration/mcp/tools). O comportamento, a cobertura e a faturação estão em [Métodos de verificação de identidade](https://docs.didit.me/pt/core-technology/id-verification/verification-methods.md).

## NFC / Passaporte eletrónico

Valor da funcionalidade: `NFC`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `allow_nfc_skip` | booleano | Permite que os utilizadores ignorem a leitura NFC quando o documento suporta leitura do chip. |
| `skip_nfc_action` | ação | Ação quando o utilizador ignora a leitura NFC. |
| `unverified_chip_action` | ação | Ação quando a verificação do chip falha. |
| `trust_anchor_missing_action` | ação | Veredicto 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 da CSCA do país emissor não está carregada. |
| `jpki_request_attributes` | booleano | Cartão My Number do Japão ([JPKI](https://docs.didit.me/pt/core-technology/nfc-verification/overview.md#cartão-my-number-do-japão-jpki), apenas SDKs nativos): lê também o certificado de assinatura, que requer o PIN de assinatura do cartão e contém o nome, a data de nascimento, o sexo e a morada do titular, comparados com os dados da verificação de identidade. Predefinição `true`. `false` lê apenas o certificado de autenticação do utilizador (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` | ação | Veredicto quando um certificado do Cartão My Number não forma uma cadeia até à autoridade de certificação JPKI, está fora do seu período de validade ou não é um certificado de cartão do tipo pedido (`JPKI_CERTIFICATE_INVALID`). Predefinição `DECLINE`. |
| `jpki_signature_invalid_action` | ação | Veredicto quando a assinatura do Cartão My Number sobre o desafio de utilização única não é validada, pelo que a posse do cartão e o conhecimento do seu PIN não ficam comprovados (`JPKI_SIGNATURE_INVALID`). Predefinição `DECLINE`. |
| `jpki_certificate_revoked_action` | ação | Veredicto quando a verificação de revogação indica que um certificado do Cartão My Number foi revogado (`JPKI_CERTIFICATE_REVOKED`). Predefinição `DECLINE`. |
| `jpki_revocation_unchecked_action` | ação | Veredicto quando o Cartão My Number foi verificado, mas não estava disponível nenhuma resposta sobre revogação, pelo que não é possível excluir que um cartão revogado esteja em causa (`JPKI_REVOCATION_UNCHECKED`). Predefinição `REVIEW`. |
| `jpki_inconsistent_data_action` | ação | Veredicto quando o nome, a data de nascimento, o sexo ou a morada no certificado de assinatura do Cartão My Number são diferentes dos dados da verificação de identidade do mesmo cartão (`JPKI_AND_OCR_DATA_NOT_SAME`). Predefinição `REVIEW`. |
| `status_rules` | array | Regras de estado personalizadas, opcionais. |

## Prova de vida

Valor da funcionalidade: `LIVENESS`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `face_liveness_method` | cadeia de caracteres | Um de `ACTIVE_3D`, `FLASHING` ou `PASSIVE`. |
| `face_liveness_mode` | cadeia de caracteres | Substituição do modo de prova de vida. |
| `face_liveness_flash_mode` | cadeia de caracteres | Modo de flash para os métodos `ACTIVE_3D` e `FLASHING`. `"0"` (não estrito, predefinido) verifica que as cores apresentadas no ecrã se refletem no rosto do utilizador; `"1"` (estrito) exige, além disso, que os reflexos correspondam à sequência exata de cores apresentada, o que oferece maior proteção contra ataques de repetição e de injeção de vídeo, mas com mais rejeições falsas. |
| `face_liveness_score_decline_threshold` | inteiro | Limiar de recusa. |
| `face_liveness_score_review_threshold` | inteiro | Limiar de revisão. |
| `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 são detetados vários rostos. |
| `face_liveness_video_anomaly_action` | ação | Ação quando a gravação guardada contém uma sequência repetida de movimento. Predefinição `NO_ACTION`; `REVIEW` e `DECLINE` podem escalar de forma assíncrona uma verificação já decidida. Fotogramas fixos esparsos ou repetidos, por si 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 utilizador cuja captura foi considerada um ataque de prova de vida com elevada confiança (aviso `FACE_MATCHES_LIVENESS_ATTACK`). Aceita `NO_ACTION` ou `REVIEW`; `DECLINE` é aceite, mas aplicada como `REVIEW`, porque um utilizador legítimo pode ser rejeitado uma vez por engano e depois passar. Por predefinição, `NO_ACTION`. |
| `race_map_similarity_thresholds` | objeto | Limiares de semelhança por grupo demográfico. |
| `face_privacy_mode_enabled` | booleano | Ativa o modo de privacidade para os recursos faciais. |
| `face_quality_review_threshold` | inteiro | Limiar de revisão para a qualidade da imagem do rosto. |
| `face_quality_decline_threshold` | inteiro | Limiar de recusa para a qualidade da imagem do rosto. Tem de ser inferior ou igual ao limiar de revisão. |
| `face_luminance_min_threshold` | inteiro | Limiar mínimo de luminosidade. Tem de ser inferior a `face_luminance_max_threshold`. |
| `face_luminance_min_action` | ação | Ação quando a luminosidade é demasiado baixa. |
| `face_luminance_max_threshold` | inteiro | Limiar máximo de luminosidade. |
| `face_luminance_max_action` | ação | Ação quando a luminosidade é demasiado alta. |
| `face_liveness_max_attempts` | inteiro | Total de submissões de prova de vida por sessão, de `1` a `3`. O valor predefinido `3` corresponde a uma tentativa inicial e duas novas tentativas. Definir `1` não desativa as novas tentativas em caso de falhas de qualidade da 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 utilizador recebe sempre uma segunda tentativa com indicações úteis. |
| `cross_org_fraud_face_action` | ação | **Obsoleto e já não aplicado.** Tratava um rosto como se tivesse um veredito de fraude, o que uma identidade biométrica estável não pode ter. Continua a ser aceite para que os fluxos existentes continuem a validar. Utilize `cross_org_identity_claim_pattern_action`. |
| `cross_org_identity_claim_pattern_action` | ação | Veredito quando outras organizações da rede registaram eventos de reivindicação de identidade para esta mesma pessoa, nos quais a identidade reivindicada não correspondeu. Apenas Revisão ou Nenhuma ação; uma Recusa definida aqui é rebaixada para Revisão. Consulte [Reivindicações de identidade entre organizações](https://docs.didit.me/pt/core-technology/liveness/cross-organization-identity-claims.md). |
| `external_capture_device_action` | ação | Veredito quando é detetado um dispositivo de captura externo. |
| `face_audio_recording_enabled` | booleano | Grava o microfone durante a captura da selfie, para que um revisor possa ouvir a sessão. Desativado por predefinição. |
| `face_search_enabled` | booleano | Executa a [Pesquisa facial 1:N](https://docs.didit.me/pt/core-technology/face-search/overview.md#desativar-a-pesquisa-facial-automática) automática sobre a selfie: compara-a com utilizadores verificados anteriormente, com a lista de bloqueio facial e a lista de permissões, e guarda o seu template biométrico para correspondências posteriores. Ativado por predefinição. `false` ignora a pesquisa, não guarda nenhum template facial para este passo e deixa as ações de rosto duplicado sem nada a que reagir. |
| `face_liveness_uncertain_retry_enabled` | booleano | Apenas prova de vida ativa com 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, independentemente do veredito que o motor lhe tenha atribuído: o utilizador é informado de que o resultado não foi claro e é-lhe pedido que capture novamente, sempre, fora do orçamento de `face_liveness_max_attempts` (que continua a aplicar-se às capturas que o motor não conseguiu pontuar). Desativado por predefinição; o fluxo web ignora esta opção. |
| `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 utilizador correspondente indica uma data de nascimento diferente. A mesma pessoa com um documento diferente ou renovado não é assinalada. Predefinido para `REVIEW`. |
| `frame_injection_action` | ação | Veredito quando são detetados fotogramas injetados no vídeo. |
| `screen_capture_action` | ação | Veredito quando a selfie é uma fotografia de um ecrã. |
| `virtual_camera_action` | ação | Veredito quando é detetado o fluxo de uma câmara virtual. |
| `status_rules` | matriz | Regras de estado personalizadas opcionais. |

## Correspondência facial

Valor da funcionalidade: `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 submissões de correspondência facial por sessão, de `1` a `3`. O valor predefinido `3` corresponde a uma tentativa inicial e duas novas tentativas. |
| `face_match_not_computed_action` | ação restrita | Veredito quando não é possível calcular uma pontuação de correspondência facial (retrato ou selfie em falta). |
| `face_match_eyes_covered_action` | ação | Veredito quando a região dos olhos está coberta na selfie. A predefinição é `NO_ACTION`, que regista a evidência sem alterar o resultado da Correspondência facial. Este sinal ainda está a ser calibrado, pelo que funciona apenas em modo sombra até a região ser indicada como calibrada. Se definir `REVIEW` ou `DECLINE` agora, passa a produzir efeitos a partir desse momento. |
| `face_match_mouth_covered_action` | ação | Veredito quando a região da boca está coberta na selfie. Mesma predefinição `NO_ACTION` e mesma ressalva de calibração que `face_match_eyes_covered_action`. |
| `face_match_face_covered_action` | ação | Veredito quando o rosto no seu todo está coberto na selfie. Mesma predefinição `NO_ACTION` e mesma ressalva de calibração que `face_match_eyes_covered_action`. |
| `status_rules` | array | Regras de estado personalizadas, opcionais. |

## Estimativa de idade

Valor da funcionalidade: `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 no intervalo limítrofe. |
| `minimum_age_threshold` | inteiro | Idade mínima aceite, de `1` a `100`. |
| `borderline_minimum_age_threshold` | inteiro | Limite inferior do intervalo limítrofe, de `1` a `100`. |
| `borderline_maximum_age_threshold` | inteiro | Limite superior do intervalo limítrofe, de `1` a `100`. |
| `face_liveness_method` | string | Um de `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, predefinido) verifica se as cores projetadas no ecrã se refletem no rosto do utilizador; `"1"` (estrito) exige, além disso, que os reflexos correspondam à sequência exata de cores projetadas. |
| `face_liveness_score_decline_threshold` | número | Limiar de recusa para a verificação de prova de vida usada pela estimativa de idade. |
| `face_liveness_score_review_threshold` | número | Limiar de revisão para a 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 são detetados vários rostos. |
| `face_liveness_video_anomaly_action` | ação | Ação quando a gravação guardada contém uma sequência de movimento repetida. Predefinição `NO_ACTION`; `REVIEW` e `DECLINE` podem escalar de forma assíncrona uma verificação já decidida. Fotogramas fixos esparsos ou repetidos, por si só, não acionam esta regra. |
| `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 utilizador cuja captura foi considerada um ataque de prova de vida com elevada confiança (aviso `FACE_MATCHES_LIVENESS_ATTACK`). Aceita `NO_ACTION` ou `REVIEW`; `DECLINE` é aceite, mas aplicado como `REVIEW`, porque um utilizador legítimo pode ser rejeitado uma vez por engano e depois passar. Predefinição `NO_ACTION`. |
| `face_privacy_mode_enabled` | booleano | Ativa o modo de privacidade para os recursos 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 luminosidade. |
| `face_luminance_min_action` | ação | Ação quando a luminosidade é demasiado baixa. |
| `face_luminance_max_threshold` | inteiro | Limiar máximo de luminosidade. |
| `face_luminance_max_action` | ação | Ação quando a luminosidade é demasiado alta. |
| `face_liveness_max_attempts` | inteiro | Total de submissões de prova de vida por sessão, de `1` a `3`. A predefinição `3` corresponde a uma tentativa inicial e a duas novas tentativas. Definir `1` não desativa as novas tentativas em caso de falhas de qualidade da 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 utilizador tem sempre uma segunda tentativa com indicações práticas para corrigir a captura. |
| `external_capture_device_action` | ação | Veredicto quando é detetado um dispositivo de captura externo. |
| `face_audio_recording_enabled` | booleano | Grava o microfone durante a captura da selfie, para que um revisor possa ouvir a sessão. Desativado por predefinição. |
| `face_search_enabled` | booleano | Executa a [Pesquisa facial 1:N](https://docs.didit.me/pt/core-technology/face-search/overview.md#desativar-a-pesquisa-facial-automática) automática sobre a selfie: compara-a com utilizadores verificados anteriormente, com as listas de bloqueio e de rostos permitidos, e guarda o seu template biométrico para comparações futuras. Ativado por predefinição. `false` ignora a pesquisa, não guarda nenhum template facial para este passo e deixa as ações relativas a rostos duplicados sem nada sobre o qual atuar. |
| `face_liveness_uncertain_retry_enabled` | booleano | 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, independentemente do veredicto que o motor lhe tenha atribuído: o utilizador é informado de que o resultado não foi claro e é convidado a capturar novamente, sempre, sem contar para o limite de `face_liveness_max_attempts` (que continua a aplicar-se às capturas que o motor não conseguiu pontuar). Desativado por predefinição; o fluxo web ignora-o. |
| `face_liveness_duplicated_face_name_mismatch_action` | ação | Veredicto quando um rosto duplicado é encontrado com um nome diferente. |
| `face_liveness_duplicated_face_document_mismatch_action` | ação | Veredicto quando um rosto duplicado é encontrado e o documento de identidade do utilizador correspondente indica uma data de nascimento diferente. A mesma pessoa num documento diferente ou renovado não é sinalizada. Predefinido para `REVIEW`. |
| `frame_injection_action` | ação | Veredicto quando são detetados fotogramas injetados no vídeo. |
| `screen_capture_action` | ação | Veredicto quando a selfie é uma fotografia de um ecrã. |
| `virtual_camera_action` | ação | Veredicto quando é detetada uma transmissão de câmara virtual. |
| `status_rules` | array | Regras de estado personalizadas, opcionais. |

## Verificação de telefone

Valor da funcionalidade: `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 novas tentativas de envio, de `1` a `5`. |
| `phone_max_check_attempts` | inteiro | Número máximo de tentativas de verificação do OTP, de `1` a `5`. |
| `phone_verification_countries` | objeto | Código de país ISO2 para a configuração do canal. 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 fornecedor de entrega bloqueia o envio do OTP. Apenas `DECLINE` ou `REVIEW`; predefinido `DECLINE`. Aplicada apenas quando todos os bloqueios do passo têm `risk_factors` exatamente iguais a `["device_attribute"]`; qualquer outro fator de risco, qualquer combinação que inclua esse fator, ou a ausência de fatores de risco, resulta em recusa, independentemente desta definição. |
| `phone_shared_device_mode` | booleano | Permite o modo de verificação de telefone em dispositivo partilhado. |
| `phone_enrichment_enabled` | booleano | Ativa o enriquecimento de inteligência do telefone (risco do tipo de linha, índice de confiança, operadora, histórico de portabilidade / troca de SIM, pontuação de risco de fraude). **Faturado 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 mais alta, maior o risco) que aciona `phone_intelligence_score_action`. Predefinido `80`. |
| `phone_type_risk_action` | ação | Ação quando o número é sinalizado como um tipo de número de telefone de alto risco. |
| `recent_port_action` | ação | Ação quando o número foi portado recentemente (sinal de portabilidade / troca de SIM). |
| `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 mais baixo, maior o risco) igual ou inferior ao qual se aplica `low_phone_trust_action`. Predefinido `30`. |
| `phone_social_enabled` | booleano | Ativa a verificação da presença em redes sociais: em que plataformas de mensagens, redes sociais, comércio eletrónico e plataformas profissionais o número verificado está registado. **Faturado 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 da presença em redes sociais não encontra o número registado em nenhuma das plataformas que cobre, um sinal comum de identidade sintética. Predefinido `NO_ACTION`. |
| `cross_org_fraud_phone_action` | ação | Veredicto quando este número foi sinalizado como fraudulento por outra organização da rede. |
| `status_rules` | array | Regras de estado personalizadas opcionais. |

A Verificação de telefone fica desativada até que a organização conclua o primeiro carregamento de saldo.

> [!NOTE]
>
> O enriquecimento de inteligência do telefone é um complemento opcional. Quando `phone_enrichment_enabled` está `true`, cada verificação de telefone concluída é enriquecida com inteligência do telefone e **faturada a \$0.05 por pedido**, além do custo padrão da verificação de telefone. As ações baseadas na pontuação só são aplicadas quando a pontuação de enriquecimento estiver disponível; as ações de índice de confiança, tipo de telefone e portabilidade são aplicadas assim que o enriquecimento é executado.
>
> A verificação da presença em redes sociais é um segundo complemento, separado. Quando `phone_social_enabled` está `true`, cada verificação de telefone concluída também indica em que plataformas online o número está registado (mensagens, redes sociais, comércio eletrónico e serviços profissionais) e é **faturada a \$0.05 por pedido**. Pode ser ativada com ou sem `phone_enrichment_enabled`: os dois complementos têm preço e faturação independentes. Uma consulta que não encontra o número em nenhuma das plataformas que cobre é uma resposta válida e faturável, e aciona `phone_no_social_presence_action`. Utilize `phone.social_profiles_registered` (o número de plataformas em que o número está registado) para criar ramificações com base no resultado num grafo do fluxo.

## Verificação de e-mail

Valor da funcionalidade: `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 | Utiliza códigos alfanuméricos para o e-mail. |
| `breached_email_action` | ação | Ação para e-mails comprometidos. |
| `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 com informação de e-mail (capacidade de entrega, reputação do domínio, exposição em violações de dados, pontuação de risco de fraude). **Cobrado \$0.05 por verificação** para 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 mais alta, maior o risco) que aciona `email_intelligence_score_action`. Predefinição `80`. |
| `recent_email_breach_action` | ação | Ação quando o e-mail aparece numa violação de dados conhecida e recente. |
| `frequent_email_breach_action` | ação | Ação quando o e-mail aparece em várias violações de dados conhecidas. |
| `email_social_enabled` | booleano | Ativa a verificação da presença online: em que plataformas de e-mail, redes sociais, profissionais, de comércio eletrónico e de entretenimento está registado o endereço verificado. **Cobrado \$0.05 por verificação** para 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 da presença online não encontra o endereço registado em nenhuma das plataformas abrangidas, um sinal habitual de identidade sintética. Predefinição `NO_ACTION`. |
| `cross_org_fraud_email_action` | ação | Veredicto quando este endereço foi sinalizado como fraudulento por outra organização da rede. |
| `status_rules` | array | Regras de estado personalizadas, opcionais. |

> [!NOTE]
>
> O enriquecimento com informação de e-mail é um complemento opcional. Quando `email_enrichment_enabled` está `true`, cada verificação de e-mail concluída é enriquecida com informação de e-mail e **é cobrada \$0.05 por pedido**, para além do custo habitual da verificação de e-mail. A ação baseada na pontuação entra em vigor assim que a pontuação de enriquecimento estiver disponível; as ações de violação de dados aplicam-se logo que o enriquecimento é executado.
>
> A verificação da presença online é um segundo complemento, separado. Quando `email_social_enabled` está `true`, cada verificação de e-mail concluída indica também em que plataformas online o endereço está registado (serviços de e-mail, redes sociais, serviços profissionais, de comércio eletrónico e de entretenimento) e **é cobrada \$0.05 por pedido**. Pode ser ativada com ou sem `email_enrichment_enabled`: os dois complementos têm preço e faturação independentes. Uma consulta que não encontra o endereço em nenhuma das plataformas abrangidas é uma resposta válida e cobrável e aciona `email_no_social_presence_action`. Utilize `email.social_profiles_registered` (o número de plataformas em que o endereço está registado) para criar uma ramificação com base no resultado num grafo de fluxo.

## Validação de base de dados

Valor da funcionalidade: `DATABASE_VALIDATION`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `database_validation_countries` | objeto | Código de país ISO3 para `{ "services": ["service_id"] }`. Utilize os IDs de serviço do catálogo de Validação de base de dados. |
| `database_validation_partial_match_action` | ação | Ação a executar quando a validação de base de dados devolve uma correspondência parcial. |
| `database_validation_no_match_action` | ação | Ação a executar quando a validação de base de dados não devolve qualquer correspondência. |
| `database_validation_not_applicable_action` | ação | Ação a executar quando a validação de base de dados não pode ser executada porque o documento não contém o identificador que os serviços configurados exigem (por exemplo, um passaporte sem número de identificação nacional). Por predefinição é `NO_ACTION`. |
| `database_validation_field_sources` | objeto | Onde ler uma entrada da base de dados que nenhum passo 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ó de questionário para `questionnaire`, e `expected_details.<field>` ou `metadata.<key>` para `expected_data`. As correspondências exatas de chave com um passo anterior são resolvidas automaticamente e não são guardadas de propósito, para que renomear um campo do Document AI nunca fixe uma associação obsoleta na configuração. Uma entrada mal formada é rejeitada com um `400` que indica o campo de entrada em causa. 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 estado 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` é o que faz este passo executar alguma coisa. Uma funcionalidade `DATABASE_VALIDATION` guardada sem este campo é aceite e depois não executa verificação alguma, por isso envie sempre pelo menos um país com pelo menos um ID de serviço.

Um ID de serviço que o passo não consegue executar é rejeitado com um `400` que o indica e explica o motivo, e nada é guardado. Isto 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 através do [`POST /v3/database-validation/`](https://docs.didit.me/pt/core-technology/database-validation/overview) autónomo.
Um serviço cujas entradas nenhum passo anterior fornece é rejeitado da mesma forma, com a lista das entradas em falta.
Um serviço que o fluxo guardado já inclui mas que já não consegue executar é removido quando voltar a guardar o fluxo.

Por exemplo, este fluxo da Argentina lê o número de DNI e o género a partir da Verificação de identidade e verifica-os na 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"]}}}
    }
  ]
}
```

Utilize `arg_renaper` em alternativa, após um passo `LIVENESS`, para também comparar a selfie com a fotografia que a RENAPER detém.
Consulte a [RENAPER](https://docs.didit.me/pt/api-reference/database-validation/argentina/renaper.md) para a pontuação de correspondência facial e o respetivo limiar.

## Verificação bancária

Valor da funcionalidade: `BANK_VERIFICATION`.

O utilizador verifica uma conta bancária, e o titular da conta indicado pelo banco é comparado com a identidade que um passo anterior do fluxo estabeleceu. O utilizador faz isto por um de dois métodos: início de sessão no banco (`open_banking`), em que inicia sessão no seu banco, ou verificação de conta (`account_lookup`), em que introduz os dados da conta e o banco confirma o nome associado. `bank_method_order` e o `methods` de cada país escolhem quais os métodos que um país oferece e qual vem primeiro; veja [Métodos de verificação bancária](https://docs.didit.me/pt/core-technology/bank-verification/verification-methods.md). O passo produz evidências: uma pontuação do nome do titular, a comparação que a gerou e os códigos de motivo. As chaves `bank_*_action` transformam essas evidências num estado.

Dois fatores determinam se o nó faz alguma coisa. `bank_countries` é uma lista de permissões, pelo que um mapa vazio não oferece nenhum banco e não executa nenhuma verificação. Além disso, o titular precisa de algo com que ser comparado: coloque antes do nó um passo `OCR`, `DATABASE_VALIDATION` ou `QUESTIONNAIRE`, envie `expected_details` na criação da sessão ou mapeie os campos por si com `bank_field_sources`. Sem nada disso, a propriedade só pode ser `unknown`, decisão que cabe a `bank_reference_identity_missing_action`.

> [!NOTE]
>
> A verificação bancária ainda está a ser implementada, por isso um nó `BANK_VERIFICATION` só é aceite numa conta onde tenha sido ativado. Em todas as outras, a gravação é rejeitada e o sistema indica-o. Também não é aqui que se configura a rota que executa o passo: isso é definido pelo par `provider_key` e `fallback_to_native` que o [Marketplace](https://docs.didit.me/pt/console/marketplace.md) da consola define para si.

### Ligar uma conta

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `bank_countries` | object | Em que países o utilizador pode associar uma conta bancária. Uma lista de permissões: um mapa vazio significa que o nó não oferece nada e não executa nada. `institutions` restringe o seletor a IDs de instituições específicas; `"all"` oferece todos os bancos do país com capacidade de identificação. Um país que não é servido por nenhuma rota do nó é mantido: oferece apenas as suas alternativas e a opção Continuar sem o seu banco, veja [Quando a pessoa não consegue verificar o seu banco](https://docs.didit.me/pt/core-technology/bank-verification/fallbacks.md). Um código que não corresponde a nenhum país é recusado na gravação. `methods` define quais dos métodos, início de sessão no banco (`open_banking`) e verificação de conta (`account_lookup`), o país oferece, e por que ordem, de acordo com `bank_method_order`: o utilizador começa pelo primeiro e recebe o segundo como alternativa. Um país ativo cujo `methods` indica um método que nenhuma rota do nó serve nesse país é recusado na gravação, e também é recusado um país servido por uma rota mas que `methods` deixa sem 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 o passo oferece e por que ordem, em todos os países que não definem um `methods` próprio: `open_banking` (início de sessão no banco: o utilizador inicia sessão no seu banco, e só este método lê saldos, transações e rendimentos) e `account_lookup` (verificação de conta: sem início de sessão, apenas a propriedade). Em cada país, o utilizador começa pelo primeiro método que uma rota serve nesse país e recebe o outro como alternativa; um método que nenhuma rota serve num país fica de fora desse país. Pelo menos um método. Uma gravação que não envie nenhum recebe `["open_banking", "account_lookup"]`, a menos que envie `bank_open_banking_enabled` ou `bank_account_lookup_enabled`, caso em que estes definem a ordem. |
| `bank_scopes` | object | O que o utilizador é convidado a autorizar que seja partilhado. `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 cada um faturado à parte, e são recusados na gravação, salvo se a sua aplicação tiver a autorização para dados financeiros. Só o início de sessão no banco lê dados: um país que oferece a verificação de conta não é recusado, e um utilizador que verifica por verificação de conta passa sem os dados, o que o resultado indica em `financial_data.not_collected`. Um âmbito desativado nunca é pedido, pelo que o banco nunca o mostra no seu ecrã de consentimento. Por defeito, apenas `ownership`. Formato: `{"ownership": true, "identifiers": true\|false, "balances": true\|false, "transactions": true\|false, "income": true\|false}`. |
| `bank_eligible_account_types` | string\[] | Que tipos de conta o utilizador 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 estabelecem a propriedade de uma conta de pagamento. Por defeito, current e checking. |
| `bank_account_selection` | string | `user` permite ao utilizador escolher qual das contas ligadas é verificada; `auto` escolhe a primeira elegível. |
| `bank_require_oauth_only` | boolean | Oferece apenas instituições acessíveis através de OAuth ou de uma comunicação entre aplicações, nunca um ecrã legado de captura de credenciais. Em mercados onde o open banking já torna o OAuth a única via, isto não altera nada. |
| `bank_max_attempts` | integer | Quantas tentativas de início de sessão no banco o utilizador tem, de `1` a `5`; um micro-depósito ou um envio de extrato também gasta uma. A verificação de conta tem o seu próprio `bank_account_check_max_attempts`. Quando todas as formas de verificar o utilizador que ainda são oferecidas, incluindo o envio de extrato, tiverem gasto as suas tentativas sem uma ligação bem-sucedida, decide `bank_attempts_exhausted_action`. |
| `bank_connection_timeout_minutes` | integer | Quanto tempo uma ligação iniciada permanece aberta antes de a tentativa ser abandonada, de `5` a `60` minutos. |
| `bank_allow_skip` | boolean | Substituído por `bank_continue_without_bank`: o utilizador pode agora sempre continuar sem banco. Durante uma versão, é lido numa gravação que não envie `bank_continue_without_bank`: `true` define `from_start`, qualquer outro valor define `when_needed`. Cada gravação o reescreve: `true` para `from_start`, `false` para `when_needed`. |

### Quando o utilizador não consegue verificar

O utilizador pode sempre continuar sem banco, e o passo nunca o deixa bloqueado. Veja [Quando a pessoa não consegue verificar o seu banco](https://docs.didit.me/pt/core-technology/bank-verification/fallbacks.md).

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `bank_continue_without_bank` | string | Quando o passo mostra **Continue without your bank**. `when_needed`, o valor predefinido, mostra-o uma vez quando nenhum método funciona para o país ou banco do utilizador, quando o banco do utilizador não pode ser contactado e nenhum outro método o conseguiu verificar, por exemplo porque a verificação da conta também não conseguiu contactar o banco, ou quando o utilizador indica que não tem banca online. `from_start` mostra-o também no primeiro ecrã. Não pode ser desativado. Uma gravação que não envie nem esta chave nem `bank_allow_skip` fica com `when_needed`. |
| `bank_statement_standalone_enabled` | boolean | Com `bank_statement_enabled`, oferece também o carregamento do extrato quando não houve nenhuma tentativa bancária, em qualquer país, incluindo um país que nenhuma rota de autenticação bancária ou de verificação de conta sirva. Nesse caso é faturado de forma autónoma, como `bank_statement_upload`, a USD 0.20 por extrato avaliado, antes da sua tarifa contratual ou do preço especial: consulte [Preços](https://docs.didit.me/pt/core-technology/bank-verification/fallbacks.md#preços). As sessões de sandbox podem testá-lo sem faturação. Ativado por predefinição. |

O que a continuação significa para a sessão é `bank_unsupported_action`, `bank_attempts_exhausted_action` ou `bank_skipped_action`, consoante o motivo pelo qual o utilizador continuou, exceto se uma tentativa avaliada antes já tiver decidido o passo: consulte [Ações do veredicto](#ações-de-decisão).

### Comparar o titular

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `bank_reference_identity` | string | Qual o passo anterior que fornece a identidade com que o titular é comparado: `kyc` (Verificação de identidade), `database_validation`, `expected_details` (o que enviou na criação da sessão), `questionnaire`, ou `auto` para usar aquele que o fluxo tiver produzido. O passo que efetivamente a forneceu é devolvido no resultado como `reference_identity_source`. |
| `bank_field_sources` | object | Onde ler um campo da identidade de referência quando nenhum passo anterior do grafo o consegue preencher. A CHAVE do mapa é uma de `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ó de 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 efetivamente contenha: `address`, `country`, `date_of_birth`, `first_name`, `gender`, `id_country`, `identification_number`, `ip_address`, `last_name`, `nationality` ou `poa_country`. Uma entrada mal formada é recusada ao guardar, 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 | Com esta pontuação ou uma superior, o nome do titular é considerado uma correspondência. `50` a `100`, por predefinição `85`. |
| `bank_partial_match_floor` | integer | Abaixo desta pontuação, o nome do titular é considerado sem correspondência. `0` a `99`, por predefinição `70`. A faixa entre o limite inferior e o limiar é a correspondência parcial, pelo que o limite inferior tem de ficar estritamente abaixo do limiar, caso contrário a gravação é recusada. Um `null` explícito significa aqui "usar o valor predefinido", e é por isso que um limiar de `50` sem limite inferior é recusado: é verificado como `50` contra o limite inferior predefinido de `70`. |
| `bank_require_address_match` | boolean | Exige também que a morada do titular corresponda. Um nome que atingiu o limiar, mas cuja morada obtém uma pontuação abaixo dele, passa a correspondência parcial. Uma instituição que não devolve morada dispensa este requisito; uma sessão sem morada própria para comparar não o dispensa e fica numa correspondência parcial. Desativado por predefinição. |
| `bank_use_provider_score` | boolean | Lê também a pontuação do nome do titular da própria instituição e deixa-a decidir quando for superior à da Didit ou quando a Didit não tinha nenhum nome de titular para pontuar. Um resultado decidido dessa forma indica `provider_only` como método de correspondência, e uma ligação que não devolveu essa pontuação regista um aviso `provider_score_unavailable`. Ativado por predefinição. |
| `bank_show_match_result_to_user` | boolean | Mostra ao utilizador, dentro do fluxo de verificação, o resultado da propriedade. Desativado significa que fica registado na sessão, mas nunca é mostrado ao utilizador. |

### Verificação de conta

Estas chaves aplicam-se apenas à verificação de conta. A autenticação bancária mantém as suas correspondências aproximadas e o seu próprio `bank_max_attempts`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `bank_account_check_accept_close_match` | boolean | Quando ativada (por predefinição), esta opção considera que um nome ao qual o banco atribua uma pontuação entre `bank_partial_match_floor` e `bank_name_match_threshold` é uma correspondência aproximada: o utilizador confirma o nome que o banco tem registado quando `bank_suggest_holder_name` está ativado, e `bank_partial_match_action` decide. Quando desativada, essa correspondência aproximada conta como sem 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 utilizador tem, de `1` a `5`, sendo `3` quando não definido: quantas vezes pode introduzir os dados da conta para uma verificação a que o banco responda. Um contador separado de `bank_max_attempts`. Uma verificação recusada tal como foi introduzida (um IBAN inválido) ou uma a que o banco não consegue responder não consome nenhuma tentativa. |

### Dados financeiros

`bank_expected_currencies` funciona apenas com o consentimento predefinido `ownership`. As outras três chaves leem dados financeiros reais, pelo que cada uma precisa do âmbito de consentimento correspondente em `bank_scopes`, e a gravação é recusada 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 uma; uma divergência é comunicada através de `bank_currency_mismatch_action`. |
| `bank_min_balance` | number | Saldo disponível mínimo, na própria moeda da conta. Abaixo dele, dispara `bank_low_balance_action`. Requer o âmbito `balances`. `0` é um limite real e não é o mesmo que omitir a chave: uma conta a descoberto dispara a ação. Essa ação tem por predefinição `NO_ACTION`, que deixa o veredicto inalterado, pelo que recusar uma conta a descoberto exige também `bank_low_balance_action: "DECLINE"`. |
| `bank_transactions_history_days` | integer | Até onde o histórico de transações é lido, de `30` a `365` dias. Por predefinição, `90`. Requer o âmbito `transactions`. |
| `bank_refresh_enabled` | boolean | Voltar a obter os dados financeiros da conta depois de o passo já ter sido decidido, enquanto o consentimento bancário se mantiver válido. Requer pelo menos um dos âmbitos `balances`, `transactions` ou `income`. Se o consentimento expirar depois, aplica-se a ação definida em `bank_consent_expired_action`. |

### O que é armazenado

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `bank_store_full_identifiers` | boolean | Guardar os identificadores da conta sem mascarar, em vez de mascarados. Requer o âmbito `identifiers`. Mesmo assim, a forma não mascarada só é devolvida a um chamador que tenha a permissão de leitura da verificação bancária. |
| `bank_store_raw_owner_data` | boolean | Manter os dados do titular devolvidos pela instituição junto da prova de propriedade. Desativado, guarda-se apenas a comparação em si: pontuações, método de correspondência e códigos de motivo. |

### Ações de decisão

Cada chave aqui aceita `DECLINE`, `REVIEW` ou `NO_ACTION`, exceto quando estiver marcada como restrita, e recorre à predefinição abaixo quando a omite ou envia `null`. Nada que não seja prova positiva de propriedade é aprovado por predefinição, e só a prova demonstrável contra o utilizador leva à recusa.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `bank_no_match_action` | ação restrita | Decisão quando o titular da conta é demonstravelmente diferente da pessoa verificada - a melhor pontuação do nome está abaixo de `bank_partial_match_floor`. Use `DECLINE` ou `REVIEW`. Por predefinição, `DECLINE`. |
| `bank_partial_match_action` | ação | Decisão quando o nome do titular fica entre `bank_partial_match_floor` e `bank_name_match_threshold`. Por predefinição, `REVIEW`, e nunca aprova por predefinição. |
| `bank_not_verifiable_action` | ação | Decisão quando a instituição se ligou, mas não devolveu nenhuma identidade do titular para comparar. Por predefinição, `REVIEW`. |
| `bank_unknown_action` | ação | Decisão quando a prova não pôde ser obtida depois das novas tentativas - uma falha transitória. Por predefinição, `REVIEW`. |
| `bank_reference_identity_missing_action` | ação | Decisão quando nenhum passo anterior produziu uma identidade com que comparar o titular, pelo que a propriedade só pode ser `unknown`. Por predefinição, `REVIEW`. |
| `bank_joint_account_action` | ação | Decisão quando a conta tem mais do que um titular. Por predefinição, `NO_ACTION`. |
| `bank_business_account_action` | ação | Decisão quando a instituição classifica o titular como empresa e não como pessoa. Por predefinição, `REVIEW` num fluxo de pessoa singular, e `NO_ACTION` num fluxo de empresa (KYB), onde se espera que o titular seja uma empresa. |
| `bank_unsupported_action` | ação | Decisão quando o utilizador continua sem banco porque nenhum método consegue verificar o seu país ou banco: nenhuma rota de início de sessão bancário ou de verificação de conta serve o país, ou o banco escolhido não pode ser usado neste passo. O resultado fica então com `continued_without_bank` a true e `NOT_COVERED` nos códigos de motivo. Por predefinição, `REVIEW`. |
| `bank_skipped_action` | ação restrita | Decisão quando o utilizador escolheu Continuar sem o seu banco, existindo uma forma de verificação disponível. O resultado fica então com `continued_without_bank` a true e `SKIPPED` nos códigos de motivo. Use `DECLINE` ou `REVIEW`. Por predefinição, `REVIEW`. |
| `bank_attempts_exhausted_action` | ação restrita | Decisão quando o utilizador esgotou as tentativas de cada forma de verificação que ainda lhe é oferecida, 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 ligação bem-sucedida, também quando depois continua sem banco. Use `DECLINE` ou `REVIEW`. Por predefinição, `DECLINE`. |
| `bank_consent_expired_action` | ação | Decisão quando o consentimento bancário expira depois de o passo já ter sido decidido. Só faz sentido com `bank_refresh_enabled`. Por predefinição, `NO_ACTION`. |
| `bank_currency_mismatch_action` | ação | Decisão quando a moeda da conta não está em `bank_expected_currencies`. Por predefinição, `NO_ACTION`. |
| `bank_country_mismatch_action` | ação | Decisão quando o país da instituição é diferente do país esperado ou do país do documento. Por predefinição, `NO_ACTION`. |
| `bank_low_balance_action` | ação | Decisão quando o saldo disponível está abaixo de `bank_min_balance`. Requer o âmbito `balances`. Por predefinição, `NO_ACTION`. |
| `status_rules` | array | Regras de estado personalizadas, opcionais. |

### Mais controlos

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 | Decisão quando o passo termina sem correspondência, porque a pessoa saiu do banco e nunca voltou (uma tentativa expirou). |
| `bank_account_age_action` | ação | Decisão quando a conta é mais recente do que `bank_account_age_days`, um padrão comum de contas-mula. |
| `bank_account_age_days` | integer | Uma conta cujo histórico começa há menos de tantos dias é considerada nova. De 1 a 365, por predefinição 30. Lido a partir do histórico de transações, por isso só com o âmbito `transactions`. |
| `bank_account_lookup_enabled` | boolean | Descontinuado: use `bank_method_order` e `bank_countries.<ISO3>.methods`. É lido durante uma única versão, a partir de uma gravação que não envia `bank_method_order`: com `bank_open_banking_enabled`, define a ordem, com a verificação de conta depois do início de sessão bancário quando estiver ativa, e fica de fora quando está desativada ou não definida. Cada gravação a escreve de volta como indicação de se algum país oferece a verificação de conta. |
| `bank_account_type_action` | ação | Decisão quando a conta verificada é uma conta poupança. |
| `bank_address_match_threshold` | integer | Com esta pontuação ou acima, considera-se que a morada do titular corresponde. De 50 a 100, por predefinição 70. Só é lido com `bank_require_address_match`. |
| `bank_address_mismatch_action` | ação | Decisão quando a morada do titular é diferente, o que transforma uma correspondência numa correspondência aproximada. Só com `bank_require_address_match`. |
| `bank_auto_add_countries` | boolean | Oferecer todos os países que uma rota deste nó consegue servir, incluindo os acrescentados depois de o nó ser guardado, exceto os países que `bank_countries` desativa. Desativado quando a chave está ausente, para que um nó existente nunca se alargue por conta própria. |
| `bank_cash_flow_action` | action | Veredicto quando o dinheiro entra e sai logo a seguir, ou quando entram muitas transferências pequenas (fluxo de caixa de passagem). Requer o âmbito `transactions`. |
| `bank_dob_match_enabled` | boolean | Compara a data de nascimento do titular, quando o banco a partilha, com a data verificada. Uma divergência nunca altera o resultado de propriedade: dispara `bank_dob_mismatch_action`. Ativo por predefinição. |
| `bank_dob_match_threshold` | integer | A partir desta pontuação a data de nascimento coincide, de 50 a 100, por predefinição, com o valor 70. Uma data é do mesmo dia ou não, pelo que a pontuação é 100 ou 0. |
| `bank_dob_mismatch_action` | action | Veredicto quando a data de nascimento do titular difere. Apenas com `bank_dob_match_enabled`. |
| `bank_email_match_enabled` | boolean | Compara o e-mail registado no banco com o e-mail verificado da sessão. Uma divergência dispara `bank_email_mismatch_action`. Desativado por predefinição. |
| `bank_email_match_threshold` | integer | A partir desta pontuação, o e-mail coincide. A pontuação varia entre 50 e 100 e o valor predefinido é 70. |
| `bank_email_mismatch_action` | action | Veredicto quando o e-mail do titular difere. Apenas com `bank_email_match_enabled`. |
| `bank_evidence_retention_days` | integer | Elimina as provas bancárias este número de dias após o veredicto: 30, 90, 365 ou 1825. Nulo mantém-nas com a sessão. São eliminados: os dados do titular, a identidade com a qual foram comparados, os identificadores da conta, os dados financeiros e um extrato carregado; uma ligação ainda ativa é revogada. O veredicto, as pontuações e os códigos de motivo mantêm-se. Eliminar a sessão elimina tudo, o que acontecer primeiro. |
| `bank_fallback_used_action` | action | Veredicto quando a conta foi verificada com micro-depósitos ou carregamento de extrato. |
| `bank_match_any_holder` | boolean | Uma conta conjunta ou com cotitulares coincide quando QUALQUER titular listado corresponde à pessoa. Desativado: só o primeiro titular listado pelo banco pode coincidir. Ativo por predefinição. |
| `bank_microdeposits_enabled` | boolean | Oferece micro-depósitos como alternativa: dois pequenos depósitos chegam à conta e a pessoa introduz os valores. Oferecido apenas num país cuja rota os possa enviar, após uma tentativa de verificação bancária cobrada na mesma sessão. Incluído sem custo adicional; o cliente paga o preço da rota uma vez. As sessões de sandbox podem testá-lo sem faturação. O titular é o nome verificado na sessão, que a pessoa declara ser o da conta; por isso, uma conta verificada regista um aviso `holder_declared`. Ativo por predefinição. |
| `bank_mule_score_action` | action | Veredicto quando a pontuação mule é igual ou superior a `bank_mule_score_threshold`. |
| `bank_mule_score_threshold` | integer | A partir desta pontuação mule, de 0 a 100, `bank_mule_score_action` é disparado; a predefinição é 70. A pontuação combina uma conta nova, fluxo de caixa de passagem, saldo esgotado e muitas pequenas transferências recebidas, com base no histórico de transações (o âmbito `transactions`). |
| `bank_open_banking_enabled` | boolean | Obsoleto: use `bank_method_order` e `bank_countries.<ISO3>.methods`. É lido durante uma única versão, a partir de uma gravação que não envie `bank_method_order`: com `bank_account_lookup_enabled`, define a ordem e inclui o início de sessão bancário quando está ativo ou não definido. Cada gravação volta a guardá-lo como indicação de se algum país oferece início de sessão bancário. |
| `bank_phone_match_enabled` | boolean | Compara o telefone registado no banco com o telefone verificado da sessão. Uma divergência dispara `bank_phone_mismatch_action`. Desativado por predefinição. |
| `bank_phone_match_threshold` | integer | A partir desta pontuação, o telefone coincide. A pontuação varia entre 50 e 100 e o valor predefinido é 70. |
| `bank_phone_mismatch_action` | action | Veredicto quando o telefone do titular difere. Apenas com `bank_phone_match_enabled`. |
| `bank_popular_mode` | string | `auto` (a predefinição) ordena os bancos populares pelo número de ligações efetuadas pelas pessoas no país; `manual` mostra em vez disso os `popular_institutions` de cada país, em `bank_countries`, pela respetiva ordem. |
| `bank_statement_document_checks_action` | action | Veredicto quando um extrato carregado apresenta indícios de edição ou adulteração. Predefinido para `REVIEW`. |
| `bank_statement_enabled` | boolean | Oferece o carregamento de um 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 nome do titular fornecido pelo banco. Incluído sem custo adicional após uma tentativa de verificação bancária cobrada na mesma sessão. Com `bank_statement_standalone_enabled` é também oferecido sem tentativa bancária anterior, em qualquer país, e cobrado à parte. As sessões de sandbox podem testá-lo sem faturação. Desativado por predefinição. |
| `bank_suggest_holder_name` | boolean | Numa correspondência aproximada, mostra à pessoa o nome em que o banco tem a conta e pede-lhe que confirme que é seu ou que ligue outra conta. A resposta fica registada como `holder_confirmation`; confirmar termina o passo com `bank_partial_match_action`. Ativo por predefinição. |
| `fallback_to_native` | boolean | Indica se uma ligação de marketplace que não possa ser estabelecida recorre à rota nativa da Didit. Desativado por predefinição: uma alternativa silenciosa gastaria o seu saldo Didit numa sessão que esperava correr com o seu próprio contrato com o fornecedor. Uma ligação alternativa fica registada como `credential_source = native` e é cobrada ao preço nativo. |
| `provider_key` | string | Qual a rota que executa o passo. Vazio (a predefinição) é a Bank Verification nativa da Didit, um produto independente do fornecedor que a Didit encaminha para o fornecedor regional de open banking que serve o país e a instituição do utilizador, com os contratos e a faturação da Didit. Um valor indica um fornecedor MARKETPLACE cujas credenciais próprias foram associadas por esta aplicação: a sessão corre, é faturada e é revogada na sua conta de fornecedor, e a Didit cobra apenas a taxa da plataforma marketplace. Um fornecedor não ligado é recusado ao guardar. |

Exemplo de objeto `config`, para uma conta em que a Bank Verification está ativa e a rota escolhida cobre o país indicado:

```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 este passo funcionar, e é validado contra a rota em que o nó é executado, não contra uma lista global. Um país em que essa rota não consegue estabelecer a propriedade da conta é recusado ao guardar e indicado no erro; por isso, leia o erro em vez de assumir que o país foi aceite e que será ignorado em tempo de execução.

## AML

Valor da funcionalidade: `AML`.

Para a triagem de pessoas no âmbito do KYC, use estes campos:

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `is_aml_ongoing_monitoring_enabled` | boolean | Ativa a monitorização AML contínua. |
| `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 for indicado qualquer peso AML, 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 devolve uma correspondência, em vez de deixar a correspondência para ser tratada a partir da sessão. Desativado por predefinição. |
| `case_blueprint` | uuid | Modelo de caso a partir do qual é criado o caso automático. Só tem efeito com `create_cases_on_hit`; quando não está definido, é usado o predefinido da conta. |
| `status_rules` | array | Regras de estado personalizadas opcionais. |

Para a triagem de empresas no âmbito do KYB, use estes campos:

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `kyb_score_approve_threshold` | integer | Limiar de aprovação da AML da empresa. |
| `kyb_score_review_threshold` | integer | Limiar de revisão da AML da empresa. |
| `kyb_enable_ongoing_monitoring` | boolean | Ativa a monitorização AML contínua do KYB. |
| `kyb_company_aml_match_score_threshold` | integer | Limiar da pontuação de correspondência da AML da empresa. |
| `kyb_company_aml_name_weight` | integer | Peso do nome da empresa. Os pesos AML da empresa devem somar `100` quando forem indicados. |
| `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 um passo de Document AI

Um passo AML lê normalmente quem é alvo da triagem a partir do passo `OCR` (uma pessoa) ou do passo `KYB_REGISTRY` (uma empresa). Um fluxo cujo único passo de extração é `DOCUMENT_AI`, ou seja, documentos não normalizados como um certificado fiscal ou uma escritura de constituição, não tem nenhum dos dois, por isso tem de indicar de onde vem cada entrada da triagem.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `aml_field_sources` | object | De onde ler a entidade que este passo analisa. `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`. A CHAVE do mapa é uma das quatro entradas da triagem, `full_name`, `date_of_birth`, `nationality` ou `document_number`, lidas numa empresa como nome legal, data de constituição, país e número de registo. Um campo do Document AI já identificado como uma destas quatro entradas é mapeado automaticamente e, de propósito, não é persistido, para que mudar o nome desse campo nunca preserve um mapeamento desatualizado. Um mapeamento explícito prevalece sobre o mapeamento automático e sobre o documento de identificação, e um mapeamento que não resolva para nada em tempo de execução deixa a entrada vazia, sem recorrer a um valor alternativo. Num fluxo de empresa (KYB), a empresa devolvida por um passo `KYB_REGISTRY` é a fonte de verdade: apenas um mapeamento explícito substitui uma das suas entradas, o mapeamento automático não é aplicado sobre um registo devolvido pelo registo de empresas, e sem passo de registo o mapeamento é a identidade completa. 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`. Predefinido como `person` num fluxo de pessoas (KYC) e como `company` num fluxo de empresas (KYB). Defina `company` para fazer a triagem da empresa indicada num documento carregado sem um passo `KYB_REGISTRY`: o fornecedor pesquisa nos registos de empresas e a pontuação de correspondência é calculada como a de uma empresa. |
| `aml_incomplete_data_action` | action | Veredicto quando a triagem foi executada com menos dados do que os necessários para uma identidade completa (nome, data de nascimento e país). `REVIEW` é o predefinido. `NO_ACTION` prossegue com dados reduzidos num fluxo que sabe conter apenas um nome. A triagem é executada de qualquer forma, e o registo de dados parciais é gravado de qualquer forma; esta opção decide apenas o que isso faz ao estado. |

Exemplo: triagem da empresa indicada numa *acta constitutiva* mexicana, sem nenhum documento de identificação 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 um passo `OCR` nem um passo `KYB_REGISTRY` antes dele, um passo `AML` tem de conseguir preencher
> `full_name`, porque não há pesquisa no fornecedor sem um nome. Um fluxo que não mapeie nada, ou que mapeie
> uma chave do Document AI que nenhum passo anterior extrai, é rejeitado ao guardar, em vez de ser guardado
> e ficar a fazer triagem de nada. A precisão da AML depende diretamente de quantos identificadores forneceu:
> uma triagem apenas com nome é o que produz um volume elevado de falsos positivos.

## Análise de dispositivo e IP

Valor da funcionalidade: `IP_ANALYSIS`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `ip_mismatch_action` | ação | Ação quando a geolocalização do IP não corresponde aos dados esperados. |
| `ip_location_not_determined_action` | ação | Veredicto quando não foi registado nenhum endereço IP que identifique o utilizador final, pelo que a sessão não tem qualquer localização por IP: país, cidade, ISP, 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/centro de dados não podem ser executadas. Por predefinição, é `NO_ACTION`, que mantém o aviso `IP_LOCATION_NOT_DETERMINED` visível na sessão sem alterar o seu veredicto; defina `REVIEW` ou `DECLINE` se uma sessão sem localização não puder ser aprovada. |
| `vpn_detection_action` | ação | Ação quando é detetada a utilização de VPN ou proxy. |
| `expected_ip_mismatch_action` | ação | Ação quando o IP não corresponde ao IP esperado. |
| `duplicated_ip_action` | ação | Ação quando o IP é reutilizado de forma suspeita. |
| `duplicated_device_action` | ação | Ação quando a mesma impressão digital persistente do dispositivo é reutilizada em sessões com valores `vendor_data` diferentes. |
| `recovered_device_action` | ação | Ação quando a recuperação de impressão digital v2 associa a sessão a um dispositivo visto anteriormente, com elevada confiança, depois de o ID persistente do dispositivo ter mudado. |
| `is_ip_geofencing_enabled` | boolean | Ativa as restrições de geofencing por IP. Quando `false`, `ip_geofencing_by_country` é preservado, mas não é aplicado. |
| `ip_geofencing_by_country` | object | Regras de localização de IP por país, identificadas pelo código de país ISO-3: `{"USA": {"allowed": true, "states": {"California": {"allowed": false}}}}`. As entradas de estado/região substituem o indicador do país; os países não listados são permitidos. |
| `ip_geofencing_action` | ação | Ação quando o IP da sessão está localizado num país ou estado/região que não é permitido. Por predefinição, é `DECLINE`. |
| `automation_detected_action` | ação | Veredicto quando a sessão parece ser controlada por automação e não por uma pessoa. |
| `cross_org_fraud_device_action` | ação | Veredicto quando este dispositivo foi sinalizado como fraudulento por outra organização da rede. |
| `cross_org_fraud_ip_action` | ação | Veredicto quando este IP foi sinalizado como fraudulento por outra organização da rede. |
| `device_app_tampered_action` | ação | Veredicto quando o binário da aplicação hospedeira parece ter sido adulterado. |
| `device_blocklist_action` | ação | Veredicto quando o dispositivo está na lista de bloqueio da organização. |
| `device_debugger_action` | ação | Veredicto quando um depurador está ligado à aplicação hospedeira. |
| `device_emulator_action` | ação | Veredicto quando o dispositivo é um emulador e não hardware real. |
| `device_hooking_action` | ação | Veredicto quando é detetado hooking ou instrumentação em tempo de execução. |
| `device_integrity_missing_action` | ação | Veredicto quando não foi devolvida nenhuma atestação de integridade do dispositivo pela plataforma. |
| `device_rooted_action` | ação | Veredicto quando o dispositivo tem root ou está com jailbreak. |
| `multiple_devices_action` | ação | Veredicto quando a sessão foi conduzida a partir de mais do que um dispositivo. |
| `device_liveness_attack_history_action` | ação | Ação quando o mesmo dispositivo (identificado pelo seu ID persistente) foi usado numa sessão anterior de outro utilizador cuja captura de prova de vida foi considerada um ataque (aviso `DEVICE_LINKED_TO_LIVENESS_ATTACK`). Por predefinição, é `NO_ACTION`. |
| `device_model_inconsistency_action` | ação | Ação quando o mesmo dispositivo (identificado pelo seu ID persistente) foi registado como um modelo de dispositivo diferente numa sessão anterior (aviso `DEVICE_MODEL_INCONSISTENT`). Por predefinição, é `NO_ACTION`. |
| `status_rules` | array | Regras de estado 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 monitorizar dispositivos recuperados com elevada confiança antes de os recusar automaticamente. Isto é útil durante a implementação, porque as correspondências de dispositivos recuperados foram concebidas para detetar redes de fraude, mas ainda devem ser calibradas com o seu próprio tráfego.

## Verificação de localização

Valor da funcionalidade: `GEOLOCATION`.

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

Cada conclusão tem a sua própria chave de ação. Uma chave de ação que não defina assume o predefinido do `geolocation_preset` escolhido ou, se não escolher nenhum, o predefinido por chave indicado abaixo.
Uma localização incerta ou uma recusa de localização tem por predefinição `REVIEW`, nunca `DECLINE`, porque uma permissão negada ou um raio amplo não é prova de fraude.
Uma ação que definir explicitamente prevalece sempre sobre o predefinido.
Um desafio reproduzido (`LOCATION_REPLAY_DETECTED`) e uma falha na atestação do dispositivo (`LOCATION_INTEGRITY_FAILED`) recusam sempre 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 compara-a com a localização IP da ligação a partir da qual é enviada (uma consulta de inteligência de IP quando esse IP ainda não está em cache). Não definido (o predefinido) pede também a posição do dispositivo e, como antes de esta chave existir, compara-a com a localização IP que o passo de Análise de dispositivo e IP da sessão observou; por isso, sem esse passo não há distância e a ligação nunca é consultada. A exceção é um nó que age sobre uma conclusão de VPN, proxy ou Tor (a sua própria ação ou o seu predefinido): consulta a ligação para essa conclusão e compara o dispositivo com ela, exatamente como `device_and_ip`. `device_only` nunca compara com a localização IP e consulta a ligação apenas para essas conclusões; `ip_only` nunca pede nada à pessoa e avalia a localização IP da ligação, ao nível da cidade com um raio de 50 km, sem regras de precisão, de atualidade ou de aceitação de uma permissão aproximada; com `geolocation_areas`, uma cidade costeira é avaliada dentro do seu país, a menos que outro país esteja nesse raio. Num nó que pede o dispositivo, uma tentativa sem posição do dispositivo é avaliada como a recusa ou falha que é: a localização IP nunca a substitui. |
| `geolocation_preset` | string | Os predefinidos que todas as ações não definidas deste nó assumem. `licensing`: fora de uma área, numa área bloqueada, com VPN, Tor ou um emulador, recusa; um proxy e as restantes conclusões são revistos, e uma atestação do dispositivo em falta fica Sem ação. `fraud_screening`: igual, exceto que o que Licensing recusa vai para revisão. Nulo mantém os predefinidos de sempre. Uma ação definida explicitamente prevalece sempre. |
| `geolocation_accuracy_mode` | string | O que se pede ao dispositivo. `precise` pede ao sistema operativo uma posição precisa; é pedido novamente a uma pessoa que conceda apenas uma posição aproximada enquanto houver tentativas e, depois, avaliada por `geolocation_approximate_action`; `approximate_allowed` aceita uma concessão aproximada sem esse veredicto. `geolocation_max_accuracy_radius_m` aplica-se em qualquer dos casos. `precise` quando não definido. |
| `geolocation_max_accuracy_radius_m` | integer | O raio de incerteza mais amplo, em metros, que uma posição do dispositivo pode ter e ainda assim ser considerada. De 10 a 50000 metros; 250 quando não definido. Uma posição mais ampla, ou uma que não indique qualquer raio, faz o que `geolocation_low_accuracy_behavior` indicar 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 a consola mostra `geolocation_max_accuracy_radius_m`. Apenas para visualização: o valor guardado é sempre em metros, nenhuma regra depende dele, e os dados do passo apenas o reencaminham para que um cliente possa mostrar a mesma unidade. |
| `geolocation_low_accuracy_behavior` | string | O que faz uma posição mais ampla do que `geolocation_max_accuracy_radius_m`, ou sem raio: `ask_again` (o predefinido) pede à pessoa que tente novamente enquanto houver tentativas; `fail` termina o passo à primeira tentativa. |
| `geolocation_max_age_seconds` | integer | Há quantos segundos, no máximo, pode ter uma posição do dispositivo quando o servidor a recebe. De 5 a 3600 segundos; 120 quando não definido. Uma posição mais antiga é pedida novamente enquanto houver tentativas e, depois, avaliada por `geolocation_stale_fix_action`. |
| `geolocation_timeout_seconds` | integer | Quanto tempo, em segundos, o cliente deixa o dispositivo procurar uma posição em cada tentativa; o servidor reencaminha-o nos dados do passo e não impõe nada por si próprio. De 5 a 120 segundos; 20 quando não definido. Uma tentativa que não encontra posição a tempo é submetida como `timeout`, pedida novamente 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 cujo resultado a pessoa ainda pode alterar (uma recusa, uma posição ampla, desatualizada ou aproximada, ou uma conclusão de área ou de anonimizador à qual o nó reage) é pedida novamente enquanto houver tentativas, e a última decide o passo. Uma posição simulada, ou um emulador ao qual o nó reage, termina o passo na tentativa que o reportou. |
| `geolocation_allow_qr_handoff` | boolean | Oferece continuar num telemóvel com um código QR enquanto o passo estiver aberto (`allow_qr_handoff` nos dados do passo, `can_handoff` em cada resposta de submissão). Os SDKs nativos já correm no telemóvel e nunca mostram o código. Ativo por predefinição. |
| `geolocation_allow_skip` | boolean | Permite que a pessoa continue sem localização a qualquer momento, desde o ecrã inicial ou de nova tentativa (`skipped: true`). A opção de ignorar termina o passo e é avaliada por `geolocation_unavailable_action`, exceto quando responde a uma recusa num `geolocation_refusal_path` `continue_without_location`, caso em que fica registada como essa recusa. Desativado por predefinição. |
| `geolocation_deep_link_enabled` | boolean | Encaminhado para o cliente como `deep_link_enabled` nos dados do passo: oferece abrir a aplicação própria do cliente em alternativa. O servidor não aplica qualquer regra a este campo. Desativado por predefinição. |
| `geolocation_refusal_path` | string | O caminho oferecido quando o acesso à localização é recusado. `retry_then_handoff` (o predefinido) volta a pedir enquanto houver tentativas disponíveis e oferece a transferência para o telefone; `continue_without_location` deixa a pessoa prosseguir, registando a recusa; `end_session` termina o passo e a sessão à primeira recusa, e exige que `geolocation_permission_denied_action` seja Review ou Decline e um fluxo com um desfecho de Recusada, Em análise ou Final. A sessão é decidida a partir dos passos executados e nunca aprovada: num fluxo que não possa terminar nessa decisão, assume o outro desfecho não aprovado (recusada para em análise, em análise para recusada). |
| `is_geolocation_geofencing_enabled` | boolean | Ativa as regras de áreas: `geolocation_areas`, ou o mais antigo `geolocation_geofencing_by_country`, só se aplicam enquanto este valor for verdadeiro, e só então os dados do passo listam `available_areas`. Desativado por predefinição. Com esta opção ativa, uma lista `geolocation_areas` exige pelo menos uma área permitida. |
| `geolocation_areas` | array | Áreas permitidas e bloqueadas, aplicadas enquanto `is_geolocation_geofencing_enabled` for verdadeiro. Só passa uma posição dentro de uma área permitida, e uma área bloqueada prevalece sempre sobre uma permitida. Uma posição conta pelo seu círculo de precisão completo: um círculo que atravesse uma fronteira que decide a resposta é indeterminado, nunca fora. Um país ou região termina onde começa outra terra, nunca na linha de costa, e uma posição que, segundo os contornos, não se encontra em terra alguma (uma frente marítima ou um cais que a linha de costa simplificada deixou de fora) é indeterminada para todos os países ou regiões 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` define a forma: um `country` inteiro (ISO 3166-1 alpha-3 com contorno publicado: um território que os contornos apresentam como região de outro país é essa `region`, como a Reunião como `FR-RE` de França, ou Bonaire, Santo Eustáquio e Saba como `NL-BQ1` a `NL-BQ3`), `region` (códigos ISO 3166-2 de um país com fronteiras publicadas), `circle` (1 a 500 km) ou `polygon` (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 ativo. Não pode ser combinado com `geolocation_geofencing_by_country`. |
| `geolocation_geofencing_by_country` | object | Regras de permissão e bloqueio por país e região para a posição do próprio dispositivo, aplicadas apenas enquanto `is_geolocation_geofencing_enabled` for verdadeiro. Mesma forma que `ip_geofencing_by_country` da Análise de IP, exceto que as chaves de `states` são códigos ISO 3166-2 (`US-NJ`), e não nomes de estados, porque a posição é resolvida para uma subdivisão e não para a etiqueta de cidade de um fornecedor. Um país que não esteja listado é permitido. Guardar uma regra de região para um país sem fronteiras ISO 3166-2 publicadas é rejeitado, em vez de ser ignorado em silêncio. |
| `geolocation_ip_distance_km` | integer | Distância, em quilómetros, entre a posição do dispositivo e a localização do IP, depois de subtraídos os dois raios de incerteza, a partir da qual `geolocation_ip_distance_action` se aplica. 200 quando a chave é omitida; null desativa a comparação. A comparação é feita apenas num nó cujo `geolocation_position_source` seja `device_and_ip` ou não esteja definido; essa chave indica com que localização de IP é feita a comparação. |
| `geolocation_ip_distance_unit` | string | A unidade em que a consola mostra `geolocation_ip_distance_km`. Apenas visualização: o valor guardado é sempre em quilómetros e nenhuma regra depende dele. |
| `geolocation_document_distance_km` | integer | Distância, em quilómetros, a que a posição (a localização de IP num nó `ip_only`) pode estar do endereço indicado por `geolocation_document_distance_basis` antes de `geolocation_document_distance_action` se aplicar. Não definido ou null (o predefinido) significa desativado. |
| `geolocation_document_distance_unit` | string | A unidade em que a consola mostra `geolocation_document_distance_km`. Apenas visualização: o valor guardado é sempre em quilómetros e nenhuma regra depende dele. |
| `geolocation_document_distance_basis` | string | Endereço a partir do qual se mede `geolocation_document_distance_km`: `document` (o predefinido: o endereço do documento de identificação e, em seguida, o endereço do comprovativo de morada), apenas `proof_of_address`, ou `declared` (o `expected_details.address` indicado na criação da sessão, geocodificado). |
| `geolocation_travel_tolerance_enabled` | boolean | Permite ignorar a distância ao endereço quando a mesma pessoa (mesmo `vendor_data`) foi vista a menos de `geolocation_travel_usual_area_km` desse endereço nos últimos `geolocation_travel_max_days` dias. Nunca desculpa uma VPN, uma posição com spoofing, uma área bloqueada ou estar fora das áreas permitidas. Só conta como visto ali uma posição medida pelo dispositivo: uma localização simulada ou falseada, um emulador ou uma atestação falhada nunca contam. |
| `geolocation_travel_usual_area_km` | integer | Raio à volta do endereço que conta como área habitual da pessoa. De 10 a 500 km; 100 quando não definido. |
| `geolocation_travel_max_days` | integer | Durante quanto tempo, depois de a pessoa ter sido vista na área habitual, uma posição distante continua a contar como 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`) estiveram fora das áreas permitidas, numa área bloqueada ou longe do endereço este número de vezes seguidas. Uma verificação que não comparou nada não prolonga nem quebra a sequência, e o mesmo vale para uma posição que o dispositivo não mediu (uma localização simulada ou falseada, um emulador, uma atestação falhada). De 2 a 10; null (o predefinido) significa desativado. |
| `geolocation_approximate_action` | action | Veredicto quando o utilizador autorizou o acesso a uma localização aproximada enquanto `geolocation_accuracy_mode` exige uma localização precisa. Por predefinição, `REVIEW`. |
| `geolocation_blocked_area_action` | action | Veredicto quando a posição, e todo o seu círculo de precisão, se encontra dentro de uma área bloqueada de `geolocation_areas`. Por predefinição, Decline. |
| `geolocation_consecutive_mismatch_action` | ação | Veredicto quando forem atingidas `geolocation_consecutive_mismatch_count` incompatibilidades consecutivas. Por defeito, Revisão. |
| `geolocation_document_distance_action` | ação | Veredicto quando a posição do dispositivo estiver mais distante do endereço do documento do que `geolocation_document_distance_km`. O endereço é geocodificado de forma aproximada, pelo que este é um sinal fraco. Por defeito, `REVIEW`. |
| `geolocation_emulator_action` | ação | Veredicto quando a aplicação que partilhou a localização reportou estar a ser executada num emulador. Os navegadores não conseguem reportar isto. Salvo se for Sem ação, termina o passo nessa tentativa: voltar a verificar não pode alterar o dispositivo. Sem ação, salvo se for definido ou se uma predefinição indicar o contrário. |
| `geolocation_geofence_undetermined_action` | ação | Veredicto quando não é possível determinar se a posição está dentro ou fora da cerca geográfica, porque o seu círculo de precisão atinge o limite. A incerteza nunca é reportada como estando fora. Por defeito, `REVIEW`. |
| `geolocation_geofencing_action` | ação | Veredicto quando a posição do dispositivo e todo o seu círculo de incerteza ficam fora de `geolocation_geofencing_by_country`. Por defeito, `DECLINE`. |
| `geolocation_integrity_missing_action` | ação | Veredicto quando um cliente nativo enviou uma posição sem token de atestação do dispositivo. Por defeito, Sem ação; os clientes web são registados como não suportados e não como em falta, porque nenhum navegador pode atestar. |
| `geolocation_ip_distance_action` | ação | Veredicto quando a posição do dispositivo e a localização do IP da sessão estiverem mais distantes do que `geolocation_ip_distance_km`, depois de subtraídos os dois raios de incerteza. Por defeito, `REVIEW`. |
| `geolocation_low_accuracy_action` | ação | Veredicto quando nenhuma tentativa estabeleceu a precisão exigida: a melhor posição tem um raio de incerteza superior a `geolocation_max_accuracy_radius_m`, ou não reportou qualquer raio. Uma posição sem raio nunca é considerada como cumprindo o limite. Por defeito, `REVIEW`. |
| `geolocation_mock_location_action` | ação | Veredicto quando o sistema operativo reportou a posição como simulada e não medida (fornecedor simulado do Android, ou simulada por software no iOS). Por defeito, `REVIEW`. |
| `geolocation_permission_denied_action` | ação | Veredicto quando o utilizador recusou ou dispensou o pedido de localização em todas as tentativas permitidas. Por defeito, Revisão: uma recusa é uma escolha, não um sinal de fraude. |
| `geolocation_proxy_action` | ação | Veredicto quando a ligação que partilhou a localização passa por um proxy aberto, anónimo ou de retransmissão privada. Sem ação, salvo se for definido ou se uma predefinição indicar o contrário. |
| `geolocation_stale_fix_action` | ação | Veredicto quando a posição foi medida mais de `geolocation_max_age_seconds` antes de o servidor a receber. Por defeito, `REVIEW`. |
| `geolocation_tor_action` | ação | Veredicto quando a ligação que partilhou a localização é um nó de saída Tor. Sem ação, salvo se for definido ou se uma predefinição indicar o contrário. |
| `geolocation_unavailable_action` | ação | Veredicto quando não foi possível obter qualquer posição: serviços de localização desligados ou restritos, o sistema de posicionamento não devolveu nada, a tentativa expirou, o utilizador ignorou o passo, ou o cliente é demasiado antigo para o suportar. Por defeito, `REVIEW`. |
| `geolocation_vpn_action` | ação | Veredicto quando a ligação que partilhou a localização é uma VPN comercial. Salvo se for Sem ação, pede-se à pessoa que a desative e volte a verificar enquanto restarem tentativas. Sem ação, salvo se for definido ou se uma predefinição indicar o contrário. |
| `status_rules` | array | Regras de estado personalizadas opcionais. Pode visar os campos `geolocation.*` indicados em [Relatório de verificação de localização](https://docs.didit.me/pt/core-technology/location-verification/report-location-verification.md#campos-para-regras-de-estado-e-ramificações). |

### Formas das áreas

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

| `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 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 tem 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 em conjunto, 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 a guardar.

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

## Comprovativo de morada

Valor da funcionalidade: `PROOF_OF_ADDRESS`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `poa_documents_allowed` | object | Código de país ISO3 para a configuração do tipo de documento de comprovativo de morada. Deve estar ativado pelo menos um tipo de documento válido. |
| `poa_languages_allowed` | object | Código de idioma ISO 639-1 para `0` ou `1`. Deve estar ativado pelo menos um idioma. |
| `poa_name_or_address_mismatch_action` | action | Ação quando o nome ou a morada não correspondem aos dados esperados. |
| `poa_document_issues_action` | action | Ação quando o documento apresenta problemas de qualidade ou de extração. |
| `poa_max_attempts_exceeded_action` | restricted action | Ação quando o utilizador excede as tentativas permitidas. Use `DECLINE` ou `REVIEW`. |
| `poa_document_authenticity_action` | restricted action | Ação quando as verificações de autenticidade falham. Use `DECLINE` ou `REVIEW`. |
| `poa_document_unproven_text_replacement_action` | action | Ação quando um campo de texto foi apagado e reescrito noutro tipo de letra, e o ficheiro não contém prova de que o conteúdo mudou (`POA_DOCUMENT_UNPROVEN_TEXT_REPLACEMENT`). |
| `poa_unsupported_document_type_action` | action | Ação quando o tipo de documento não é suportado. |
| `poa_unsupported_language_action` | action | Ação quando o idioma do documento não é suportado. |
| `poa_issuer_not_identified_action` | action | Ação quando o emissor do documento não é identificado. |
| `poa_issue_date_not_detected_action` | action | Ação quando a data de emissão está em falta. |
| `poa_unparsable_or_invalid_address_action` | action | Ação quando a morada é inválida ou não pode ser interpretada. |
| `address_validation_enabled` | boolean | Valida a morada que este passo lê (impressa no comprovativo de morada; apenas um carregamento que passou nas verificações do documento é validado) contra dados de referência postais: confirma que a morada existe e normaliza-a, e nunca a associa a uma pessoa. O resultado é o objeto `address_validation` do passo, na decisão. **É cobrado \$0.10 por morada validada**; uma validação que não possa ser executada (`unavailable`) é gratuita. Desativado por predefinição. |
| `address_not_verified_action` | action | Ação quando a validação da morada não consegue confirmar a morada até ao edifício (`ADDRESS_NOT_VERIFIED`: `partially_verified` ou `not_verified`). Aplica-se apenas enquanto `address_validation_enabled` estiver ativo. Por predefinição é `NO_ACTION`, que apenas regista o aviso. |
| `poa_name_match_score_threshold` | integer | Limiar de correspondência de nome. |
| `poa_max_retry_attempts` | integer | Limite de novas tentativas, de `2` a `5`. |
| `status_rules` | array | Regras de estado personalizadas opcionais. |

## Questionário

Valor da funcionalidade: `QUESTIONNAIRE`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `questionnaire_uuid` | UUID | Obrigatório. Use o `questionnaire_id` devolvido por `POST /v3/questionnaires/`. |
| `review_questionnaire_manually` | boolean | Envia as respostas ao questionário para revisão manual. |
| `status_rules` | array | Regras de estado personalizadas opcionais. Pode direcionar os campos `questionnaire.answers.<question_id>`. |

## Registo de empresas (KYB)

Valor da funcionalidade: `KYB_REGISTRY`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `kyb_accepted_countries` | object | Lista de países permitidos ISO3 legada para a pesquisa no registo de empresas. Foi substituída por `kyb_registry_countries_config`; continua legível e continua a ser derivada dela para os fluxos existentes, mas já não é a forma de configurar novos fluxos. |
| `kyb_manual_company_action` | action | Ação quando a empresa requer tratamento manual. |
| `kyb_registry_fields_config` | object | Visibilidade e obrigatoriedade por campo para o formulário de registo no fluxo alojado. Ver abaixo. |
| `kyb_registry_countries_config` | object | Encaminhamento de registo por país, no formato `{"<ISO2>": {"enabled": bool, "tier": "basic" \| "shareholders" \| "ubo"}}`. Cada país ativado escolhe o nível de dados cobrado quando uma empresa é selecionada (`basic` é o nível Lite), e só podem ser ativados os níveis que o [endpoint de preços](https://docs.didit.me/pt/getting-started/kyb-registry-pricing.md) indica como disponíveis para esse país. Pelo menos um país tem de estar ativado: uma verificação no registo que não pesquisa em nenhum país é rejeitada. As empresas introduzidas manualmente são faturadas separadamente e não usam esta configuração. |
| `kyb_registry_monitoring_enabled` | boolean | Mantém o registo da empresa sob monitorização contínua após um resultado Shareholders ou UBO: uma alteração de estado, de administradores, de propriedade ou de morada devolve a sessão para revisão e envia um webhook. Disponível apenas onde o fornecedor do registo oferece monitorização. USD 2.00 por empresa por ano, cancelável em qualquer altura. Desativado por predefinição. |
| `kyb_vat_invalid_action` | action | Ação quando o número de IVA da empresa falha a validação pelo VIES da UE. Por predefinição é `REVIEW`. |
| `kyb_vat_unverified_action` | action | Ação quando o número de IVA não pôde ser validado porque o VIES não estava disponível. Por predefinição é `NO_ACTION`. |
| `status_rules` | array | Regras de estado 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` mostra-o como opcional, e `enabled: true, required: true` torna-o obrigatório na submissão. `company_name`, `country_code` e `region` são sempre mostrados e obrigatórios e não podem ser configurados. Quando o objeto é omitido, `null` ou `{}`, aplica-se a predefinição: apenas `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 dos campos 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`. Consulte [campos configuráveis do formulário de registo](https://docs.didit.me/pt/business-verification/company-data.md#campos-configuráveis-do-formulário-de-registo) para o comportamento junto do utilizador final e [validação de IVA e de número de identificação fiscal](https://docs.didit.me/pt/business-verification/company-data.md#validação-de-iva-e-número-de-identificação-fiscal) para saber como `vat_number` e `tax_number` são verificados.

## Documentos KYB

Valor da funcionalidade: `KYB_DOCUMENTS`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `kyb_required_document_groups` | objeto ou array | Obrigatório. Grupos de documentos KYB obrigatórios. |
| `kyb_document_subtype_config` | objeto | Ativação por subtipo de documento e configuração de idade. |
| `kyb_document_tampering_action` | ação restrita | Ação quando é detetada adulteração. Use `DECLINE` ou `REVIEW`. |
| `kyb_document_unproven_text_replacement_action` | ação | Ação quando um campo de texto de um documento da empresa foi deixado em branco e novamente escrito noutro tipo de letra, e o ficheiro não contém prova que permita determinar se o conteúdo foi alterado (`KYB_DOCUMENT_UNPROVEN_TEXT_REPLACEMENT`). |
| `kyb_document_critical_mismatch_action` | ação restrita | Ação para discrepâncias críticas nos documentos. Use `DECLINE` ou `REVIEW`. |
| `kyb_document_non_critical_mismatch_action` | ação | Ação para discrepâncias não críticas nos documentos. |
| `kyb_document_age_action` | ação | Ação quando as regras de idade do documento não são cumpridas. |
| `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 estado personalizadas opcionais. |

## Pessoas-chave KYB

Valor da funcionalidade: `KYB_KEY_PEOPLE`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `kyb_ubo_ownership_threshold` | inteiro | Limiar de propriedade do UBO, de `0` a `100`. |
| `kyb_shareholder_ownership_threshold` | inteiro | Limiar de propriedade do acionista, de `0` a `100`. Não pode ser superior a `kyb_ubo_ownership_threshold`. |
| `kyb_key_people_ownership_required` | booleano | Exige uma percentagem de propriedade em cada pessoa-chave submetida. Aplicado na submissão e apresentado na interface alojada, que assinala o campo como obrigatório. Predefinição `false`. |
| `kyb_require_ubo_kyc` | booleano | Exige que os UBOs concluam um fluxo de verificação de pessoas singulares. |
| `kyb_ubo_verification_workflow` | UUID | Obrigatório quando `kyb_require_ubo_kyc` é `true`. Tem de referenciar um fluxo que não seja KYB na mesma aplicação. |
| `kyb_require_officer_kyc` | booleano | Exige que os dirigentes concluam a verificação de pessoas singulares. |
| `kyb_shareholder_verification_workflow` | UUID | Fluxo de verificação de pessoas singulares para os acionistas. |
| `kyb_officer_verification_workflow` | UUID | Fluxo de verificação de pessoas singulares para os dirigentes. |
| `kyb_require_corporate_ubo_kyb` | booleano | Exige que os UBOs corporativos concluam o KYB. |
| `kyb_corporate_ubo_verification_workflow` | UUID | Obrigatório quando `kyb_require_corporate_ubo_kyb` é `true`. Tem de referenciar um fluxo KYB na mesma aplicação. |
| `kyb_reject_if_ubo_rejected` | booleano | Rejeita a empresa quando a verificação de um UBO obrigatório é rejeitada. |
| `kyb_wait_for_all_ubos` | booleano | Aguarda pelas verificações de todos os UBO obrigatórios antes de tomar uma decisão sobre a sessão KYB. |
| `kyb_role_config` | objeto ou array | Configuração por função. Cada função KYC obrigatória tem de incluir um `verification_workflow`. |
| `kyb_reuse_verified_individuals` | booleano | Reutiliza pessoas singulares já verificadas, sempre que 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 os dados da empresa recolhidos para uma pessoa-chave CORPORATE. Tem a mesma lista de descritores ordenada e as 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 | Veredicto quando o documento de uma pessoa-chave não coincide com os dados declarados para essa pessoa. |
| `kyb_key_people_person_fields` | objeto | Dados pessoais recolhidos para uma pessoa-chave individual, como uma LISTA ORDENADA de descritores de campos (não um mapa). `key` é obrigatório e não pode estar vazio; `type` tem de ser text, number, date, phone ou email; `custom` assinala um campo acrescentado pelo cliente em vez de um dos campos integrados. 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 | Pré-preenche a lista de pessoas-chave com o resultado do registo de empresas, para que o cliente confirme e corrija, em vez de introduzir manualmente todos os dirigentes e acionistas. |
| `status_rules` | array | Regras de estado personalizadas opcionais. |

## Document AI

Valor da funcionalidade: `DOCUMENT_AI`.

Pede ao utilizador um ou mais documentos e extrai os campos que define, com um modelo de visão. Cada campo configurado torna-se um valor ramificável `document_ai.<key>`, e o resultado do passo é `document_ai.status`.

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `document_ai_documents` | array | Obrigatório. Os documentos a pedir (no máximo `3`). Cada entrada é um objeto de documento (ver abaixo). |
| `document_ai_unreadable_document_action` | ação | Ação quando o documento não pode ser lido ou não é possível extrair dados. |
| `document_ai_missing_required_fields_action` | ação | Ação quando não é possível extrair um campo obrigatório. |
| `document_ai_document_tampering_action` | ação restrita | Ação quando o documento apresenta sinais de manipulação. Utilize `DECLINE` ou `REVIEW`. |
| `document_ai_name_mismatch_action` | ação | Ação quando o nome completo extraído não corresponde à identidade verificada. Requer um campo marcado com `is_full_name`. |
| `document_ai_unsupported_file_action` | ação | Ação quando o tipo de ficheiro carregado não é suportado. |
| `document_ai_max_attempts_exceeded_action` | ação restrita | Ação quando o utilizador excede o limite de tentativas. Utilize `DECLINE` ou `REVIEW`. |
| `document_ai_name_match_score_threshold` | inteiro | 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` | inteiro | Limite de tentativas, de `2` a `5`. |
| `status_rules` | array | Regras de estado personalizadas, opcionais. Pode visar campos `document_ai.<key>`. |

Cada entrada em `document_ai_documents` é um documento:

| Campo do documento | Tipo | Descrição |
| - | - | - |
| `document_key` | cadeia de caracteres | Obrigatório. Identificador estável do documento, único dentro do passo. |
| `title` | cadeia de caracteres | Obrigatório. Título apresentado ao utilizador. |
| `description` | cadeia de caracteres | Obrigatório. Instruções apresentadas ao utilizador sobre o que carregar. |
| `title_i18n` | objeto | Opcional. Código de idioma para o título traduzido (por exemplo, `{ "es": "Comprobante de fondos" }`). |
| `description_i18n` | objeto | Opcional. Código de idioma para a descrição traduzida. |
| `fields` | array | Obrigatório. Os campos a extrair (pelo menos um). As chaves dos campos têm de ser únicas dentro do documento. |

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

| Campo | Tipo | Descrição |
| - | - | - |
| `key` | cadeia de caracteres | Obrigatório. Chave JSON estável para o valor extraído, única dentro do documento. Crie uma ramificação com base nela como `document_ai.<key>`. |
| `name` | cadeia de caracteres | Obrigatório. Rótulo do campo legível por pessoas. |
| `name_i18n` | objeto | Opcional. Código de idioma para o nome do campo traduzido. |
| `instruction` | cadeia de caracteres | Opcional. Instrução que indica ao modelo exatamente o que extrair para este campo. |
| `type` | cadeia de caracteres | Tipo do campo: `text`, `number` ou `date`. Predefinição: `text`. |
| `required` | booleano | Se o campo tem de estar presente. Predefinição: `false`. Quando `true` e o valor estiver em falta, aplica-se `document_ai_missing_required_fields_action`. |
| `is_full_name` | booleano | Opcional, predefinição `false`. Marca o campo cujo valor é o nome completo do titular do documento, comparado com a identidade verificada (o nome obtido 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 **não é obrigatório**: um documento pode não marcar nenhum, caso em que não é feita nenhuma comparação de nomes para esse documento. Só os 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 da funcionalidade: `SIGNATURE`.

Permite que a pessoa verificada, ou as pessoas-chave de uma empresa, assinem documentos, no nível Simple (predefinido) ou Advanced (AES). Coloque-a depois dos passos que verificam o signatário: Verificação de identidade e, para o código, Verificação de e-mail ou de telefone. Consulte [Assinatura eletrónica](https://docs.didit.me/pt/core-technology/electronic-signature/overview.md).

| Campo de configuração | Tipo | Descrição |
| - | - | - |
| `signature_documents` | array | Os documentos carregados para este fluxo na consola, pela ordem em que o signatário os vê, no formato `[{"uuid", "title", "file_name", "pages", "size_bytes"}]`. Só os valores de `uuid` e a respetiva ordem são lidos; o restante vem dos ficheiros guardados. Até 20 documentos e 50 MB no total. Predefinido `[]`. |
| `signature_documents_source` | string | De onde vêm os documentos: `workflow` (predefinido), `session` (`sign.documents` em [criar sessão](https://docs.didit.me/pt/sessions-api/create-session.md#documentos-de-assinatura-eletrónica)) ou `both` (primeiro os documentos do fluxo). |
| `signature_require_read_to_end` | boolean | O signatário tem de chegar ao fim de cada documento sem campos antes de o aceitar. Predefinido `true`. |
| `signature_consent_per_document` | boolean | O signatário aceita separadamente cada documento sem campos. Nos documentos com campos, os campos guiados e o consentimento final substituem este. Predefinido `true`. |
| `signature_signer` | string | Quem assina: `verified_person` (predefinido, KYC) ou, para KYB, `legal_representative` (pessoas-chave com a função `representative` ou `authorized_signatory`) ou `key_people` (cada pessoa-chave individual com uma sessão KYC). |
| `signature_level` | string | `simple` (predefinido): sem verificação de identidade, e-mail, telefone ou código; o signatário escreve o nome e assina através da ligação da sessão. `aes`: requer uma verificação de identidade aprovada, um e-mail ou telefone verificado e um código de utilização única. `simple` é recusado para signatários `legal_representative` e `key_people` com `signature_simple_requires_verified_person`. Enquanto `signature_availability.aes` estiver `false` no fluxo, guardar um novo passo `aes` devolve `400` com `aes_not_available`. `qes` estará disponível em breve: guardá-lo devolve `400` com `qes_not_available`. |
| `signature_format` | string | `pades` (predefinido). `xades` e `cades` são recusados para AES com `signature_format_not_supported`. |
| `signature_otp_channel` | string | Para onde vai o código de utilização única: `email` (predefinido) ou `sms`. É enviado apenas para um contacto verificado anteriormente na sessão. |
| `signature_email_signed_copy` | boolean | Envia ao signatário, por e-mail, uma cópia dos documentos assinados. Requer um e-mail verificado. Predefinido `true`. |
| `signature_evidence_page` | boolean | Acrescenta a página de prova a cada PDF assinado. Predefinido `true`. |
| `signature_link_validity_days` | integer | Durante quantos dias a ligação de assinatura se mantém válida, de `1` a `30` dias a partir da criação da sessão. Predefinido `7`. |
| `signature_declined_action` | ação | Veredicto quando o signatário recusa. Não é cobrado nada. Predefinido `REVIEW`. |
| `signature_otp_failed_action` | ação | Veredicto após 3 códigos errados ou mais de 5 códigos pedidos. Predefinido `DECLINE`. |
| `signature_name_mismatch_action` | ação | Veredicto quando o nome declarado de uma pessoa-chave não corresponde ao nome verificado. Predefinido `DECLINE`. |
| `signature_identity_not_verified_action` | ação | Veredicto quando o signatário não tem prova de identidade aprovada. Predefinido `DECLINE`. |
| `signature_document_changed_action` | ação | Veredicto quando um documento já não corresponde ao SHA-256 registado quando foi apresentado. Predefinido `DECLINE`. |
| `status_rules` | array | Regras de estado personalizadas opcionais. Pode definir como alvo `signature.status`, `signature.level` e `signature.format`. |

Os campos de um documento do fluxo são colocados no editor de modelos da consola. Para documentos de sessão, envie-os em `sign.documents[].fields` e envie os valores dos campos `api.<key>` em `sign.field_values`. Consulte [Criar sessão](https://docs.didit.me/pt/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.