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"
{
"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"
}
}
]
}
{
"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"
}
}
]
}
{
"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"
}
}
]
}
🇿🇦 África do Sul
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.
POST
/
v3
/
database-validation
/
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"
{
"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"
}
}
]
}
{
"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"
}
}
]
}
{
"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"
}
}
]
}
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
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
string
padrão:"ZAF"
obrigatório
Código de país ISO 3166-1 alpha-3 deste serviço de banco de dados.Exemplo:
ZAFstring
padrão:"zaf_bank_account_holder"
obrigatório
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_holderboolean
padrão:"true"
obrigatório
Consentimento explícito do usuário final para este serviço.Exemplo:
truestring
padrão:"8708150847085"
obrigatório
Número de identidade nacional para este serviço.Exemplo:
8708150847085string
padrão:"1234567890"
obrigatório
Valor de
bank_account_number exigido por este serviço de banco de dados.Exemplo: 1234567890string
padrão:"ABSA"
obrigatório
Valor de
bank_name exigido por este serviço de banco de dados.Exemplo: ABSAstring
padrão:"current"
Valor de
account_type exigido por este serviço de banco de dados.Exemplo: currentstring
Nome a ser validado.Exemplo:
Johnstring
padrão:"Doe"
Sobrenome a ser validado.Exemplo:
Doestring
padrão:"JD"
Valor de
initials exigido por este serviço de banco de dados.Exemplo: JDstring
Endereço de e-mail.Exemplo:
john.doe@example.comstring
Valor de
phone_number exigido por este serviço de banco de dados.Exemplo: +15550101000string
padrão:"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-1234Regras de entrada e observações de validação
account_typedeve 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 envianotKnowne 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
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 que você configurou podem substituí-lo.MATCH: o registro confirmou a identidade e todos os campos verificados corresponderam.{
"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.{
"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.{
"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 emsource_data dependem do que o registro retorna. O exemplo gerado para zaf_bank_account_holder documenta atualmente esta estrutura normalizada:
accepts_creditsaccepts_debitsaccount_foundaccount_number_length_validaccount_openaccount_type_matchid_matchidentification_numberinitials_matchsurname_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 deinitialselast_nameenviados correspondem ao titular da conta registrado.account_type_match- oaccount_typeenviado corresponde ao tipo real da conta.email_match,phone_match- os valores deemailephone_numberenviados 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.
MATCH- a conta existe e todos os campos que você enviou corresponderam, incluindoid_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_detailindica 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.
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 Gatewaycomvalidation_errors[].code=empty_provider_responseeretryable: 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 Requestcomvalidation_errors[].code=provider_rejected_inputeretryable: 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 Gatewaycomvalidation_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.
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
Última modificação em 1 de novembro de 2026