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

# Verifikasi Pemegang Rekening Bank Afrika Selatan API

> Validasi pemegang rekening bank Afrika Selatan lewat database resmi via Didit. Mulai dari $0.40 per panggilan, tanpa kontrak, tanpa minimum.

Mengonfirmasi bahwa rekening bank Afrika Selatan milik pemegang rekening yang disebutkan, melalui layanan Account Holder Verification antarbank. Didit menyediakan layanan ini melalui `POST /v3/database-validation/` agar Anda dapat memvalidasi data yang dikirim terhadap sumber resmi dan menerima hasil kecocokan yang sudah dinormalisasi.

## Cakupan

* **Cakupan:** —
* **Negara:** Afrika Selatan
* **ID layanan:** `zaf_bank_account_holder`
* **Domain data:** Keuangan
* **Kategori:** Perbankan

## Input

| Kolom | Wajib | Contoh |
| - | -: | - |
| `national_id` | Ya | `8708150847085` |
| `bank_account_number` | Ya | `1234567890` |
| `bank_name` | Ya | `ABSA` |
| `account_type` | Tidak | `current` |
| `first_name` | Tidak | `John` |
| `last_name` | Tidak | `Doe` |
| `initials` | Tidak | `JD` |
| `email` | Tidak | `john.doe@example.com` |
| `phone_number` | Tidak | `+15550101000` |
| `vendor_data` | Tidak | `user-1234` |

* **Input wajib:** `national_id`, `bank_account_number`, `bank_name`
* **Input opsional:** `account_type`, `first_name`, `last_name`, `initials`, `email`, `phone_number`, `vendor_data`
* **Persetujuan:** Wajib
* **Ketersediaan di alur kerja:** Tersedia di alur kerja dengan pemetaan kolom
* **Cakupan:** —
* **Harga:** \$0.40 per kueri yang berhasil

Dalam alur kerja, `bank_account_number` dan `bank_name` tidak tercetak pada dokumen identitas, sehingga tidak ada langkah yang menghasilkannya sendiri. Kumpulkan keduanya dari jawaban Kuesioner, dari kolom hasil ekstraksi Document AI, atau dari nilai yang Anda kirim saat membuat sesi, lalu petakan masing-masing pada langkah Validasi Database. Sampai keduanya dipetakan, editor alur kerja menampilkan layanan ini dalam keadaan nonaktif dan menyebutkan input yang belum ada. Saat dijalankan, input yang hilang berarti pemeriksaan dilewati sebelum ada kueri apa pun, sehingga Anda tidak pernah ditagih untuk database yang tidak dapat dikueri.

## Parameter body

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

Kode negara ISO 3166-1 alpha-3 untuk layanan database ini.

Contoh: `ZAF`

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

Array yang berisi ID layanan ini. Mengunci layanan membuat permintaan tetap terbatas pada database yang tepat ini.

Contoh: `zaf_bank_account_holder`

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

Persetujuan eksplisit dari pengguna akhir untuk layanan ini.

Contoh: `true`

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

Nomor identitas nasional untuk layanan ini.

Contoh: `8708150847085`

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

Nilai `bank_account_number` yang diwajibkan oleh layanan database ini.

Contoh: `1234567890`

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

Nilai `bank_name` yang diwajibkan oleh layanan database ini.

Contoh: `ABSA`

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

Nilai `account_type` yang diwajibkan oleh layanan database ini.

Contoh: `current`

**first\_name** `string`

Nama depan yang akan divalidasi.

Contoh: `John`

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

Nama belakang yang akan divalidasi.

Contoh: `Doe`

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

Nilai `initials` yang diwajibkan oleh layanan database ini.

Contoh: `JD`

**email** `string`

Alamat email.

Contoh: `john.doe@example.com`

**phone\_number** `string`

Nilai `phone_number` yang diwajibkan oleh layanan database ini.

Contoh: `+15550101000`

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

Referensi pengguna stabil Anda untuk orang ini, misalnya ID pengguna internal Anda. Didit menggunakannya untuk menautkan pemeriksaan yang berdiri sendiri ke pengguna akhir yang sama dan mengurangi gangguan pada deteksi duplikat.

Contoh: `user-1234`

## Aturan input & catatan validasi

