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

# Verificação de titular de conta bancária na África do Sul

> Verifique o titular de conta bancária na África do Sul com a Didit em bases oficiais. A partir de $0.40 por chamada, sem contratos nem mínimos.

Confirma que uma conta bancária sul-africana pertence ao titular informado por meio do serviço interbancário Account Holder Verification. A Didit disponibiliza esse serviço em `POST /v3/database-validation/` para que você verifique os dados enviados contra a fonte oficial e receba resultados de correspondência normalizados.

## Cobertura

* **Cobertura:** —
* **País:** África do Sul
* **ID do serviço:** `zaf_bank_account_holder`
* **Domínio de dados:** Financeiro
* **Categoria:** Serviços bancários

## Entradas

| Campo | Obrigatório | Exemplo |
| - | -: | - |
| `national_id` | Sim | `8708150847085` |
| `bank_account_number` | Sim | `1234567890` |
| `bank_name` | Sim | `ABSA` |
| `account_type` | Não | `current` |
| `first_name` | Não | `John` |
| `last_name` | Não | `Doe` |
| `initials` | Não | `JD` |
| `email` | Não | `john.doe@example.com` |
| `phone_number` | Não | `+15550101000` |
| `vendor_data` | Não | `user-1234` |

* **Entradas obrigatórias:** `national_id`, `bank_account_number`, `bank_name`
* **Entradas opcionais:** `account_type`, `first_name`, `last_name`, `initials`, `email`, `phone_number`, `vendor_data`
* **Consentimento:** Obrigatório
* **Disponibilidade no fluxo de verificação (workflow):** Disponível no fluxo com mapeamento de campos
* **Cobertura:** —
* **Preço:** \$0.40 por consulta bem-sucedida

Em um fluxo, `bank_account_number` e `bank_name` não aparecem impressos em um documento de identidade, então nenhuma etapa os gera por conta própria. Colete-os a partir de uma resposta de Questionário, de um campo de extração do Document AI ou de um valor que você envia ao criar a sessão, e mapeie cada um deles na etapa de Validação de banco de dados. Enquanto não forem mapeados, o editor de fluxos mostra este serviço desativado e indica a entrada ausente; durante a execução, uma entrada ausente faz com que a verificação seja ignorada antes de qualquer consulta, então você nunca é cobrado por um banco de dados que não pôde ser consultado.

## Parâmetros do corpo

**issuing\_state** `string` *required* (default: ZAF)

Código de país ISO 3166-1 alpha-3 deste serviço de banco de dados.

Exemplo: `ZAF`

**services** `string` *required* (default: zaf\_bank\_account\_holder)

Array que contém o ID deste serviço. Fixar o serviço mantém a requisição restrita exatamente a este banco de dados.

Exemplo: `zaf_bank_account_holder`

**consent** `boolean` *required* (default: true)

Consentimento explícito do usuário final para este serviço.

Exemplo: `true`

**national\_id** `string` *required* (default: 8708150847085)

Número de identidade nacional para este serviço.

Exemplo: `8708150847085`

**bank\_account\_number** `string` *required* (default: 1234567890)

Valor de `bank_account_number` exigido por este serviço de banco de dados.

Exemplo: `1234567890`

**bank\_name** `string` *required* (default: ABSA)

Valor de `bank_name` exigido por este serviço de banco de dados.

Exemplo: `ABSA`

**account\_type** `string` (default: current)

Valor de `account_type` exigido por este serviço de banco de dados.

Exemplo: `current`

**first\_name** `string`

Nome a ser validado.

Exemplo: `John`

**last\_name** `string` (default: Doe)

Sobrenome a ser validado.

Exemplo: `Doe`

**initials** `string` (default: JD)

Valor de `initials` exigido por este serviço de banco de dados.

Exemplo: `JD`

**email** `string`

Endereço de e-mail.

Exemplo: `john.doe@example.com`

**phone\_number** `string`

Valor de `phone_number` exigido por este serviço de banco de dados.

Exemplo: `+15550101000`

**vendor\_data** `string` (default: user-1234)

Sua referência estável para este usuário, como o seu ID interno de usuário. A Didit a usa para vincular verificações avulsas ao mesmo usuário final e reduzir o ruído na detecção de duplicatas.

Exemplo: `user-1234`

## Regras de entrada e observações de validação

* `account_type` deve ser um dos tipos de conta do AVS sul-africano: `current`, `savings`, `transmission`, `subscriptionShare`, `notKnown`. A correspondência não diferencia maiúsculas de minúsculas. Omita o campo quando você não souber o tipo de conta: nesse caso, a Didit envia `notKnown` e a verificação cruzada do tipo de conta é informada como não confirmada, em vez de fazer a requisição falhar.

## Como fazer a chamada

```bash cURL theme={null}
curl -X POST "https://verification.didit.me/v3/database-validation/" \
  -H "x-api-key: YOUR_API_KEY" \
  -F "issuing_state=ZAF" \
  -F "services=zaf_bank_account_holder" \
  -F "vendor_data=user-1234" \
  -F "consent=true" \
  -F "national_id=8708150847085" \
  -F "bank_account_number=1234567890" \
  -F "bank_name=ABSA" \
  -F "account_type=current" \
  -F "last_name=Doe" \
  -F "initials=JD"
```

