> ## 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 Identitas API: OCR Dokumen & Keaslian

> Didit: verifikasi dokumen identitas di 220+ negara dan 14,000+ jenis. Keaslian, OCR, MRZ, inferensi sub-2s, bayar per pemakaian, tanpa kontrak.



## OpenAPI

````yaml id/openapi-25.json POST /v3/id-verification/
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/id-verification/:
    post:
      tags:
        - Standalone APIs
      summary: Verifikasi Identitas (OCR dokumen + pemeriksaan penipuan)
      description: >-
        Lakukan OCR pada dokumen identitas dan jalankan pemeriksaan penipuan
        dokumen dalam satu panggilan — mengembalikan kolom pemegang dokumen yang
        diekstrak, MRZ yang diurai, `status` `Approved`/`Declined`/`In Review`,
        serta daftar `warnings` yang menjelaskan setiap masalah yang ditemukan.
        Mendukung 14,000+ jenis dokumen dari 220+ negara dan wilayah.


        **Cara kerjanya.** Kirimkan `front_image` dokumen (wajib) dan, untuk
        dokumen dua sisi, `back_image`. Unggah foto yang tidak dipotong dengan
        keempat sudut dokumen terlihat — layanan mendeteksi, menyelaraskan, dan
        memotong dokumen secara mandiri, jadi jangan memotongnya terlebih
        dahulu. Dokumen diklasifikasikan secara otomatis (Anda tidak perlu
        menyatakan negara atau jenis dokumen), zona visual dibaca dengan OCR,
        serta MRZ dan kode batang apa pun didekode. Pemeriksaan silang kemudian
        memvalidasi tanggal, format angka, dan digit pemeriksa MRZ, serta
        membandingkan zona visual dengan MRZ. Dengan
        `perform_document_liveness=true`, gambar juga diskrining terhadap
        pemutaran ulang layar, salinan cetak, dan manipulasi potret.


        **Logika keputusan.** `status` adalah `Approved` kecuali jika setidaknya
        satu peringatan menghasilkan penolakan. Risiko penipuan dan kegagalan
        fatal selalu menolak: `DOCUMENT_EXPIRED`, `SCREEN_CAPTURE_DETECTED`,
        `PRINTED_COPY_DETECTED`, `PORTRAIT_MANIPULATION_DETECTED`,
        `PUBLIC_DOCUMENT_IMAGE_DETECTED`, ditambah kegagalan ekstraksi
        (`NAME_NOT_DETECTED`, `DATE_OF_BIRTH_NOT_DETECTED`,
        `DOCUMENT_NUMBER_NOT_DETECTED`). (`PORTRAIT_IMAGE_NOT_DETECTED`,
        `INVALID_DATE`, dan `MRZ_NOT_DETECTED` ada di dalam sesi alur kerja
        tetapi tidak pernah dihasilkan oleh endpoint mandiri ini.
        `COULD_NOT_DETECT_DOCUMENT_TYPE` dikembalikan di sini ketika gambar
        depan tidak cocok dengan desain dokumen resmi yang diketahui dengan
        keyakinan tinggi, dan menolak permintaan tersebut.) Tiga kelompok risiko
        dapat dikonfigurasi per permintaan melalui `invalid_mrz_action`,
        `inconsistent_data_action`, dan `expiration_date_not_detected_action`
        (`DECLINE` atau `NO_ACTION`). Semua peringatan lainnya (misalnya
        `POSSIBLE_DUPLICATED_USER`) bersifat informasional dan tidak pernah
        menolak dengan sendirinya. Ketika `perform_document_liveness=true`
        (secara bawaan) dan pemeriksaan pemalsuan tidak menghasilkan skor yang
        dapat digunakan — penyedia gagal, merespons non-200, atau merespons HTTP
        200 dengan `status="ERR"` - panggilan mengembalikan `200` dengan
        `status: "In Review"` dan peringatan `DOCUMENT_LIVENESS_NOT_COMPUTED`
        (`log_type: "warning"`) alih-alih `Approved`: pemeriksaan yang tidak
        berjalan bukanlah bukti bahwa dokumen tersebut asli. Eskalasi ini tidak
        dapat dikonfigurasi dan tidak pernah menggantikan `Declined`; dengan
        `perform_document_liveness=false`, pemeriksaan dilewati dan status
        mengikuti sisa peringatan seperti sebelumnya. Dokumen yang tidak dapat
        diproses sama sekali mengembalikan `400` dengan `{"error":
        "COULD_NOT_RECOGNIZE_DOCUMENT"}`; dokumen yang dapat dibaca tetapi
        bermasalah mengembalikan `200` dengan `status: "Declined"` — selalu
        periksa `id_verification.status` dan `id_verification.warnings`, bukan
        hanya kode HTTP.


        **Penagihan.** Setiap respons `200` menggunakan satu kredit API
        Verifikasi Identitas (dibayar dari kredit paket atau saldo isi ulang
        Anda). Ketika saldo organisasi tidak dapat mencukupi panggilan, endpoint
        mengembalikan `403` dengan kesalahan tidak cukup kredit sebelum
        pemrosesan gambar apa pun.


        **Persistensi sesi (`save_api_request`, secara bawaan `true`).** Ketika
        `true`, panggilan disimpan secara persisten sebagai sesi bertipe API:
        sesi muncul di Business Console, `request_id` yang dikembalikan adalah
        ID sesi nyata yang dapat Anda teruskan ke `GET
        /v3/session/{sessionId}/decision/`, gambar dokumen/potret yang telah
        dipotong disimpan dan dikembalikan sebagai URL media sementara
        (`https://<media-host>/ocr/...`), dan webhook `status.updated`
        dipancarkan ke endpoint webhook yang Anda konfigurasi. Ketika `false`,
        tidak ada yang disimpan, `request_id` adalah UUID korelasi satu kali,
        dan `portrait_image`/`front_image`/`back_image` dikembalikan secara
        langsung sebagai string JPEG yang dienkode base64.


        **Sandbox.** Kunci API sandbox melewati semua pemrosesan dan penagihan:
        setelah validasi permintaan (input yang salah format tetap mengembalikan
        `400`), endpoint mengembalikan payload tiruan `Approved` statis (kartu
        identitas AS "Sandbox User" fiktif), tidak ada sesi yang disimpan secara
        persisten, dan tidak ada kredit yang digunakan.


        **Autentikasi.** Kirim kunci API aplikasi Anda di header `x-api-key`.
        Kredensial yang hilang atau tidak valid mengembalikan `403` (`{"detail":
        "You do not have permission to perform this action."}`) — API ini tidak
        pernah mengembalikan `401`.


        **Batas laju.** Anggaran tulis bersama sebesar 300 permintaan/menit per
        kunci API di seluruh endpoint POST/PATCH/DELETE; melampauinya akan
        mengembalikan `429`.
      operationId: post_v3id-verification
      parameters: []
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - front_image
              properties:
                front_image:
                  type: string
                  format: binary
                  description: >-
                    Sisi depan dokumen identitas. Ekstensi yang diizinkan:
                    `tiff`, `jpg`, `jpeg`, `png`, `webp`, `pdf`. Ukuran unggahan
                    maksimum: **10 MB** (file yang lebih besar ditolak dengan
                    `400`). Dokumen PDF dirender menjadi gambar sebelum proses
                    OCR; PDF terenkripsi memerlukan `front_image_password`.
                    Gambar otomatis dikompresi menjadi ~0.5 MB dan orientasi
                    EXIF diterapkan. Unggah hasil pengambilan penuh yang tidak
                    dipotong dengan keempat sudut dokumen terlihat jelas.
                front_image_password:
                  type: string
                  description: >-
                    Kata sandi untuk mendekripsi `front_image` jika berupa PDF
                    terenkripsi. Mengirimkan PDF terenkripsi tanpa kata sandi
                    (atau dengan kata sandi yang salah) mengembalikan `400`.
                  writeOnly: true
                back_image:
                  type: string
                  format: binary
                  description: >-
                    Sisi belakang dokumen — kirimkan setiap kali dokumen
                    memilikinya (banyak kartu identitas memiliki MRZ atau
                    barcode di bagian belakang; mengabaikannya hanya akan
                    mengosongkan MRZ dan kolom sisi belakang dalam respons —
                    endpoint ini tidak memunculkan peringatan MRZ yang hilang).
                    Batas format dan ukuran sama dengan `front_image`. Jika
                    diabaikan, `back_image` dan kolom sisi belakang bernilai
                    `null` dalam respons.
                back_image_password:
                  type: string
                  description: >-
                    Kata sandi untuk mendekripsi `back_image` jika berupa PDF
                    terenkripsi.
                  writeOnly: true
                perform_document_liveness:
                  type: boolean
                  default: true
                  description: >-
                    Memeriksa kedua gambar untuk serangan presentasi: pemutaran
                    ulang layar (`SCREEN_CAPTURE_DETECTED`), salinan cetak
                    (`PRINTED_COPY_DETECTED`), dan manipulasi potret
                    (`PORTRAIT_MANIPULATION_DETECTED`). Salah satu dari kondisi
                    ini akan menyebabkan penolakan otomatis. Diaktifkan secara
                    default; atur ke `false` untuk melewati skrining penipuan
                    dan mengurangi latensi. Ketika diaktifkan dan penyedia tidak
                    mengembalikan skor yang dapat digunakan, responsnya adalah
                    `In Review` dengan peringatan
                    `DOCUMENT_LIVENESS_NOT_COMPUTED` alih-alih `Approved`.
                  example: true
                minimum_age:
                  type: integer
                  nullable: true
                  default: null
                  minimum: 1
                  maximum: 120
                  description: >-
                    Diterima dan divalidasi (1–120) tetapi **saat ini tidak
                    diterapkan** oleh endpoint ini — kolom ini tidak pernah
                    menghasilkan peringatan `MINIMUM_AGE_NOT_MET`. Terapkan
                    aturan usia dari `date_of_birth`/`age` yang dikembalikan,
                    atau gunakan alur kerja sesi verifikasi dengan pembatasan
                    usia.
                expiration_date_not_detected_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Tindakan yang diambil saat tanggal kedaluwarsa tidak dapat
                    dibaca (`EXPIRATION_DATE_NOT_DETECTED`). Default `NO_ACTION`
                    karena banyak dokumen identitas tidak mencantumkan tanggal
                    kedaluwarsa. Catatan: tanggal kedaluwarsa yang *terdeteksi
                    dan telah lewat* selalu ditolak (`DOCUMENT_EXPIRED`),
                    terlepas dari opsi ini.
                invalid_mrz_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: DECLINE
                  description: >-
                    Tindakan yang harus diambil ketika MRZ yang diekstrak gagal
                    dalam validasi check-digit (`MRZ_VALIDATION_FAILED`). MRZ
                    yang hilang tidak memunculkan peringatan pada endpoint ini.
                    Hanya relevan untuk dokumen yang memiliki MRZ. `REVIEW`
                    tidak didukung pada endpoint ini dan mengembalikan `400`.
                inconsistent_data_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: DECLINE
                  description: >-
                    Tindakan yang diambil saat data yang diekstraksi tidak
                    konsisten secara internal: `DATA_INCONSISTENT`,
                    `MRZ_AND_DATA_EXTRACTED_FROM_OCR_NOT_SAME` (zona visual
                    tidak sesuai dengan MRZ), atau
                    `DOCUMENT_NAME_DIFFERENT_FROM_OTHER_APPROVED_DOCUMENTS`.
                critical_field_occlusion_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: DECLINE
                  description: >-
                    Tindakan yang diambil saat kolom tercetak yang penting
                    tertutup secara fisik pada hasil pengambilan gambar
                    (`CRITICAL_FIELD_OCCLUSION_DETECTED`) - nomor identitas,
                    nama, tanggal lahir, atau tanggal kedaluwarsa. Ditolak
                    secara default, sama seperti risiko integritas dokumen
                    lainnya pada endpoint ini: menutupi nomor yang menjadi acuan
                    rekonsiliasi laporan merupakan bentuk dokumen yang
                    disunting. Nilai yang terbaca untuk kolom yang tertutup akan
                    tetap dihapus dari ekstraksi, sehingga peringatan
                    `*_NOT_DETECTED` yang sesuai biasanya menyertainya. `REVIEW`
                    tidak didukung pada endpoint ini dan mengembalikan `400`.
                document_or_personal_number_format_mismatch_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Tindakan yang diambil saat nomor tidak cocok dengan format
                    yang digunakan oleh otoritas penerbit untuk jenis dokumen
                    tersebut (`DOCUMENT_NUMBER_FORMAT_MISMATCH`,
                    `PERSONAL_NUMBER_FORMAT_MISMATCH`). Default `NO_ACTION`,
                    yang melaporkan peringatan tanpa mengubah status. `REVIEW`
                    tidak didukung pada endpoint ini dan mengembalikan `400`.
                preferred_characters:
                  type: string
                  enum:
                    - latin
                    - non_latin
                  default: latin
                  description: >-
                    Aksara pilihan untuk kolom nama/alamat pada dokumen yang
                    mencetak teks Latin dan non-Latin (Arab, Sirilik, CJK, …).
                    `latin` mengembalikan nilai yang ditransliterasikan/Latin;
                    `non_latin` memprioritaskan aksara asli.
                save_api_request:
                  type: boolean
                  default: true
                  description: >-
                    Jika `true` (default), menyimpan panggilan sebagai sesi tipe
                    API — terlihat di Business Console, dapat diambil melalui
                    `GET /v3/session/{sessionId}/decision/` menggunakan
                    `request_id` yang dikembalikan, diumumkan melalui webhook
                    `status.updated`, dan dengan gambar dokumen dikembalikan
                    sebagai URL media. Jika `false`, tidak ada yang disimpan,
                    `request_id` adalah UUID sementara, dan gambar dikembalikan
                    secara inline sebagai string base64 JPEG.
                  example: true
                vendor_data:
                  type: string
                  description: >-
                    String buram opsional (ID pengguna internal, email, UUID
                    Anda…) yang disimpan pada sesi yang dipertahankan dan
                    dikembalikan dalam respons. Gunakan untuk mengorelasikan
                    panggilan API dengan catatan Anda sendiri dan memfilter sesi
                    nantinya.
                  example: user-123
                metadata:
                  type: object
                  additionalProperties: true
                  description: >-
                    Objek JSON opsional yang disimpan bersama sesi (saat
                    `save_api_request=true`) dan dikembalikan dalam respons.
                    Dalam permintaan multipart, kirimkan sebagai kolom string
                    yang dikodekan dalam JSON (misalnya
                    `metadata={"flow":"onboarding"}`) — kolom ini akan diuraikan
                    menjadi sebuah objek.
                  example:
                    flow: onboarding
            example:
              front_image: (binary JPEG/PNG/PDF of the document front)
              back_image: (binary JPEG/PNG/PDF of the document back)
              perform_document_liveness: true
              save_api_request: true
              vendor_data: user-123
              metadata:
                flow: onboarding
      responses:
        '200':
          description: >-
            Dokumen diproses. `id_verification.status` bernilai `Approved`,
            `Declined`, atau `In Review`; setiap masalah yang terdeteksi dirinci
            dalam `id_verification.warnings`. `In Review` dikembalikan saat
            pemeriksaan liveness dokumen yang diminta tidak menghasilkan hasil
            yang dapat digunakan (`DOCUMENT_LIVENESS_NOT_COMPUTED`). Dokumen
            yang bermasalah tetap menghasilkan `200` dengan `status: "Declined"`
            — periksa isi respons, bukan hanya kode HTTP. Ketika
            `save_api_request=true`, `request_id` adalah id sesi yang disimpan
            dan kolom gambar berupa URL media berumur pendek; jika
            `save_api_request=false`, kolom tersebut berupa string JPEG base64
            inline.
          content:
            application/json:
              examples:
                Approved:
                  summary: >-
                    Kartu identitas dua sisi terbaca dengan jelas (disimpan —
                    gambar sebagai URL media)
                  value:
                    request_id: 11d219ed-d59c-4b1d-8d65-9b933f12d5b8
                    id_verification:
                      status: Approved
                      document_type: Identity Card
                      document_subtype: ID_CARD_GENERIC
                      document_number: CBX164224
                      personal_number: 20446581H
                      portrait_image: >-
                        https://<media-host>/ocr/11d219ed-d59c-4b1d-8d65-9b933f12d5b8-portrait_image-8c2f.jpg?signature=...
                      front_image: >-
                        https://<media-host>/ocr/11d219ed-d59c-4b1d-8d65-9b933f12d5b8-front_image-4a1e.jpg?signature=...
                      back_image: >-
                        https://<media-host>/ocr/11d219ed-d59c-4b1d-8d65-9b933f12d5b8-back_image-77b0.jpg?signature=...
                      front_image_camera_front: null
                      back_image_camera_front: null
                      front_image_camera_front_face_match_score: null
                      back_image_camera_front_face_match_score: null
                      front_image_quality_score:
                        focus_score: 78
                        brightness_score: 83.2
                        brightness_issue: ok
                        is_document_fully_visible: true
                        resolution_score: 40.7
                        overall_score: 70.2
                      back_image_quality_score:
                        focus_score: 100
                        brightness_score: 95.6
                        brightness_issue: ok
                        is_document_fully_visible: true
                        resolution_score: 43
                        overall_score: 84.4
                      date_of_birth: '1980-01-13'
                      age: 46
                      expiration_date: '2032-03-31'
                      date_of_issue: '2022-03-31'
                      issuing_state: ESP
                      issuing_state_name: Spain
                      first_name: Julio Francisco
                      last_name: Fores Sena
                      full_name: Julio Francisco Fores Sena
                      gender: M
                      address: >-
                        Brda. Urb. El Cardonal 0052 52 Po3 B,Taco,San Cristobal
                        De La Laguna,Santa Cruz De Tenerife
                      formatted_address: >-
                        Av. el Cardonal, 52, b, 38108 La Laguna, Santa Cruz de
                        Tenerife, Spain
                      place_of_birth: Valencia, Valencia
                      marital_status: UNKNOWN
                      nationality: ESP
                      extra_fields:
                        first_surname: Fores
                        second_surname: Sena
                      mrz:
                        surname: FORES SENA
                        name: JULIO FRANCISCO
                        country: ESP
                        nationality: ESP
                        birth_date: '800113'
                        expiry_date: '320331'
                        sex: M
                        document_type: ID
                        document_number: CBX164224
                        optional_data: 20446581H
                        optional_data_2: ''
                        birth_date_hash: '9'
                        expiry_date_hash: '8'
                        document_number_hash: '3'
                        final_hash: '3'
                        personal_number: 20446581H
                        warnings: []
                        errors: []
                        mrz_type: TD1
                        mrz_string: |-
                          IDESPCBX164224320446581H<<<<<<
                          8001139M3203318ESP<<<<<<<<<<<3
                          FORES<SENA<<JULIO<FRANCISCO<<<
                        mrz_key: CBX164224380011393203318
                      parsed_address:
                        street_1: Avenida el Cardonal 52
                        street_2: b
                        city: La Laguna
                        region: Canarias
                        country: ES
                        postal_code: '38108'
                        address_type: Avenida
                        formatted_address: >-
                          Av. el Cardonal, 52, b, 38108 La Laguna, Santa Cruz de
                          Tenerife, Spain
                        raw_results:
                          address_components:
                            - long_name: b
                              short_name: b
                              types:
                                - subpremise
                            - long_name: '52'
                              short_name: '52'
                              types:
                                - street_number
                            - long_name: Avenida el Cardonal
                              short_name: Av. el Cardonal
                              types:
                                - route
                            - long_name: La Laguna
                              short_name: La Laguna
                              types:
                                - locality
                                - political
                            - long_name: Spain
                              short_name: ES
                              types:
                                - country
                                - political
                            - long_name: '38108'
                              short_name: '38108'
                              types:
                                - postal_code
                          formatted_address: >-
                            Av. el Cardonal, 52, b, 38108 La Laguna, Santa Cruz
                            de Tenerife, Spain
                          geometry:
                            location:
                              lat: 28.4501161
                              lng: -16.3004407
                            location_type: ROOFTOP
                          types:
                            - street_address
                            - subpremise
                        document_location:
                          latitude: 28.4501161
                          longitude: -16.3004407
                        label: Spain Identity Card Address
                        is_verified: true
                        category: Residential
                      warnings: []
                      barcodes: []
                    vendor_data: user-123
                    metadata:
                      flow: onboarding
                    created_at: '2026-06-12T02:21:56.013573+00:00'
                Declined - expired document:
                  summary: >-
                    Pengunggahan hanya sisi depan dari kartu identitas yang
                    telah kedaluwarsa
                  value:
                    request_id: f61681b8-9422-4378-ac3e-04c6a247fb45
                    id_verification:
                      status: Declined
                      document_type: Identity Card
                      document_subtype: ID_CARD_GENERIC
                      document_number: BNK123072
                      personal_number: 21771255F
                      portrait_image: >-
                        https://<media-host>/ocr/f61681b8-9422-4378-ac3e-04c6a247fb45-portrait_image-1d9a.jpg?signature=...
                      front_image: >-
                        https://<media-host>/ocr/f61681b8-9422-4378-ac3e-04c6a247fb45-front_image-5c2b.jpg?signature=...
                      back_image: null
                      front_image_camera_front: null
                      back_image_camera_front: null
                      front_image_camera_front_face_match_score: null
                      back_image_camera_front_face_match_score: null
                      front_image_quality_score:
                        focus_score: 100
                        brightness_score: 95.7
                        brightness_issue: ok
                        is_document_fully_visible: true
                        resolution_score: 22.2
                        overall_score: 79.3
                      back_image_quality_score: null
                      date_of_birth: '1997-01-30'
                      age: 29
                      expiration_date: '2025-11-26'
                      date_of_issue: null
                      issuing_state: ESP
                      issuing_state_name: Spain
                      first_name: Lucia
                      last_name: Marin Castro
                      full_name: Lucia Marin Castro
                      gender: F
                      address: null
                      formatted_address: null
                      place_of_birth: null
                      marital_status: UNKNOWN
                      nationality: ESP
                      extra_fields:
                        first_surname: Marin
                        second_surname: Castro
                      mrz: {}
                      parsed_address: null
                      warnings:
                        - risk: DOCUMENT_EXPIRED
                          feature: ID_VERIFICATION
                          additional_data: null
                          log_type: error
                          short_description: Document expired
                          long_description: >-
                            The document's expiration date has passed, rendering
                            it no longer valid for use.
                      barcodes: []
                    vendor_data: user-123
                    metadata: null
                    created_at: '2026-06-12T02:25:48.117204+00:00'
              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.
                  id_verification:
                    type: object
                    properties:
                      status:
                        type: string
                        enum:
                          - Approved
                          - Declined
                          - In Review
                        description: >-
                          `Approved` saat tidak ada peringatan yang menghasilkan
                          penolakan dan pemeriksaan liveness dokumen yang
                          diminta menghasilkan hasil yang dapat digunakan; `In
                          Review` saat pemeriksaan yang diminta tersebut tidak
                          menghasilkan hasil yang dapat digunakan
                          (`DOCUMENT_LIVENESS_NOT_COMPUTED`); `Declined` saat
                          sebuah peringatan menghasilkan penolakan — daftar
                          `warnings` menjelaskan alasannya.
                      document_type:
                        type: string
                        nullable: true
                        description: >-
                          Nama tampilan jenis dokumen yang terdeteksi: `Identity
                          Card`, `Passport`, `Driver's License`, `Residence
                          Permit`, `Health Insurance Card`, atau `Tax Card`.
                          Bernilai `null` jika dokumen tidak dapat
                          diklasifikasikan.
                        example: Identity Card
                      document_subtype:
                        type: string
                        nullable: true
                        description: >-
                          Subtipe yang lebih mendetail jika tersedia (mis.
                          `ID_CARD_GENERIC`, `EPASSPORT`).
                        example: ID_CARD_GENERIC
                      document_number:
                        type: string
                        nullable: true
                        example: CBX164224
                      personal_number:
                        type: string
                        nullable: true
                        description: >-
                          Nomor pribadi/nasional sekunder yang tercetak pada
                          beberapa dokumen.
                        example: 20446581H
                      portrait_image:
                        type: string
                        nullable: true
                        description: >-
                          Foto potret yang dipotong dari dokumen. URL media
                          berumur pendek (`https://<media-host>/ocr/...`) jika
                          `save_api_request=true` (default); string JPEG yang
                          dienkode base64 inline jika `save_api_request=false`.
                          Bernilai `null` jika tidak ada potret yang terdeteksi.
                      front_image:
                        type: string
                        nullable: true
                        description: >-
                          Hasil crop yang disejajarkan dari bagian depan
                          dokumen. URL media jika disimpan, inline base64 JPEG
                          jika tidak.
                      back_image:
                        type: string
                        nullable: true
                        description: >-
                          Hasil crop yang disejajarkan dari bagian belakang
                          dokumen. `null` jika tidak ada `back_image` yang
                          diunggah.
                      front_image_camera_front:
                        type: string
                        nullable: true
                        description: >-
                          Selalu `null` pada endpoint ini (hanya diisi pada sesi
                          verifikasi dengan pengambilan gambar melalui kamera).
                      back_image_camera_front:
                        type: string
                        nullable: true
                        description: Selalu `null` pada endpoint ini.
                      front_image_camera_front_face_match_score:
                        type: number
                        nullable: true
                        description: Selalu `null` pada endpoint ini.
                      back_image_camera_front_face_match_score:
                        type: number
                        nullable: true
                        description: Selalu `null` pada endpoint ini.
                      front_image_quality_score:
                        type: object
                        nullable: true
                        description: >-
                          Diagnostik kualitas pengambilan untuk gambar yang
                          diunggah (`null` jika sisi dokumen tidak diberikan
                          atau penilaian gagal). Semua skor adalah 0–100.
                        properties:
                          focus_score:
                            type: number
                            format: float
                            description: >-
                              Ketajaman potongan dokumen (semakin tinggi semakin
                              tajam).
                          brightness_score:
                            type: number
                            format: float
                            description: Kualitas paparan (makin tinggi makin baik).
                          brightness_issue:
                            type: string
                            nullable: true
                            description: >-
                              `ok` saat pencahayaan baik, jika tidak maka berupa
                              masalah yang terdeteksi (misalnya terlalu gelap /
                              terlalu terang).
                          is_document_fully_visible:
                            type: boolean
                            nullable: true
                            description: >-
                              Menentukan apakah keempat sudut dokumen berada di
                              dalam bingkai.
                          resolution_score:
                            type: number
                            format: float
                            description: Resolusi efektif dari area dokumen.
                          overall_score:
                            type: number
                            format: float
                            description: Skor kualitas agregat.
                      back_image_quality_score:
                        type: object
                        nullable: true
                        description: >-
                          Diagnostik kualitas pengambilan untuk gambar yang
                          diunggah (`null` jika sisi dokumen tidak diberikan
                          atau penilaian gagal). Semua skor adalah 0–100.
                        properties:
                          focus_score:
                            type: number
                            format: float
                            description: >-
                              Ketajaman potongan dokumen (semakin tinggi semakin
                              tajam).
                          brightness_score:
                            type: number
                            format: float
                            description: Kualitas paparan (makin tinggi makin baik).
                          brightness_issue:
                            type: string
                            nullable: true
                            description: >-
                              `ok` saat pencahayaan baik, jika tidak maka berupa
                              masalah yang terdeteksi (misalnya terlalu gelap /
                              terlalu terang).
                          is_document_fully_visible:
                            type: boolean
                            nullable: true
                            description: >-
                              Menentukan apakah keempat sudut dokumen berada di
                              dalam bingkai.
                          resolution_score:
                            type: number
                            format: float
                            description: Resolusi efektif dari area dokumen.
                          overall_score:
                            type: number
                            format: float
                            description: Skor kualitas agregat.
                      date_of_birth:
                        type: string
                        format: date
                        nullable: true
                        example: '1980-01-13'
                      age:
                        type: integer
                        nullable: true
                        description: >-
                          Usia pemegang dalam tahun, dihitung dari
                          `date_of_birth`.
                        example: 46
                      expiration_date:
                        type: string
                        format: date
                        nullable: true
                        example: '2032-03-31'
                      date_of_issue:
                        type: string
                        format: date
                        nullable: true
                        example: '2022-03-31'
                      issuing_state:
                        type: string
                        nullable: true
                        description: Negara penerbit (ISO 3166-1 alpha-3).
                        example: ESP
                      issuing_state_name:
                        type: string
                        nullable: true
                        example: Spain
                      first_name:
                        type: string
                        nullable: true
                        example: Julio Francisco
                      last_name:
                        type: string
                        nullable: true
                        example: Fores Sena
                      full_name:
                        type: string
                        nullable: true
                        example: Julio Francisco Fores Sena
                      gender:
                        type: string
                        nullable: true
                        description: >-
                          `M`, `F`, atau `null` ketika tidak
                          tercetak/terdeteksi.
                        example: M
                      address:
                        type: string
                        nullable: true
                        description: Alamat persis seperti yang tertera pada dokumen.
                      formatted_address:
                        type: string
                        nullable: true
                        description: Versi `address` yang dinormalisasi dan di-geocode.
                      place_of_birth:
                        type: string
                        nullable: true
                        example: Valencia, Valencia
                      marital_status:
                        type: string
                        nullable: true
                        description: >-
                          `UNKNOWN` kecuali jika dokumen mencantumkan status
                          perkawinan.
                        example: UNKNOWN
                      nationality:
                        type: string
                        nullable: true
                        description: Kewarganegaraan pemegang (ISO 3166-1 alpha-3).
                        example: ESP
                      extra_fields:
                        type: object
                        nullable: true
                        additionalProperties: true
                        description: >-
                          Tambahan khusus dokumen yang tidak memiliki kolom
                          khusus (misalnya `first_surname`/`second_surname` pada
                          KTP Spanyol, kelas SIM pada surat izin mengemudi).
                      mrz:
                        type: object
                        description: >-
                          Zona terbaca mesin yang telah diurai. Berupa **objek
                          kosong** (`{}`) jika dokumen tidak memiliki MRZ atau
                          tidak dapat dibaca — periksa juga daftar `warnings`
                          dalam kasus tersebut. Tanggal di dalam MRZ menggunakan
                          format mentah `YYMMDD`.
                        properties:
                          surname:
                            type: string
                            example: FORES SENA
                          name:
                            type: string
                            example: JULIO FRANCISCO
                          country:
                            type: string
                            description: Negara penerbit (ISO 3166-1 alpha-3).
                            example: ESP
                          nationality:
                            type: string
                            description: Kewarganegaraan pemegang (ISO 3166-1 alpha-3).
                            example: ESP
                          birth_date:
                            type: string
                            description: Tanggal lahir MRZ mentah (`YYMMDD`).
                            example: '800113'
                          expiry_date:
                            type: string
                            description: Tanggal kedaluwarsa MRZ mentah (`YYMMDD`).
                            example: '320331'
                          sex:
                            type: string
                            example: M
                          document_type:
                            type: string
                            description: Kode jenis dokumen MRZ (misalnya `ID`, `P`).
                            example: ID
                          document_number:
                            type: string
                            example: CBX164224
                          optional_data:
                            type: string
                            nullable: true
                            example: 20446581H
                          optional_data_2:
                            type: string
                            nullable: true
                            example: ''
                          birth_date_hash:
                            type: string
                            description: Digit pemeriksa MRZ untuk tanggal lahir.
                            example: '9'
                          expiry_date_hash:
                            type: string
                            description: Digit pemeriksa MRZ untuk tanggal kedaluwarsa.
                            example: '8'
                          document_number_hash:
                            type: string
                            description: Digit pemeriksa MRZ untuk nomor dokumen.
                            example: '3'
                          final_hash:
                            type: string
                            description: Digit pemeriksa MRZ komposit.
                            example: '3'
                          personal_number:
                            type: string
                            nullable: true
                            example: 20446581H
                          warnings:
                            type: array
                            items:
                              type: string
                            description: Peringatan penguraian MRZ yang bersifat non-fatal.
                          errors:
                            type: array
                            items:
                              type: string
                            description: >-
                              Kesalahan digit pemeriksa/parsing MRZ. Kesalahan
                              yang tidak kosong akan muncul sebagai peringatan
                              `MRZ_VALIDATION_FAILED`.
                          mrz_type:
                            type: string
                            description: >-
                              Tata letak MRZ: `TD1` (kartu identitas, 3 baris),
                              `TD2`, atau `TD3` (paspor, 2 baris).
                            example: TD1
                          mrz_string:
                            type: string
                            description: >-
                              Teks MRZ mentah sebagaimana dibaca, baris
                              dipisahkan oleh `\n`.
                          mrz_key:
                            type: string
                            description: >-
                              Kunci komposit (nomor dokumen + digit pemeriksa)
                              yang digunakan untuk pemeriksaan silang.
                      parsed_address:
                        type: object
                        nullable: true
                        description: >-
                          Rincian terstruktur dan telah diberi geocode dari
                          `address`. `null` jika dokumen tidak memuat alamat
                          atau alamat tidak dapat diurai.
                        properties:
                          street_1:
                            type: string
                            nullable: true
                            example: Avenida el Cardonal 52
                          street_2:
                            type: string
                            nullable: true
                            example: b
                          city:
                            type: string
                            nullable: true
                            example: La Laguna
                          region:
                            type: string
                            nullable: true
                            example: Canarias
                          country:
                            type: string
                            nullable: true
                            description: Kode negara ISO 3166-1 alpha-2.
                            example: ES
                          postal_code:
                            type: string
                            nullable: true
                            example: '38108'
                          address_type:
                            type: string
                            nullable: true
                            example: Avenida
                          formatted_address:
                            type: string
                            nullable: true
                            description: String alamat hasil geocoding kanonis.
                            example: >-
                              Av. el Cardonal, 52, b, 38108 La Laguna, Santa
                              Cruz de Tenerife, Spain
                          raw_results:
                            type: object
                            additionalProperties: true
                            description: >-
                              Payload geocoding mentah (`address_components`,
                              `geometry.location`, `place_id`, …) untuk pengguna
                              tingkat lanjut.
                          document_location:
                            type: object
                            nullable: true
                            properties:
                              latitude:
                                type: number
                              longitude:
                                type: number
                            description: Koordinat hasil geocoding dari alamat dokumen.
                          label:
                            type: string
                            nullable: true
                            description: Kolom dokumen mana tempat alamat dibaca.
                            example: Spain Identity Card Address
                          is_verified:
                            type: boolean
                            description: >-
                              Menentukan apakah geocoding mengonfirmasi
                              keberadaan alamat tersebut.
                          category:
                            type: string
                            nullable: true
                            description: >-
                              Kategori alamat (misalnya `Residential`,
                              `Commercial`).
                            example: Residential
                      warnings:
                        type: array
                        description: >-
                          Kosong jika persetujuan bersih. Setiap entri
                          menjelaskan satu risiko yang terdeteksi; entri dengan
                          `log_type: "error"` menetapkan `status` ke `Declined`,
                          dan `DOCUMENT_LIVENESS_NOT_COMPUTED` (`log_type:
                          "warning"`) menetapkannya ke `In Review`.
                        items:
                          type: object
                          properties:
                            risk:
                              type: string
                              description: >-
                                Kode risiko yang dapat dibaca mesin. Risiko yang
                                selalu ditolak: `DOCUMENT_EXPIRED`,
                                `MINIMUM_AGE_NOT_MET`,
                                `PORTRAIT_IMAGE_NOT_DETECTED`,
                                `SCREEN_CAPTURE_DETECTED`,
                                `PRINTED_COPY_DETECTED`,
                                `PORTRAIT_MANIPULATION_DETECTED`,
                                `PUBLIC_DOCUMENT_IMAGE_DETECTED`,
                                `INVALID_DATE`, `COULD_NOT_RECOGNIZE_DOCUMENT`
                                (hanya 400, tidak pernah menjadi peringatan),
                                `DOCUMENT_NUMBER_NOT_DETECTED`,
                                `COULD_NOT_DETECT_DOCUMENT_TYPE`,
                                `NAME_NOT_DETECTED`,
                                `DATE_OF_BIRTH_NOT_DETECTED`. Diatur oleh opsi
                                permintaan: `MRZ_NOT_DETECTED` /
                                `MRZ_VALIDATION_FAILED` (`invalid_mrz_action`),
                                `DATA_INCONSISTENT` /
                                `MRZ_AND_DATA_EXTRACTED_FROM_OCR_NOT_SAME` /
                                `DOCUMENT_NAME_DIFFERENT_FROM_OTHER_APPROVED_DOCUMENTS`
                                (`inconsistent_data_action`),
                                `EXPIRATION_DATE_NOT_DETECTED`
                                (`expiration_date_not_detected_action`). Risiko
                                lainnya (mis. `POSSIBLE_DUPLICATED_USER`)
                                bersifat informasional.
                                `DOCUMENT_LIVENESS_NOT_COMPUTED` dimunculkan
                                ketika `perform_document_liveness=true` tetapi
                                pemeriksaan pemalsuan tidak menghasilkan skor
                                yang dapat digunakan; ini menetapkan `status` ke
                                `In Review`. `COULD_NOT_DETECT_DOCUMENT_TYPE`
                                juga dikembalikan saat bagian depan dokumen
                                tidak cocok dengan desain dokumen resmi yang
                                dikenal dengan keyakinan tinggi, misalnya
                                dokumen yang diedit atau dihasilkan komputer,
                                atau desain yang belum didukung.
                              example: DOCUMENT_EXPIRED
                            feature:
                              type: string
                              enum:
                                - ID_VERIFICATION
                              description: >-
                                Fitur yang memunculkan peringatan. Selalu
                                `ID_VERIFICATION` pada endpoint ini.
                            additional_data:
                              type: object
                              nullable: true
                              additionalProperties: true
                              description: >-
                                Konteks tambahan untuk beberapa risiko (misalnya
                                `POSSIBLE_DUPLICATED_USER` menyertakan
                                `duplicated_session_id`); `null` untuk sebagian
                                besar.
                            log_type:
                              type: string
                              enum:
                                - error
                                - warning
                                - information
                              description: >-
                                Tingkat keparahan. Peringatan `error` mendorong
                                `status` menjadi `Declined`; `warning` (hanya
                                `DOCUMENT_LIVENESS_NOT_COMPUTED`, ketika
                                pemeriksaan pemalsuan yang diminta tidak
                                menghasilkan skor yang dapat digunakan)
                                mendorong `status` menjadi `In Review`; entri
                                `information` bersifat anjuran dan tidak pernah
                                mengubah status.
                            short_description:
                              type: string
                              description: >-
                                Ringkasan satu baris yang dapat dibaca manusia
                                tentang risiko.
                            long_description:
                              type: string
                              description: Penjelasan risiko yang mudah dibaca manusia.
                      barcodes:
                        type: array
                        description: >-
                          Barcode yang didekodekan dari dokumen (PDF417, QR, …).
                          Kosong jika dokumen tidak memilikinya atau tidak ada
                          yang dapat dibaca.
                        items:
                          type: object
                          properties:
                            type:
                              type: string
                              description: >-
                                Jenis barcode (misalnya `PDF417`, `QR_CODE`,
                                `UNKNOWN`).
                            position:
                              type: object
                              nullable: true
                              additionalProperties: true
                              description: Lokasi barcode dalam gambar, jika tersedia.
                            data:
                              type: string
                              description: Payload yang didekodekan.
                            data_raw:
                              type: string
                              description: Payload mentah (belum didekode), jika berbeda.
                            side:
                              type: string
                              nullable: true
                              description: '`front` atau `back`.'
                  vendor_data:
                    type: string
                    nullable: true
                    description: Salinan `vendor_data` yang Anda kirimkan, atau `null`.
                  metadata:
                    type: object
                    nullable: true
                    additionalProperties: true
                    description: Salinan objek `metadata` yang Anda kirimkan, atau `null`.
                  created_at:
                    type: string
                    format: date-time
                    description: Stempel waktu ISO 8601 (UTC) saat respons dibuat.
        '400':
          description: >-
            Kesalahan validasi atau pemrosesan. Masalah tingkat kolom
            mengembalikan envelope standar DRF (satu array pesan per kolom yang
            bermasalah). Masalah PDF terenkripsi mengembalikan `{"detail":
            ...}`. Gambar dokumen yang dokumennya sama sekali tidak dapat
            dikenali mengembalikan `{"error": "COULD_NOT_RECOGNIZE_DOCUMENT"}`.
            Unggahan PDF juga dapat gagal dengan "The submitted PDF file is
            corrupted or invalid." atau kesalahan karena tidak ada halaman.
          content:
            application/json:
              examples:
                Missing front image:
                  summary: '`front_image` tidak disertakan dalam data formulir'
                  value:
                    front_image:
                      - No file was submitted.
                Unsupported file extension:
                  summary: Ekstensi file di luar tiff/jpg/jpeg/png/webp/pdf
                  value:
                    front_image:
                      - >-
                        File extension “txt” is not allowed. Allowed extensions
                        are: tiff, jpg, jpeg, png, webp, pdf.
                File too large:
                  summary: Unggahan melebihi batas 10 MB
                  value:
                    front_image:
                      - File size should not exceed 10 MB
                Invalid option value:
                  summary: Opsi hanya menerima DECLINE atau NO_ACTION
                  value:
                    invalid_mrz_action:
                      - '"REVIEW" is not a valid choice.'
                Encrypted PDF:
                  summary: PDF diunggah tanpa kata sandi yang diperlukan
                  value:
                    detail: >-
                      The PDF is encrypted. Please upload a decrypted PDF or a
                      photo instead.
                Wrong PDF password:
                  summary: >-
                    `front_image_password` / `back_image_password` tidak dapat
                    mendekripsi PDF
                  value:
                    detail: >-
                      The PDF password is incorrect. Please provide the correct
                      password.
                Document not recognized:
                  summary: Tidak ada dokumen identitas yang terdeteksi di dalam gambar
                  value:
                    error: COULD_NOT_RECOGNIZE_DOCUMENT
                PDF conversion failure:
                  summary: PDF yang diunggah tidak dapat dikonversi menjadi gambar
                  value:
                    error: Failed to convert front image PDF.
        '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 pemrosesan gambar 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
        '503':
          $ref: '#/components/responses/DocumentProcessingBusy'
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |-
            curl -X POST 'https://verification.didit.me/v3/id-verification/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -F 'front_image=@./id_front.jpg' \
              -F 'back_image=@./id_back.jpg' \
              -F 'perform_document_liveness=true' \
              -F 'save_api_request=true' \
              -F 'vendor_data=user-123'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.id_verification.verify(
                front_image=open("front_image.jpg", "rb"),
                back_image=open("back_image.jpg", "rb"),
                perform_document_liveness=True,
                save_api_request=True,
                vendor_data="user-123",
                metadata={"flow": "onboarding"},
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit, { fileFromPath } from "@didit-protocol/sdk-node";

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

            const result = await didit.idVerification.verify({
              front_image: await fileFromPath("front_image.jpg"),
              back_image: await fileFromPath("back_image.jpg"),
              perform_document_liveness: true,
              save_api_request: true,
              vendor_data: "user-123",
              metadata: { flow: "onboarding" },
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDVerification.Verify(ctx, didit.IDVerificationVerifyParams{\n\tFrontImage:              didit.FileFromPath(\"front_image.jpg\"),\n\tBackImage:               didit.Some(didit.FileFromPath(\"back_image.jpg\")),\n\tPerformDocumentLiveness: didit.Bool(true),\n\tSaveAPIRequest:          didit.Bool(true),\n\tVendorData:              didit.String(\"user-123\"),\n\tMetadata:                didit.Some(map[string]any{\"flow\": \"onboarding\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.nio.file.Path;

            import java.util.Map;

            import me.didit.Didit;

            import me.didit.types.IdVerificationVerifyParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.idVerification().verify(IdVerificationVerifyParams.builder()
                    .frontImage(Path.of("front_image.jpg"))
                    .backImage(Path.of("back_image.jpg"))
                    .performDocumentLiveness(true)
                    .saveApiRequest(true)
                    .vendorData("user-123")
                    .metadata(Map.of("flow", "onboarding"))
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;
            use Didit\File;

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

            $result = $didit->idVerification->verify([
                'front_image' => File::fromPath('front_image.jpg'),
                'back_image' => File::fromPath('back_image.jpg'),
                'perform_document_liveness' => true,
                'save_api_request' => true,
                'vendor_data' => 'user-123',
                'metadata' => ['flow' => 'onboarding'],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.id_verification.verify(
              front_image: Pathname("front_image.jpg"),
              back_image: Pathname("back_image.jpg"),
              perform_document_liveness: true,
              save_api_request: true,
              vendor_data: "user-123",
              metadata: { flow: "onboarding" }
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Collections.Generic;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.IdVerification.VerifyAsync(new
            IdVerificationVerifyParams

            {
                FrontImage = FileUpload.FromPath("front_image.jpg"),
                BackImage = FileUpload.FromPath("back_image.jpg"),
                PerformDocumentLiveness = true,
                SaveApiRequest = true,
                VendorData = "user-123",
                Metadata = new Dictionary<string, object> { ["flow"] = "onboarding" },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  responses:
    DocumentProcessingBusy:
      description: >-
        Terlalu banyak dokumen yang sedang diproses saat ini, sehingga unggahan
        ini tidak diproses: tidak ada yang disimpan dan tidak ada percobaan yang
        terpakai. Kirim kembali file yang sama setelah menunggu selama jumlah
        detik yang tercantum dalam `Retry-After`. Lakukan percabangan
        berdasarkan `code`, bukan pada teks pesan.
      headers:
        Retry-After:
          description: >-
            Jumlah detik yang harus ditunggu sebelum mengirimkan permintaan yang
            sama lagi.
          schema:
            type: integer
            example: 10
      content:
        application/json:
          schema:
            type: object
            required:
              - detail
              - code
            properties:
              detail:
                type: string
              code:
                type: string
                enum:
                  - document_processing_busy
          example:
            detail: We are busy processing documents. Please try again in a moment.
            code: document_processing_busy
  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.