* `account_type` harus salah satu tipe akun AVS Afrika Selatan: `current`, `savings`, `transmission`, `subscriptionShare`, `notKnown`. Pencocokan tidak sensitif terhadap huruf besar-kecil. Hilangkan kolom ini jika Anda tidak mengetahui tipe akunnya: Didit kemudian mengirim `notKnown`, dan pemeriksaan silang tipe akun dilaporkan sebagai tidak terkonfirmasi, bukan membuat permintaan gagal.

## Cara memanggil

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

Setiap panggilan yang berhasil mengembalikan HTTP `200`. Kolom **`outcome_code`** memberi tahu Anda apa yang sebenarnya terjadi, misalnya membedakan ketidakcocokan biometrik nyata (`BIOMETRIC_NO_MATCH`) dari swafoto yang tidak dapat dibaca (`BIOMETRIC_IMAGE_UNUSABLE`). `status` yang ditampilkan adalah status fitur default. [Tindakan Kecocokan Sebagian / Tidak Ada Kecocokan](https://docs.didit.me/id/core-technology/database-validation/database-validation-warnings.md) yang Anda konfigurasi dapat menggantinya.

**`MATCH`**: Registri mengonfirmasi identitas dan setiap kolom yang diperiksa cocok.

```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`**: Nomor identifikasi ditemukan, tetapi satu atau lebih kolom pribadi (biasanya nama atau tanggal lahir) tidak sepenuhnya cocok.

```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`**: Registri tidak mengembalikan kecocokan untuk data yang dikirim.

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

## Data yang dikembalikan

Kolom pasti yang muncul di `source_data` bergantung pada apa yang dikembalikan registri. Contoh yang dihasilkan untuk `zaf_bank_account_holder` saat ini mendokumentasikan bentuk ternormalisasi berikut:

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

## Harga & SLA

Kueri Verifikasi Pemegang Rekening Bank di Afrika Selatan hanya ditagih ketika Didit menerima hasil konklusif dari sumber validasi.

* **Harga per panggilan:** \$0.40 USD.
* **Penagihan:** per kueri yang berhasil. Anda tidak dikenai biaya ketika registri tidak dapat dijangkau, ketika kolom wajib tidak ada, atau ketika permintaan ditolak sebelum mencapai sumber.
* **Latensi:** p95 tipikal \< 2 detik.
* **Ketersediaan:** 99.9% per kuartal di sisi Didit; ketersediaan sumber hilir bervariasi menurut negara dan dataset.

## Apa yang Dikonfirmasi oleh MATCH

Verifikasi Pemegang Rekening (AVS) adalah serangkaian pemeriksaan silang ya/tidak, bukan pencarian catatan. Sumber tidak pernah mengembalikan nama, nomor ID, atau saldo rekening. Sumber mengambil detail yang Anda kirim, membandingkannya dengan data yang dimiliki bank untuk rekening tersebut, lalu menjawab setiap perbandingan dengan sebuah flag. `source_data` memuat penanda tersebut:

* **`account_found`** - bank memiliki rekening dengan nomor ini. Semua yang lain tidak berarti ketika nilai ini `false`.
* **`account_open`** - rekening masih terbuka. Sebuah rekening bisa ditemukan tetapi sudah ditutup.
* **`id_match`** - rekening dimiliki oleh ID nasional yang Anda kirim. Inilah pemeriksaan yang menjadi alasan layanan ini ada.
* **`initials_match`**, **`surname_match`** - `initials` dan `last_name` yang Anda kirim cocok dengan pemegang rekening dalam catatan.
* **`account_type_match`** - `account_type` yang Anda kirim cocok dengan jenis rekening yang sebenarnya.
* **`email_match`**, **`phone_match`** - `email` dan `phone_number` yang Anda kirim cocok dengan detail kontak yang dimiliki bank.
* **`accepts_debits`**, **`accepts_credits`** - rekening dapat menerima instruksi debit dan kredit.
* **`account_number_length_valid`** - nomor rekening memiliki panjang yang diharapkan bank.

Kode hasil merangkum penanda tersebut:

* **`MATCH`** - rekening ada dan setiap kolom yang Anda kirim cocok, termasuk `id_match`.
* **`PARTIAL_MATCH`** - rekening dimiliki oleh ID nasional yang Anda kirim, tetapi setidaknya satu kolom lain yang Anda kirim tidak cocok (misalnya nama keluarga yang ejaannya berbeda dalam catatan bank). `outcome_detail` menyebutkan kolom yang gagal.
* **`NO_MATCH`** - bank tidak memiliki rekening tersebut, atau rekening ada tetapi milik orang lain. Keduanya adalah jawaban konklusif tentang orang tersebut.

Pemeriksaan silang yang tidak Anda minta tidak dihitung dan tidak dilaporkan. AVS menjawab `N` untuk setiap kolom yang tidak diberikan, sehingga `surname_match`, `initials_match`, `email_match`, `phone_match` dan `account_type_match` hanya muncul di `source_data` ketika Anda mengirim input yang sesuai. Karena itu, hanya mengirim `national_id`, `bank_account_number` dan `bank_name` tetap menghasilkan `MATCH` penuh.

## Nilai bank\_name dan account\_type yang diterima

`bank_name` dan `account_type` adalah enumerasi. Nilai di luar salah satu daftar ditolak sebelum kueri dijalankan, sehingga salah ketik hanya memerlukan satu putaran komunikasi, bukan biaya.

`account_type` bersifat opsional dan menerima nilai berikut, tanpa membedakan huruf besar dan kecil:

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

Hilangkan kolom ini jika Anda tidak mengetahui jenis rekening. Didit kemudian mengirim `notKnown`, permintaan berhasil, dan `account_type_match` bernilai `false` karena tidak ada yang bisa dibandingkan. Nilai lain - `checking`, `cheque`, `bond` - ditolak dengan `400` yang mencantumkan kumpulan nilai yang diterima.

`bank_name` wajib diisi, dan nilai-nilai berikut telah dikonfirmasi diterima (tanpa membedakan huruf besar dan kecil):

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

Rekening konsumen di semua bank ini termasuk dalam cakupan, termasuk Capitec. Kirim bentuk singkat persis seperti yang tercantum - `Capitec`, bukan `Capitec Bank`; `Tyme`, bukan `TymeBank`. Bank yang tidak dikenali menghasilkan `REGISTRY_ERROR` dengan `outcome_detail` yang menyebutkan kolom yang ditolak sumber.

## Membedakan rekening yang tidak ada dari sumber yang tidak tersedia

Ini adalah hasil HTTP yang berbeda, sehingga tidak diperlukan penguraian string error:

* **Rekening tidak ada** - `200 OK`, `match_type: "no_match"`, `outcome_code: "NO_MATCH"`, `source_data.account_found: false`. Ini adalah jawaban nyata dari bank. Ditagih, dan tindakan Anda untuk kondisi no-match berlaku.
* **Sumber tidak menjawab** - `502 Bad Gateway` dengan `validation_errors[].code` = `empty_provider_response` dan `retryable: true`. Tidak ada yang terbukti tentang orang tersebut, tidak ada yang ditagih, dan permintaan aman untuk dicoba lagi.
* **Sumber menolak menjalankan kueri** - `400 Bad Request` dengan `validation_errors[].code` = `provider_rejected_input` dan `retryable: false`. Sumber tidak pernah melakukan pencarian karena tidak mau menerima data yang dikirim. Perbaiki data; mencoba lagi dengan nilai yang sama tidak akan berhasil. Tidak ada yang ditagih.
* **Sumber menjawab dan menolak input Anda** - `502 Bad Gateway` dengan `validation_errors[].code` = `provider_invalid_input` (misalnya nomor rekening yang gagal pemeriksaan format milik bank). Mencoba lagi tidak ada gunanya sampai input diperbaiki; tidak ada yang ditagih.
* **Permintaan Anda tidak pernah keluar dari Didit** - `400 Bad Request`, yang mencantumkan kolom yang harus diperbaiki. Tidak ada yang ditagih.

Hanya yang pertama di antara semua ini yang merupakan jawaban tentang orang tersebut. Perlakukan `502` sebagai sementara - AVS meneruskan permintaan ke bank pemegang rekening alih-alih membaca registri, sehingga ini adalah layanan Afrika Selatan yang paling lambat - dan coba lagi dengan jeda bertahap.

## Lanjutkan membaca

* [Ikhtisar Validasi Database Afrika Selatan](https://docs.didit.me/api-reference/database-validation/south-africa.md)
* [Ikhtisar Validasi Database](https://docs.didit.me/id/core-technology/database-validation/overview.md)
* [Kode Hasil](https://docs.didit.me/id/core-technology/database-validation/database-validation-outcome-codes.md)


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