Toda chamada bem-sucedida retorna HTTP `200`. O campo **`outcome_code`** informa o que de fato aconteceu, distinguindo, por exemplo, uma divergência biométrica real (`BIOMETRIC_NO_MATCH`) de uma selfie que não pôde ser lida (`BIOMETRIC_IMAGE_UNUSABLE`). O `status` exibido é o status padrão do recurso; as [ações de Partial Match / No Match](https://docs.didit.me/pt-br/core-technology/database-validation/database-validation-warnings.md) que você configurou podem substituí-lo.

**`MATCH`**: o registro confirmou a identidade e todos os campos verificados corresponderam.

```json 200 OK — MATCH theme={null}
{
  "request_id": "req_01H…",
  "status": "Approved",
  "issuing_state": "ZAF",
  "match_type": "full_match",
  "validations": [
    {
      "outcome_code": "MATCH",
      "service_id": "zaf_bank_account_holder",
      "service_name": "South Africa - Bank Account Holder Verification",
      "source_data": {
        "accepts_credits": true,
        "accepts_debits": true,
        "account_found": true,
        "account_number_length_valid": true,
        "account_open": true,
        "account_type_match": true,
        "id_match": true,
        "identification_number": "SAMPLE-ID-12345",
        "initials_match": true,
        "surname_match": true
      },
      "validation": {
        "full_name": "full_match",
        "identification_number": "full_match"
      }
    }
  ]
}
```

**`PARTIAL_MATCH`**: o número de identificação foi encontrado, mas um ou mais campos pessoais (geralmente o nome ou a data de nascimento) não corresponderam totalmente.

```json 200 OK — PARTIAL_MATCH theme={null}
{
  "request_id": "req_01H…",
  "status": "In Review",
  "issuing_state": "ZAF",
  "match_type": "partial_match",
  "validations": [
    {
      "outcome_code": "PARTIAL_MATCH",
      "service_id": "zaf_bank_account_holder",
      "service_name": "South Africa - Bank Account Holder Verification",
      "source_data": {
        "accepts_credits": true,
        "accepts_debits": true,
        "account_found": true,
        "account_number_length_valid": false,
        "account_open": true,
        "account_type_match": true,
        "id_match": true,
        "identification_number": "SAMPLE-ID-12345",
        "initials_match": true,
        "surname_match": false
      },
      "validation": {
        "full_name": "partial_match",
        "identification_number": "full_match"
      }
    }
  ]
}
```

**`NO_MATCH`**: o registro não retornou nenhuma correspondência para os dados enviados.

```json 200 OK — NO_MATCH theme={null}
{
  "request_id": "req_01H…",
  "status": "Declined",
  "issuing_state": "ZAF",
  "match_type": "no_match",
  "validations": [
    {
      "outcome_code": "NO_MATCH",
      "service_id": "zaf_bank_account_holder",
      "service_name": "South Africa - Bank Account Holder Verification",
      "source_data": {
        "accepts_credits": false,
        "accepts_debits": false,
        "account_found": false,
        "account_number_length_valid": false,
        "account_open": false,
        "account_type_match": false,
        "id_match": false,
        "identification_number": "NO_MATCH",
        "initials_match": false,
        "surname_match": false
      },
      "validation": {
        "identification_number": "no_match"
      }
    }
  ]
}
```

## Dados retornados

Os campos exatos exibidos em `source_data` dependem do que o registro retorna. O exemplo gerado para `zaf_bank_account_holder` documenta atualmente esta estrutura normalizada:

* `accepts_credits`
* `accepts_debits`
* `account_found`
* `account_number_length_valid`
* `account_open`
* `account_type_match`
* `id_match`
* `identification_number`
* `initials_match`
* `surname_match`

## Preços e SLAs

As consultas de Verificação do Titular de Conta Bancária da África do Sul são cobradas somente quando a Didit recebe um resultado conclusivo da fonte de validação.

* **Preço por chamada:** \$0.40 USD.
* **Faturamento:** por consulta bem-sucedida. Você não é cobrado quando o registro está inacessível, quando faltam campos obrigatórios ou quando a requisição é rejeitada antes de chegar à fonte.
* **Latência:** p95 típico \< 2 s.
* **Disponibilidade:** 99.9% por trimestre do lado da Didit; a disponibilidade da fonte externa varia conforme o país e o conjunto de dados.

## O que um MATCH confirma

A Verificação do Titular da Conta (AVS) é um conjunto de verificações cruzadas de sim/não, e não uma consulta de registros. A fonte nunca retorna um nome, um número de identidade ou o saldo de uma conta: ela recebe os dados que você envia, compara-os com o que o banco tem para aquela conta e responde a cada comparação com um indicador. `source_data` traz esses indicadores:

* **`account_found`** - o banco tem uma conta com esse número. Todos os demais indicadores perdem o sentido quando este é `false`.
* **`account_open`** - a conta está aberta. Uma conta pode ser encontrada, mas estar encerrada.
* **`id_match`** - a conta pertence ao documento de identidade nacional que você enviou. É para esta verificação que o serviço existe.
* **`initials_match`**, **`surname_match`** - os valores de `initials` e `last_name` enviados correspondem ao titular da conta registrado.
* **`account_type_match`** - o `account_type` enviado corresponde ao tipo real da conta.
* **`email_match`**, **`phone_match`** - os valores de `email` e `phone_number` enviados correspondem aos dados de contato que o banco tem.
* **`accepts_debits`**, **`accepts_credits`** - a conta pode receber débitos automáticos e créditos.
* **`account_number_length_valid`** - o número da conta tem o comprimento que o banco espera.

O código de resultado os resume:

* **`MATCH`** - a conta existe e todos os campos que você enviou corresponderam, incluindo `id_match`.
* **`PARTIAL_MATCH`** - a conta pertence ao documento de identidade nacional enviado, mas pelo menos um dos outros campos que você enviou não correspondeu (por exemplo, um sobrenome grafado de forma diferente nos registros do banco). `outcome_detail` indica os campos que falharam.
* **`NO_MATCH`** - o banco não tem essa conta, ou a conta existe, mas pertence a outra pessoa. As duas são respostas conclusivas sobre a pessoa.

Uma verificação cruzada que você não solicitou não é contabilizada nem informada. A AVS responde `N` para todo campo que não foi fornecido, portanto `surname_match`, `initials_match`, `email_match`, `phone_match` e `account_type_match` aparecem em `source_data` somente quando você envia o dado correspondente. Por isso, enviar apenas `national_id`, `bank_account_number` e `bank_name` ainda produz um `MATCH` completo.

## Valores aceitos de bank\_name e account\_type

`bank_name` e `account_type` são enumerações. Um valor fora de qualquer uma das listas é recusado antes de a consulta ser executada, então um erro de digitação custa apenas uma ida e volta, e não uma cobrança.

`account_type` é opcional e aceita, sem diferenciar maiúsculas de minúsculas:

`current` · `savings` · `transmission` · `subscriptionShare` · `notKnown`

Omita-o quando você não souber o tipo de conta. A Didit então envia `notKnown`, a requisição é bem-sucedida e `account_type_match` retorna `false`, porque não havia nada para comparar. Qualquer outro valor (`checking`, `cheque`, `bond`) é rejeitado com um `400` que lista os valores aceitos.

`bank_name` é obrigatório, e estes valores têm aceitação confirmada (sem diferenciar maiúsculas de minúsculas):

`ABSA` · `Capitec` · `FNB` · `Nedbank` · `Standard Bank` · `Investec` · `African Bank` · `Discovery Bank` · `Old Mutual` · `Bank Zero` · `Tyme` · `Grindrod`

Contas de pessoa física em todos esses bancos estão incluídas, incluindo o Capitec. Envie a forma abreviada exatamente como listada: `Capitec`, e não `Capitec Bank`; `Tyme`, e não `TymeBank`. Um banco não reconhecido resulta em `REGISTRY_ERROR`, cujo `outcome_detail` indica o campo que a fonte recusou.

## Como distinguir uma conta inexistente de uma fonte indisponível

Esses são resultados HTTP diferentes, então não é preciso analisar mensagens de erro:

* **A conta não existe** - `200 OK`, `match_type: "no_match"`, `outcome_code: "NO_MATCH"`, `source_data.account_found: false`. Uma resposta real do banco. É cobrada, e a sua ação para ausência de correspondência é aplicada.
* **A fonte não respondeu** - `502 Bad Gateway` com `validation_errors[].code` = `empty_provider_response` e `retryable: true`. Nada foi apurado sobre a pessoa, nada é cobrado e é seguro tentar a requisição novamente.
* **A fonte se recusou a executar a consulta** - `400 Bad Request` com `validation_errors[].code` = `provider_rejected_input` e `retryable: false`. A fonte nem chegou a pesquisar, porque não aceitou o que recebeu. Corrija os dados; tentar novamente com os mesmos valores não terá sucesso. Nada é cobrado.
* **A fonte respondeu e rejeitou os seus dados** - `502 Bad Gateway` com `validation_errors[].code` = `provider_invalid_input` (por exemplo, um número de conta que não passa na verificação de formato do próprio banco). Não adianta tentar novamente até que os dados sejam corrigidos; nada é cobrado.
* **A sua requisição nunca saiu da Didit** - `400 Bad Request`, indicando o campo a corrigir. Nada é cobrado.

Apenas o primeiro desses casos é uma resposta sobre a pessoa. Trate um `502` como transitório (a AVS repassa a consulta ao banco do titular da conta em vez de ler um registro, por isso é o mais lento dos serviços sul-africanos) e tente novamente com backoff.

## Continue lendo

* [Visão geral da Validação de banco de dados da África do Sul](https://docs.didit.me/api-reference/database-validation/south-africa.md)
* [Visão geral da Validação de banco de dados](https://docs.didit.me/pt-br/core-technology/database-validation/overview.md)
* [Códigos de resultado](https://docs.didit.me/pt-br/core-technology/database-validation/database-validation-outcome-codes.md)


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