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

# API Skrining AML: Sanksi, PEP & Daftar Pantauan

> Skrining AML real-time terhadap 1.300+ daftar pantauan global. Sanksi, PEP, media negatif. Sistem dua skor risiko, $0.20/cek, tanpa minimum bulanan. Didit.



## OpenAPI

````yaml id/openapi-25.json POST /v3/aml/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API Verifikasi Identitas. Lakukan autentikasi dengan header x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/aml/:
    post:
      tags:
        - Standalone APIs
      summary: Skrining AML (mandiri)
      description: >-
        Lakukan skrining individu atau perusahaan terhadap dataset PEP, sanksi,
        peringatan/daftar pantauan, dan media negatif dalam satu panggilan.


        **Model dua skor.** Setiap temuan memiliki `match_score` (0–100,
        keyakinan identitas) dan `risk_score` (0–100, risiko entitas). Temuan
        yang memiliki `match_score` di bawah `aml_match_score_threshold`
        (default **93**) diberi tag `review_status: "False Positive"` dan
        diabaikan untuk tujuan risiko; `risk_score` tertinggi di antara temuan
        yang tersisa menjadi `aml.score`. `aml.status` akhir mengikuti ambang
        batas Anda: `score` > `aml_score_review_threshold` (default **100**) →
        `Declined`; `score` > `aml_score_approve_threshold` (default **80**) →
        `In Review`; jika tidak, `Approved`. Kapan pun `score` bernilai bukan
        nol dan ≥ ambang batas persetujuan, peringatan `POSSIBLE_MATCH_FOUND`
        ditambahkan (skor tepat 0 tidak pernah memunculkan peringatan).


        **Bobot skor kecocokan.** `aml_name_weight` + `aml_dob_weight` +
        `aml_country_weight` harus berjumlah tepat 100 (default 60/25/15).
        Komponen yang tidak ada dalam permintaan dinormalisasi ulang;
        `document_number` yang cocok berfungsi sebagai kunci utama yang
        menggantikan `match_score` menjadi 100.


        **Latensi.** Skrining biasa umumnya selesai dalam beberapa detik. Dengan
        `include_adverse_media=true`, API menunggu pengayaan media negatif (jeda
        awal ~5 detik ditambah polling hingga ~25 detik) — konfigurasikan batas
        waktu klien **setidaknya 60 detik**.


        **Persistensi.** `save_api_request` default-nya adalah **true**:
        skrining disimpan sebagai sesi (`request_id` berfungsi dengan `GET
        /v3/session/{sessionId}/decision/`), muncul di konsol, webhook
        `status.updated` terpicu, dan status peninjauan temuan dapat diperbarui
        nanti. Dengan `save_api_request=false`, tidak ada yang disimpan dan
        `request_id` adalah ID korelasi sementara.
        `include_ongoing_monitoring=true` terus melakukan skrining ulang profil
        dan memerlukan `save_api_request=true` (ditegakkan dengan `400`).


        **Idempotensi.** Kirim header `Idempotency-Key` saat mencoba lagi
        setelah batas waktu atau kesalahan sementara. Kunci ini berlaku untuk
        aplikasi Anda dan isi permintaan yang persis sama. Permintaan pertama
        yang selesai menyimpan responsnya; percobaan ulang berikutnya yang
        identik mengembalikan respons yang sama dan tidak menjalankan atau
        menagih skrining AML lainnya. Jika permintaan awal masih berjalan, coba
        lagi nanti dengan kunci yang sama. Jika kunci yang sama digunakan
        kembali dengan body yang berbeda, API mengembalikan `409`.


        **Penagihan.** Satu kredit AML API dikenakan setelah skrining pertama
        yang berhasil. Respons idempoten yang diputar ulang tidak dikenakan
        biaya lagi; saldo yang tidak mencukupi mengembalikan `403` sebelum
        skrining baru dilakukan.


        **Sandbox.** Kunci dari aplikasi sandbox melewati skrining dan penagihan
        sepenuhnya dan mengembalikan hasil tiruan — `Approved` dengan nol temuan
        kecuali Anda meneruskan `sandbox_scenario`. `save_api_request` berfungsi
        sama seperti pada kunci produksi, sehingga skrining sandbox yang
        disimpan dapat diambil melalui `GET /v3/session/{sessionId}/decision/`
        dan `GET /v3/session/{sessionId}/generate-pdf/`.
      operationId: post_v3aml
      parameters:
        - name: Idempotency-Key
          in: header
          required: false
          description: >-
            Kunci keamanan percobaan ulang opsional, hingga 255 karakter.
            Menggunakan kembali kunci yang sama dengan body permintaan yang sama
            akan mengembalikan respons asli tanpa menjalankan atau menagih biaya
            untuk skrining kedua. Menggunakan kembali kunci dengan body yang
            berbeda akan mengembalikan `409`.
          schema:
            type: string
            maxLength: 255
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - full_name
              properties:
                full_name:
                  type: string
                  minLength: 2
                  description: >-
                    Nama lengkap individu atau perusahaan yang akan diskrining.
                    Minimum **2 karakter** - batas minimum dari penyedia
                    skrining itu sendiri. Nama yang lebih pendek atau kosong
                    akan mengembalikan `400` pada kolom ini sebelum skrining apa
                    pun dijalankan, sehingga tidak ada yang ditagihkan.
                  example: Antonio Ejemplo Modelo
                entity_type:
                  type: string
                  enum:
                    - person
                    - company
                  default: person
                  description: >-
                    Jenis entitas yang akan diskrining. Secara default adalah
                    `person`.
                date_of_birth:
                  type: string
                  format: date
                  description: >-
                    Tanggal lahir (perorangan) atau tanggal pendirian
                    (perusahaan), `YYYY-MM-DD`. Meningkatkan presisi kecocokan
                    melalui bobot DOB.
                  example: '1972-02-29'
                nationality:
                  type: string
                  description: >-
                    Kode negara ISO 3166-1 **alpha-2** (misalnya `ES`). Kode
                    tidak valid mengembalikan `400`. Meningkatkan presisi
                    pencocokan melalui bobot negara.
                  example: ES
                document_number:
                  type: string
                  description: >-
                    Nomor dokumen identitas. Tidak diberi bobot — bertindak
                    sebagai kunci emas: kecocokan persis akan menimpa
                    `match_score` hasil pencarian menjadi 100, sedangkan
                    ketidakcocokan total akan memotong skornya. Dikirim ke
                    penyedia skrining sebagai filter pencarian hanya jika
                    berukuran **2-50 karakter**; nilai di luar rentang tersebut
                    diterima dan disimpan, dan skrining tetap berjalan serta
                    ditagih, hanya saja tidak dipersempit berdasarkan nomor
                    dokumen.
                aml_score_approve_threshold:
                  type: number
                  minimum: 0
                  maximum: 100
                  default: 80
                  description: >-
                    Ambang batas skor risiko yang pada atau di bawahnya
                    menghasilkan `Approved`. Harus ≤
                    `aml_score_review_threshold` (jika tidak, `400`).
                aml_score_review_threshold:
                  type: number
                  minimum: 0
                  maximum: 100
                  default: 100
                  description: >-
                    Ambang batas skor risiko yang jika dilampaui menghasilkan
                    `Declined`. Skor di antara kedua ambang batas menghasilkan
                    `In Review`.
                aml_name_weight:
                  type: integer
                  minimum: 0
                  maximum: 100
                  default: 60
                  description: >-
                    Bobot kemiripan nama dalam skor kecocokan per entri yang
                    cocok. Ketiga bobot harus berjumlah tepat 100 (jika tidak,
                    `400`).
                aml_dob_weight:
                  type: integer
                  minimum: 0
                  maximum: 100
                  default: 25
                  description: >-
                    Bobot tanggal lahir dalam skor kecocokan per entri yang
                    cocok.
                aml_country_weight:
                  type: integer
                  minimum: 0
                  maximum: 100
                  default: 15
                  description: >-
                    Bobot negara/kewarganegaraan dalam skor kecocokan per entri
                    yang cocok.
                aml_match_score_threshold:
                  type: integer
                  minimum: 0
                  maximum: 100
                  default: 93
                  description: >-
                    Batas per hit: hit dengan `match_score` di bawah nilai ini
                    dianggap `False Positive` (dikecualikan dari penilaian
                    risiko); nilai yang sama atau di atasnya dianggap kecocokan
                    potensial `Unreviewed`.
                include_adverse_media:
                  type: boolean
                  default: false
                  description: >-
                    Cari juga media berita untuk liputan negatif. Menambah
                    latensi hingga ~30 dtk saat hasil dikumpulkan — gunakan
                    batas waktu klien ≥60 dtk.
                include_ongoing_monitoring:
                  type: boolean
                  default: false
                  description: >-
                    Tetap lakukan skrining ulang profil ini dan kirimkan
                    perubahan melalui webhook. Memerlukan
                    `save_api_request=true` (jika tidak, `400`).
                save_api_request:
                  type: boolean
                  default: true
                  description: >-
                    Simpan skrining sebagai sesi (visibilitas konsol, endpoint
                    keputusan, webhook, peninjauan hit). Atur ke `false` untuk
                    pemeriksaan tanpa status.
                vendor_data:
                  type: string
                  description: >-
                    Pengenal Anda untuk pengguna yang diskrining; dikembalikan
                    dan disimpan bersama sesi.
                metadata:
                  type: object
                  nullable: true
                  description: >-
                    JSON bentuk bebas yang disimpan bersama permintaan dan
                    dikembalikan dalam respons.
                sandbox_scenario:
                  type: string
                  description: >-
                    Slug skenario khusus sandbox. Hanya diterima jika kunci API
                    milik aplikasi mode sandbox; ditolak pada aplikasi di
                    lingkungan produksi. Skrining mandiri tidak memiliki sesi
                    untuk dipicu, jadi slug diletakkan langsung pada permintaan
                    skrining: `decline_aml_hit` mengembalikan satu kecocokan
                    berformat produksi dan menetapkan skrining sebagai
                    `Declined`, `review_aml_possible_match` menetapkannya
                    sebagai `In Review`, dan skenario yang tidak menetapkan
                    hasil AML akan membiarkan skrining bersih. Lihat katalog
                    skenario di GET /v1/sandbox/scenarios/ atau [Sandbox & Test
                    Data](/id/integration/sandbox-testing).
                  example: decline_aml_hit
            example:
              full_name: Antonio Ejemplo Modelo
              entity_type: person
              date_of_birth: '1972-02-29'
              nationality: ES
              include_adverse_media: false
              vendor_data: user-1234
      responses:
        '200':
          description: >-
            Skrining selesai. `aml.status` mencerminkan ambang batas Anda;
            setiap temuan pada atau di atas batas minimum inklusi internal
            tercantum dalam `aml.hits` dengan `match_score` untuk identitas,
            `risk_score` untuk entitas, dan `score_breakdown` yang menjelaskan
            kecocokan tersebut.
          content:
            application/json:
              schema:
                type: object
                properties:
                  request_id:
                    type: string
                    format: uuid
                    description: >-
                      ID sesi yang disimpan saat `save_api_request=true` (dapat
                      digunakan dengan `GET /v3/session/{sessionId}/decision/`);
                      jika tidak, berupa UUID korelasi sementara.
                  aml:
                    type: object
                    properties:
                      status:
                        type: string
                        enum:
                          - Approved
                          - In Review
                          - Declined
                        description: >-
                          `Declined` ketika `score` >
                          `aml_score_review_threshold`; `In Review` ketika
                          `score` > `aml_score_approve_threshold`; `Approved`
                          jika tidak (termasuk ketika tidak ada skor yang
                          tersedia).
                      total_hits:
                        type: integer
                        description: Jumlah entri dalam `hits`.
                      entity_type:
                        type: string
                        enum:
                          - person
                          - company
                        description: Menampilkan kembali jenis entitas yang diskrining.
                      hits:
                        type: array
                        items:
                          type: object
                          description: >-
                            Satu hit skrining. `match_score` (0–100) mengukur
                            keyakinan identitas — hit di bawah
                            `aml_match_score_threshold` diberi tag
                            `review_status: "False Positive"` dan dikecualikan
                            dari penilaian risiko; hit pada atau di atasnya
                            adalah kecocokan potensial `"Unreviewed"`.
                            `risk_score` (0–100) mengukur seberapa berisiko
                            entitas yang cocok dan menentukan `aml.score`
                            tingkat atas.
                          properties:
                            id:
                              type: string
                              nullable: true
                              description: >-
                                Pengenal stabil dari Didit untuk hit: `hit_`
                                yang diikuti oleh 24 karakter heksadesimal.
                                Entitas cocok yang sama mempertahankan `id` yang
                                sama saat subjek menjalani skrining ulang.
                                Teruskan ini sebagai `hit_id` ke endpoint
                                peninjauan hit AML.
                            url:
                              type: string
                              nullable: true
                              description: >-
                                URL sumber untuk entitas yang cocok, jika
                                tersedia.
                            match:
                              type: boolean
                              nullable: true
                              description: >-
                                Flag pencocokan persis lama. Sebaiknya gunakan
                                `match_score` + `review_status`.
                            score:
                              type: number
                              nullable: true
                              description: >-
                                USANG skor kecocokan berbobot dalam rentang 0–1.
                                Gunakan `match_score` sebagai gantinya.
                            match_score:
                              type: number
                              nullable: true
                              description: >-
                                Keyakinan identitas (0–100). Dibandingkan dengan
                                `aml_match_score_threshold` untuk memisahkan
                                Positif Palsu dari Kemungkinan Kecocokan.
                            risk_score:
                              type: number
                              nullable: true
                              description: >-
                                Skor risiko entitas (0–100). `risk_score`
                                tertinggi di antara kecocokan yang bukan positif
                                palsu menjadi `aml.score` tingkat atas.
                            target:
                              type: boolean
                              nullable: true
                            caption:
                              type: string
                              nullable: true
                              description: Nama tampilan entitas yang cocok.
                            datasets:
                              type: array
                              nullable: true
                              items:
                                type: string
                                enum:
                                  - PEP
                                  - PEP Level 1
                                  - PEP Level 2
                                  - PEP Level 3
                                  - PEP Level 4
                                  - Sanctions
                                  - Adverse Media
                                  - Warnings and Regulatory Enforcement
                                  - Fitness and Probity
                                  - SIP
                                  - SIE
                                  - Insolvency
                                  - Other Lists
                              description: >-
                                Kategori risiko tempat entitas terdaftar: `PEP`
                                (dengan tingkatannya, `PEP Level 1` hingga `PEP
                                Level 4`), `Sanctions`, `Adverse Media`,
                                `Warnings and Regulatory Enforcement`, `Fitness
                                and Probity`, `SIP`, `SIE`, atau `Insolvency`.
                                `Other Lists` saat sumber entitas tidak
                                menyatakan kategori-kategori ini.
                            features:
                              type: object
                              nullable: true
                            properties:
                              type: object
                              nullable: true
                              description: >-
                                Profil entitas: `name`, `alias`, `notes`,
                                `gender`, `birthDate`, `birthPlace`,
                                `nationality`, `position`, dan larik biografis
                                lainnya (masing-masing nullable).
                            rca_name:
                              type: string
                              nullable: true
                              description: >-
                                Nama rekan dekat terkait yang menjadi perantara
                                pencocokan entitas, ketika temuan berupa RCA.
                            pep_matches:
                              type: array
                              description: Entri daftar PEP yang mendukung kecocokan ini.
                              items:
                                type: object
                                properties:
                                  list_name:
                                    type: string
                                  publisher:
                                    type: string
                                  source_url:
                                    type: string
                                  description:
                                    type: string
                                  matched_name:
                                    type: string
                                  pep_position:
                                    type: string
                                  date_of_birth:
                                    type: string
                                  place_of_birth:
                                    type: string
                                  aliases:
                                    type: array
                                    items:
                                      type: string
                                  education:
                                    type: array
                                    items:
                                      type: string
                                  other_sources:
                                    type: array
                                    items:
                                      type: string
                            sanction_matches:
                              type: array
                              items:
                                type: object
                              description: >-
                                Entri daftar sanksi yang mendasari kecocokan ini
                                (struktur daftar pendukung yang sama dengan
                                `pep_matches`, ditambah kolom khusus sanksi).
                            warning_matches:
                              type: array
                              items:
                                type: object
                              description: >-
                                Entri peringatan/daftar pantauan yang mendasari
                                kecocokan ini.
                            adverse_media_matches:
                              type: array
                              description: >-
                                Artikel media negatif. Terisi hanya jika
                                `include_adverse_media=true`.
                              items:
                                type: object
                                properties:
                                  headline:
                                    type: string
                                  summary:
                                    type: string
                                  sentiment:
                                    type: string
                                  sentiment_score:
                                    type: number
                                  source_url:
                                    type: string
                                  thumbnail:
                                    type: string
                                    nullable: true
                                  country:
                                    type: string
                                    nullable: true
                                  author_name:
                                    type: string
                                    nullable: true
                                  publication_date:
                                    type: string
                                    nullable: true
                                  adverse_keywords:
                                    type: array
                                    items:
                                      type: string
                                  other_sources:
                                    type: array
                                    items:
                                      type: string
                            adverse_media_details:
                              type: object
                              nullable: true
                              description: >-
                                Sentimen media negatif agregat untuk entitas
                                (`sentiment`, `sentiment_score`, peta frekuensi
                                `adverse_keywords`). Terisi hanya jika
                                `include_adverse_media=true`.
                            first_seen:
                              type: string
                              format: date-time
                              nullable: true
                              description: >-
                                Waktu ketika entitas pertama kali muncul dalam
                                kumpulan data.
                            last_seen:
                              type: string
                              format: date-time
                              nullable: true
                              description: >-
                                Pembaruan himpunan data terbaru yang menyertakan
                                entitas tersebut.
                            linked_entities:
                              type: array
                              description: >-
                                Hubungan yang diketahui dari entitas yang cocok
                                (keluarga, rekanan, perusahaan).
                              items:
                                type: object
                                properties:
                                  name:
                                    type: array
                                    items:
                                      type: string
                                  active:
                                    type: array
                                    items:
                                      type: string
                                  status:
                                    type: array
                                    items:
                                      type: string
                                  details:
                                    type: array
                                    items:
                                      type: string
                                  relation:
                                    type: array
                                    items:
                                      type: string
                            risk_view:
                              type: object
                              nullable: true
                              description: >-
                                Rincian risiko per dimensi (`crimes`,
                                `countries`, `categories`, `custom_list`),
                                masing-masing dengan `score`, `weightage`,
                                `risk_level`, dan peta `risk_scores`.
                            additional_information:
                              type: object
                              nullable: true
                              description: >-
                                Konteks tambahan bentuk bebas, misalnya array
                                `flag_summary` yang menjelaskan mengapa entitas
                                ditandai.
                            review_status:
                              type: string
                              nullable: true
                              enum:
                                - False Positive
                                - Unreviewed
                                - Confirmed Match
                                - Inconclusive
                              description: >-
                                `False Positive` — `match_score` di bawah
                                `aml_match_score_threshold`, dikecualikan dari
                                penilaian risiko. `Unreviewed` — kemungkinan
                                kecocokan yang menunggu peninjauan. `Confirmed
                                Match` / `Inconclusive` — diatur secara manual
                                oleh peninjau (melalui Business Console) pada
                                sesi yang disimpan; kemampuan peninjauan
                                tersebut bukan merupakan bagian dari spesifikasi
                                ini.
                            score_breakdown:
                              type: object
                              nullable: true
                              description: >-
                                Cara `match_score` dihitung. Nama, tanggal
                                lahir, dan negara masing-masing menyumbang
                                `<component>_score` ×
                                `<component>_weight_normalized` poin; bobot
                                dinormalisasi ulang saat suatu komponen tidak
                                ada dalam data yang diskrining. Nomor dokumen
                                tidak dibobotkan - nomor tersebut bertindak
                                sebagai 'golden key': `MATCH` mengganti skor
                                menjadi 100, `NEUTRAL` membiarkannya tidak
                                berubah, `HARD_MISMATCH` menerapkan penalti.
                              properties:
                                name_score:
                                  type: integer
                                  nullable: true
                                  description: Kemiripan nama mentah (0–100).
                                name_weight:
                                  type: integer
                                  nullable: true
                                  description: >-
                                    Bobot nama yang dikonfigurasi
                                    (`aml_name_weight`).
                                name_weight_normalized:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Bobot nama setelah normalisasi ulang
                                    (0–100).
                                name_contribution:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Poin yang dikontribusikan nama ke
                                    `total_score`.
                                dob_score:
                                  type: integer
                                  nullable: true
                                  description: >-
                                    Skor tanggal lahir sebagai persentase dari
                                    bobotnya (−100 hingga 100).
                                dob_weight:
                                  type: integer
                                  nullable: true
                                  description: >-
                                    Bobot tanggal lahir yang dikonfigurasi
                                    (`aml_dob_weight`).
                                dob_weight_normalized:
                                  type: number
                                  nullable: true
                                  description: Bobot DOB setelah normalisasi ulang (0–100).
                                dob_contribution:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Poin yang dikontribusikan tanggal lahir ke
                                    `total_score`.
                                country_score:
                                  type: integer
                                  nullable: true
                                  description: >-
                                    Skor negara sebagai persentase dari bobotnya
                                    (−100 hingga 100).
                                country_weight:
                                  type: integer
                                  nullable: true
                                  description: >-
                                    Bobot negara yang dikonfigurasi
                                    (`aml_country_weight`).
                                country_weight_normalized:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Bobot negara setelah normalisasi ulang
                                    (0–100).
                                country_contribution:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Poin yang dikontribusikan negara ke
                                    `total_score`.
                                document_number_match_type:
                                  type: string
                                  nullable: true
                                  enum:
                                    - MATCH
                                    - NEUTRAL
                                    - HARD_MISMATCH
                                  description: >-
                                    Hasil golden-key untuk perbandingan nomor
                                    dokumen.
                                document_number_effect:
                                  type: string
                                  nullable: true
                                  description: >-
                                    Deskripsi pengaruh nomor dokumen yang mudah
                                    dibaca manusia.
                                total_score:
                                  type: integer
                                  nullable: true
                                  description: >-
                                    Skor kecocokan berbobot akhir (0–100) —
                                    mencerminkan `match_score`.
                      score:
                        type: number
                        nullable: true
                        description: >-
                          Skor risiko AML keseluruhan (0–100): `risk_score`
                          tertinggi di antara hit yang bukan Positif Palsu.
                          Menentukan `status` melalui kedua ambang batas.
                      screened_data:
                        type: object
                        description: >-
                          Menampilkan kembali apa yang diskrining: `full_name`,
                          `date_of_birth`, `nationality`, `document_number`
                          (kolom yang tidak ada bernilai `null`).
                        properties:
                          full_name:
                            type: string
                          date_of_birth:
                            type: string
                            nullable: true
                          nationality:
                            type: string
                            nullable: true
                          document_number:
                            type: string
                            nullable: true
                      warnings:
                        type: array
                        items:
                          type: object
                          properties:
                            feature:
                              type: string
                              description: Fitur yang memunculkan peringatan.
                            risk:
                              type: string
                              description: Pengidentifikasi risiko yang dapat dibaca mesin.
                            additional_data:
                              type: object
                              nullable: true
                              description: >-
                                Konteks tambahan untuk peringatan, jika
                                tersedia.
                            log_type:
                              type: string
                              description: >-
                                `warning`, `information`, atau `error` —
                                pengaruh risiko terhadap hasilnya.
                            short_description:
                              type: string
                              description: Ringkasan satu baris yang dapat dibaca manusia.
                            long_description:
                              type: string
                              description: Penjelasan lengkap yang dapat dibaca manusia.
                        description: >-
                          Berisi peringatan `POSSIBLE_MATCH_FOUND` setiap kali
                          `score` bernilai bukan nol dan ≥
                          `aml_score_approve_threshold` (skor tepat 0 tidak
                          pernah memicu peringatan); kosong jika sebaliknya.
                  vendor_data:
                    type: string
                    nullable: true
                    description: Menampilkan kembali `vendor_data` yang Anda kirimkan.
                  metadata:
                    type: object
                    nullable: true
                    description: Salinan `metadata` yang Anda kirimkan.
                  created_at:
                    type: string
                    format: date-time
              examples:
                No hits (Approved):
                  summary: Skrining bersih — nol kecocokan
                  value:
                    request_id: d27c5509-7a66-45a9-b05e-d69d9f4c336a
                    aml:
                      status: Approved
                      total_hits: 0
                      entity_type: person
                      hits: []
                      score: 0
                      screened_data:
                        full_name: Maximilian Mustermann-Doe
                        date_of_birth: '1992-03-14'
                        nationality: DE
                        document_number: null
                      warnings: []
                    vendor_data: user-1234
                    metadata:
                      internal_ref: abc-123
                    created_at: '2026-06-11T10:21:07.013938+00:00'
                PEP hit (Approved — risk below approve threshold):
                  summary: >-
                    Satu kemungkinan kecocokan PEP; skor risiko 73 tetap berada
                    di bawah ambang batas persetujuan default yaitu 80
                  value:
                    request_id: 0b7e7a3e-65a1-4f3d-9c7a-1de2f9a40111
                    aml:
                      status: Approved
                      total_hits: 1
                      entity_type: person
                      hits:
                        - id: hit_7c1e9a40b2d35f86e0a4c912
                          url: https://news.example.org/articles/sample
                          match: false
                          score: 0.93
                          match_score: 93
                          risk_score: 73
                          target: null
                          caption: Antonio Ejemplo Modelo
                          datasets:
                            - PEP Level 1
                            - PEP
                          features: null
                          rca_name: ''
                          first_seen: '2026-01-07T00:00:00'
                          last_seen: '2026-01-07T00:00:00'
                          review_status: Unreviewed
                          properties:
                            name:
                              - Antonio Ejemplo Modelo
                              - Antonio Ejemplo
                            alias:
                              - Antonio Ejemplo Modelo
                              - Ejemplo Modelo, Pedro
                            notes:
                              - Prime Minister of Spain
                            gender:
                              - male
                            birthDate:
                              - '1972-02-29'
                            birthPlace:
                              - Madrid, Spain
                            nationality: null
                            position: null
                          risk_view:
                            crimes:
                              score: 0
                              weightage: 20
                              risk_level: Low
                              risk_scores: {}
                            countries:
                              score: 9.64
                              weightage: 30
                              risk_level: Low
                              risk_scores:
                                Spain: 25.71
                            categories:
                              score: 62.5
                              weightage: 50
                              risk_level: High
                              risk_scores:
                                PEP: 100
                                PEP Level 1: 100
                            custom_list: {}
                          score_breakdown:
                            name_score: 89
                            name_weight: 60
                            name_weight_normalized: 60
                            name_contribution: 53.4
                            dob_score: 100
                            dob_weight: 25
                            dob_weight_normalized: 25
                            dob_contribution: 25
                            country_score: 100
                            country_weight: 15
                            country_weight_normalized: 15
                            country_contribution: 15
                            document_number_match_type: NEUTRAL
                            document_number_effect: No document number provided for screening
                            total_score: 93
                          pep_matches:
                            - aliases: []
                              education: []
                              list_name: Presidency of the Government of Spain
                              publisher: Presidency of the Government of Spain
                              source_url: https://news.example.org/articles/sample
                              description: >-
                                The Presidency of the Government is the central
                                institutional body in Spain that supports the
                                Prime Minister and coordinates the general
                                action of the central government.
                              matched_name: Antonio Ejemplo Modelo
                              pep_position: ''
                              date_of_birth: '1972-02-29'
                              other_sources: []
                              place_of_birth: Madrid, Spain
                          sanction_matches: []
                          warning_matches: []
                          adverse_media_matches: []
                          adverse_media_details: null
                          linked_entities:
                            - name:
                                - Maria Begona Gomez Fernandez
                              active: []
                              status: []
                              details: []
                              relation:
                                - spouse
                          additional_information:
                            flag_summary:
                              - >-
                                Antonio Ejemplo Modelo has been flagged as a
                                Level 1 Politically Exposed Person (PEP) from
                                Spain, serving as the President of the
                                Government of Spain.
                      score: 73
                      screened_data:
                        full_name: Pedro Sanchez Perez-Castejon
                        date_of_birth: '1972-02-29'
                        nationality: ES
                        document_number: null
                      warnings: []
                    vendor_data: null
                    metadata: null
                    created_at: '2026-06-11T10:23:44.812000+00:00'
        '400':
          description: >-
            Kesalahan validasi. Masalah tingkat kolom mengembalikan format
            standar DRF (satu larik pesan per kolom yang bermasalah); aturan
            lintas kolom (jumlah bobot, pengurutan ambang batas, pemantauan
            tanpa penyimpanan) mengembalikan `{"error": [...]}`.
          content:
            application/json:
              examples:
                Missing full_name:
                  summary: '`full_name` adalah satu-satunya kolom yang wajib diisi'
                  value:
                    full_name:
                      - This field is required.
                Short full_name:
                  summary: '`full_name` harus memiliki minimal 2 karakter'
                  value:
                    full_name:
                      - Ensure this field has at least 2 characters.
                Invalid nationality:
                  summary: '`nationality` harus berupa ISO 3166-1 alpha-2'
                  value:
                    nationality:
                      - Invalid ISO 3166-1 alpha-2 country code.
                Weights do not sum to 100:
                  summary: >-
                    `aml_name_weight` + `aml_dob_weight` + `aml_country_weight`
                    ≠ 100
                  value:
                    error:
                      - >-
                        AML weights must sum to 100. Current sum: 90 (name: 50,
                        dob: 25, country: 15)
                Thresholds out of order:
                  summary: Ambang batas persetujuan di atas ambang batas peninjauan
                  value:
                    error:
                      - >-
                        Approve threshold (90.0) cannot be greater than review
                        threshold (80.0)
                Monitoring without saving:
                  summary: >-
                    `include_ongoing_monitoring=true` dengan
                    `save_api_request=false`
                  value:
                    error:
                      - >-
                        Ongoing monitoring can only be enabled when the API
                        request is saved.
        '403':
          description: >-
            Izin ditolak. Dikembalikan ketika header `x-api-key` tidak ada, dan
            juga ketika saldo organisasi pemanggil tidak dapat mencukupi biaya
            panggilan tersebut; kunci yang salah, dicabut, atau kedaluwarsa
            mengembalikan `401`. Kunci yang tidak ada mengembalikan `403` dengan
            `{"detail": ...}`; kunci yang salah, dicabut, atau kedaluwarsa
            mengembalikan `401`. Kekurangan kredit mengembalikan `403` dengan
            `{"error": ...}` sebelum skrining atau panggilan penyedia apa pun
            terjadi.
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: >-
                    Tidak ada header `x-api-key`, atau kuncinya tidak
                    valid/dicabut
                  value:
                    detail: You do not have permission to perform this action.
                Not enough credits:
                  summary: Saldo organisasi tidak mencukupi untuk panggilan ini
                  value:
                    error: >-
                      You don't have enough credits to perform this request.
                      Please top up at https://business.didit.me
        '429':
          description: >-
            Batas laju terlampaui. Endpoint POST/PATCH/DELETE berbagi anggaran
            300 permintaan penulisan per menit per kunci API (pembuatan
            transaksi dan ingesti event memiliki anggaran terpisah sebesar 600).
            Respons menyertakan header `X-RateLimit-Limit`,
            `X-RateLimit-Remaining`, `X-RateLimit-Reset`, dan `Retry-After`.
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: Lebih dari 300 permintaan tulis pada menit ini
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
              schema:
                type: object
                properties:
                  detail:
                    type: string
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v3/aml/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -H 'Idempotency-Key: aml-user-1234-2026-08-20' \
              -d '{
                "full_name": "Antonio Ejemplo Modelo",
                "entity_type": "person",
                "date_of_birth": "1972-02-29",
                "nationality": "ES",
                "include_adverse_media": false,
                "vendor_data": "user-1234"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.aml.screen(
                full_name="Antonio Ejemplo Modelo",
                entity_type="person",
                date_of_birth="1972-02-29",
                nationality="ES",
                include_adverse_media=False,
                vendor_data="user-1234",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.aml.screen({
              full_name: "Antonio Ejemplo Modelo",
              entity_type: "person",
              date_of_birth: "1972-02-29",
              nationality: "ES",
              include_adverse_media: false,
              vendor_data: "user-1234",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.AML.Screen(ctx, didit.AMLScreenParams{\n\tFullName:            \"Antonio Ejemplo Modelo\",\n\tEntityType:          didit.Some(didit.AMLScreenParamsEntityType(\"person\")),\n\tDateOfBirth:         didit.String(\"1972-02-29\"),\n\tNationality:         didit.String(\"ES\"),\n\tIncludeAdverseMedia: didit.Bool(false),\n\tVendorData:          didit.String(\"user-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: |-
            import java.time.LocalDate;
            import me.didit.Didit;
            import me.didit.types.AmlScreenParams;

            // Reads DIDIT_API_KEY.
            Didit client = new Didit();

            var result = client.aml().screen(AmlScreenParams.builder()
                    .fullName("Antonio Ejemplo Modelo")
                    .entityType(AmlScreenParams.EntityType.of("person"))
                    .dateOfBirth(LocalDate.parse("1972-02-29"))
                    .nationality("ES")
                    .includeAdverseMedia(false)
                    .vendorData("user-1234")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->aml->screen([
                'full_name' => 'Antonio Ejemplo Modelo',
                'entity_type' => 'person',
                'date_of_birth' => '1972-02-29',
                'nationality' => 'ES',
                'include_adverse_media' => false,
                'vendor_data' => 'user-1234',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.aml.screen(
              full_name: "Antonio Ejemplo Modelo",
              entity_type: "person",
              date_of_birth: "1972-02-29",
              nationality: "ES",
              include_adverse_media: false,
              vendor_data: "user-1234"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: |-
            using System;
            using System.Text.Json;
            using Didit;

            // Reads DIDIT_API_KEY.
            using var client = new DiditClient();

            var result = await client.Aml.ScreenAsync(new AmlScreenParams
            {
                FullName = "Antonio Ejemplo Modelo",
                EntityType = new AmlScreenParamsEntityType("person"),
                DateOfBirth = "1972-02-29",
                Nationality = "ES",
                IncludeAdverseMedia = false,
                VendorData = "user-1234",
            });
            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Kunci API aplikasi Anda, dari Developers -> API keys di Business
        Console. Kunci utama memiliki akses penuh. Kunci bernama dapat diberi
        cakupan: none, read, atau write per sumber daya, dibatasi pada beberapa
        alur kerja atau pada sesi yang disetujui, pada daftar alamat IP, dan
        pada tanggal kedaluwarsa. 401 berarti kuncinya salah, dicabut, atau
        kedaluwarsa; 403 berarti tidak ada kunci yang dikirimkan, kunci tidak
        memiliki akses ke sumber daya atau tindakan ini, atau permintaan datang
        dari alamat di luar daftar IP-nya; 404 pada rute sesi berarti sesi
        berada di luar alur kerja atau status kunci tersebut. Kunci tanpa akses
        media menerima URL gambar, video, dan PDF sebagai null, dan kunci tanpa
        izin tulis sesi menerima tautan sesi dan token sebagai null. Lihat
        https://docs.didit.me/console/api-keys.

````

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