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

# Pencarian Wajah API: Dedup Wajah 1:N & Jaringan Penipuan

> Pencarian wajah 1:N Didit (POST /v3/face-search/) untuk deteksi duplikat dan jaringan penipuan. Inferensi di bawah 2 detik, bayar per panggilan.



## OpenAPI

````yaml id/openapi-25.json POST /v3/face-search/
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/face-search/:
    post:
      tags:
        - Standalone APIs
      summary: Pencarian Wajah
      description: >-
        Cari gambar wajah (1:N) terhadap indeks pencarian wajah aplikasi Anda —
        wajah yang didaftarkan dari sesi verifikasi, panggilan API mandiri yang
        disimpan, unggahan langsung wajah dari profil pengguna, serta daftar
        blokir/izin Anda — dan dapatkan kecocokan kemiripan berperingkat beserta
        peringatan daftar blokir dan duplikat.


        **Cara kerjanya.** Wajah terbesar yang terdeteksi di `user_image`
        di-embed dan dicari terhadap indeks, yang dibatasi pada aplikasi Anda.
        Hingga **5 kecocokan** di atas ambang batas kemiripan minimum
        dikembalikan di `matches`, masing-masing dengan `similarity_percentage`,
        sesi asal (`session_id`, `session_number`, `status`, `vendor_data`),
        `user_details` yang diekstrak selama verifikasi dokumen sesi tersebut,
        penanda `is_blocklisted` / `is_allowlisted`, dan pembeda `source`
        (`session`, `imported`, atau `list_entry`).


        - `search_type=most_similar` (default) memberi peringkat setiap wajah
        yang terdaftar berdasarkan kemiripan — gunakan ini untuk deduplikasi dan
        penyelidikan sindikat penipuan.

        - `search_type=blocklisted_or_approved` membatasi kandidat pada wajah
        yang masuk daftar blokir, wajah yang masuk daftar izin, wajah dari sesi
        yang disetujui, dan wajah profil pengguna yang diimpor, dengan memberi
        peringkat entri daftar blokir terlebih dahulu — gunakan ini ketika
        tujuan utamanya adalah skrining daftar blokir.


        `status` bernilai `Declined` hanya ketika peringatan `FACE_IN_BLOCKLIST`
        atau `POSSIBLE_FACE_IN_BLOCKLIST` terpicu; `DUPLICATED_FACE` /
        `POSSIBLE_DUPLICATED_FACE` (`information`) dan `MULTIPLE_FACES_DETECTED`
        (`warning`) tidak pernah menolak. Tidak seperti Passive Liveness,
        endpoint ini **tidak** mengecualikan sesi sebelumnya dengan
        `vendor_data` yang sama dari pencocokan. Analisis passive liveness juga
        berjalan secara internal dan disimpan bersama sesi yang disimpan, tetapi
        hasilnya bukan bagian dari respons ini.


        **Penagihan.** Setiap respons `200` mengonsumsi satu kredit API Face
        Search (dibayar dari kredit paket atau saldo isi ulang Anda). Saldo yang
        tidak mencukupi akan mengembalikan `403` sebelum pemrosesan gambar apa
        pun.


        **Persistensi sesi dan pendaftaran wajah (`save_api_request`, default
        `true`).** Jika bernilai `true`, panggilan tersebut akan disimpan
        sebagai sesi bertipe API (Business Console, `GET
        /v3/session/{sessionId}/decision/` melalui `request_id` yang
        dikembalikan, webhook `status.updated`) dan wajah yang dicari akan
        didaftarkan ke dalam indeks pencarian wajah Anda. Wajah yang didaftarkan
        melalui panggilan Face Search dikecualikan dari hasil Face Search
        mendatang, sehingga pencarian berulang tidak akan pernah saling cocok.
        Jika bernilai `false`, panggilan bersifat sekali pakai: tidak ada yang
        disimpan, wajah tidak didaftarkan, dan nilai `match_image_url` merupakan
        jalur penyimpanan internal alih-alih URL yang dapat diunduh.


        **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, tidak
        ada sesi yang disimpan, dan tidak ada kredit yang digunakan.


        **Autentikasi.** Kirim kunci API aplikasi Anda di header `x-api-key`.
        Kredensial yang hilang atau tidak valid akan 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 semua endpoint POST/PATCH/DELETE; melebihi batas ini akan
        mengembalikan `429`.
      operationId: post_v3face-search
      parameters: []
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - user_image
              properties:
                user_image:
                  type: string
                  format: binary
                  description: >-
                    Gambar wajah menghadap ke depan yang digunakan untuk
                    pencarian. Ekstensi yang diizinkan: `tiff`, `jpg`, `jpeg`,
                    `png`, `webp`. Ukuran unggah maksimum: **5 MB** (berkas yang
                    lebih besar ditolak dengan kode `400`). Gambar dikompresi
                    secara otomatis menjadi ~0.5 MB sebelum diproses, sehingga
                    resolusi yang sangat tinggi tidak meningkatkan akurasi.
                    Gambar harus berisi setidaknya satu wajah yang dapat
                    dideteksi — jika tidak, endpoint akan mengembalikan kode
                    `400`. Jika terdapat beberapa wajah, wajah terbesar yang
                    akan dicari dan peringatan `MULTIPLE_FACES_DETECTED` akan
                    ditambahkan.
                search_type:
                  type: string
                  default: most_similar
                  enum:
                    - most_similar
                    - blocklisted_or_approved
                  description: >-
                    Kebijakan pencarian. `most_similar` (default) mengurutkan
                    setiap wajah yang terdaftar di aplikasi Anda berdasarkan
                    kemiripan. `blocklisted_or_approved` membatasi kandidat ke
                    wajah yang masuk daftar blokir, wajah yang masuk daftar
                    izin, wajah dari sesi yang disetujui, dan wajah profil
                    pengguna yang diimpor — dengan entri daftar blokir diurutkan
                    terlebih dahulu.
                  example: most_similar
                rotate_image:
                  type: boolean
                  default: false
                  description: >-
                    Jika `true`, layanan mencoba rotasi 90 derajat dari input
                    dan menggunakan orientasi yang menghasilkan deteksi wajah
                    terbaik. Berguna saat orientasi EXIF tidak ada. Menambah
                    latensi.
                  example: false
                save_api_request:
                  type: boolean
                  default: true
                  description: >-
                    Jika `true` (default), menyimpan panggilan sebagai sesi tipe
                    API, memancarkan webhook `status.updated`, melakukan
                    pra-penandatanganan nilai `match_image_url`, dan
                    mendaftarkan wajah yang dicari ke dalam indeks pencarian
                    wajah Anda (pendaftaran Pencarian Wajah dikecualikan dari
                    pencarian mendatang). Jika `false`, pencarian bersifat
                    sekali jalan — tidak ada sesi yang disimpan dan wajah tidak
                    didaftarkan.
                  example: true
                vendor_data:
                  type: string
                  description: >-
                    Pengidentifikasi buram opsional (ID pengguna, email, UUID
                    Anda…) yang disimpan pada sesi yang dipertahankan dan
                    dikembalikan. Kolom ini tidak mengecualikan wajah pengguna
                    yang sama dari hasil pencarian.
                  example: user-123
                metadata:
                  type: object
                  additionalProperties: true
                  description: >-
                    Objek JSON opsional yang disimpan bersama sesi (saat
                    `save_api_request=true`) dan dikembalikan. Dalam permintaan
                    multipart, kirimkan sebagai kolom string berenkode JSON —
                    kolom ini akan diuraikan menjadi sebuah objek.
                  example:
                    flow: dedup_check
            example:
              user_image: (binary JPEG/PNG selfie)
              search_type: most_similar
              rotate_image: false
              save_api_request: true
              vendor_data: user-123
              metadata:
                flow: dedup_check
      responses:
        '200':
          description: >-
            Pencarian wajah selesai. `face_search.matches` memuat hingga 5 wajah
            serupa yang diurutkan berdasarkan kemiripan; array kosong berarti
            tidak ada wajah terdaftar yang melampaui batas minimum kemiripan.
            `status` bernilai `Declined` hanya pada kecocokan daftar blokir —
            kecocokan duplikat saja mengembalikan `Approved`, jadi periksa
            `matches` dan `warnings`, bukan hanya `status`. Ketika
            `save_api_request=true`, `request_id` adalah id sesi yang disimpan.
            Setiap kecocokan membawa `source` (`session`, `imported`,
            `list_entry`, atau `retained_template`), `vendor_user_id`, dan
            `biometric_template_id`; kecocokan `retained_template` berasal dari
            templat biometrik bebas gambar yang disimpan setelah sesi sumber
            dihapus dan memiliki kolom sesi `null`, `match_image_url`, dan
            `user_details`.
          content:
            application/json:
              examples:
                Blocklist hit (Declined):
                  summary: Wajah cocok dengan wajah yang ada di daftar blokir
                  value:
                    request_id: a1b2c3d4-e5f6-7890-1234-567890abcdef
                    face_search:
                      status: Declined
                      total_matches: 1
                      matches:
                        - session_id: 882c42d5-8a4d-4d20-8080-a22f57822c86
                          session_number: 323442
                          similarity_percentage: 99.99
                          source: session
                          vendor_data: user-1
                          verification_date: '2025-01-01T00:00:00Z'
                          user_details:
                            full_name: Jane Marie Doe
                            document_type: ID
                            document_number: X1234567
                          match_image_url: https://<media-host>/face/3f6a1c2e/reference.jpg
                          status: Approved
                          is_blocklisted: true
                          is_allowlisted: false
                          api_service: null
                          vendor_user_id: 2f7c1a9e-8b4d-4c6a-9e1f-3d5b7a9c1e2f
                          biometric_template_id: null
                      user_image:
                        entities:
                          - bbox:
                              - 40
                              - 40
                              - 120
                              - 120
                            confidence: 0.732973
                        best_angle: 0
                      warnings:
                        - risk: FACE_IN_BLOCKLIST
                          feature: LIVENESS
                          additional_data:
                            blocklisted_session_id: 882c42d5-8a4d-4d20-8080-a22f57822c86
                            blocklisted_session_number: 323442
                            api_service: null
                          log_type: error
                          short_description: Face in blocklist
                          long_description: >-
                            The system identified a face in the blocklist, which
                            means the face is not allowed to be verified.
                    vendor_data: user-123
                    metadata: null
                    created_at: '2026-06-12T01:04:42.763237+00:00'
                Duplicate found (Approved):
                  summary: >-
                    Wajah sudah muncul di sesi lain yang disetujui — bersifat
                    informasi, tidak ditolak
                  value:
                    request_id: 5e0c3a1f-7b2d-4c8e-9f10-2a3b4c5d6e7f
                    face_search:
                      status: Approved
                      total_matches: 1
                      matches:
                        - session_id: 1f2e3d4c-5b6a-7980-1122-334455667788
                          session_number: 1024
                          similarity_percentage: 87.42
                          source: session
                          vendor_data: user-9
                          verification_date: '2025-11-20T09:15:00Z'
                          user_details: null
                          match_image_url: https://<media-host>/face/9c8b7a6d/reference.jpg
                          status: Approved
                          is_blocklisted: false
                          is_allowlisted: false
                          api_service: PASSIVE_LIVENESS
                          vendor_user_id: 2f7c1a9e-8b4d-4c6a-9e1f-3d5b7a9c1e2f
                          biometric_template_id: null
                      user_image:
                        entities:
                          - bbox:
                              - 40
                              - 40
                              - 120
                              - 120
                            confidence: 0.732973
                        best_angle: 0
                      warnings:
                        - risk: DUPLICATED_FACE
                          feature: LIVENESS
                          additional_data:
                            duplicated_session_id: 1f2e3d4c-5b6a-7980-1122-334455667788
                            duplicated_session_number: 1024
                            api_service: PASSIVE_LIVENESS
                          log_type: information
                          short_description: Duplicated face from other approved session
                          long_description: >-
                            The system identified a duplicated face from another
                            approved session, requiring further investigation.
                    vendor_data: user-123
                    metadata: null
                    created_at: '2026-06-12T01:04:42.763237+00:00'
                No matches (Approved):
                  summary: >-
                    Tidak ada wajah terdaftar yang melampaui batas minimum
                    kemiripan
                  value:
                    request_id: 9d8c7b6a-5f4e-3d2c-1b0a-998877665544
                    face_search:
                      status: Approved
                      total_matches: 0
                      matches: []
                      user_image:
                        entities:
                          - bbox:
                              - 40
                              - 40
                              - 120
                              - 120
                            confidence: 0.732973
                        best_angle: 0
                      warnings: []
                    vendor_data: user-123
                    metadata: null
                    created_at: '2026-06-12T01:04:42.763237+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.
                  face_search:
                    type: object
                    properties:
                      status:
                        type: string
                        enum:
                          - Approved
                          - Declined
                        description: >-
                          `Declined` hanya ketika peringatan `FACE_IN_BLOCKLIST`
                          atau `POSSIBLE_FACE_IN_BLOCKLIST` terpicu. Kecocokan
                          duplikat dan peringatan banyak wajah tidak pernah
                          menolak.
                      total_matches:
                        type: integer
                        description: Jumlah entri dalam `matches` (0–5).
                        example: 1
                      matches:
                        type: array
                        maxItems: 5
                        description: >-
                          Hingga 5 wajah dari indeks pencarian wajah Anda yang
                          melebihi ambang batas kemiripan, diurutkan berdasarkan
                          kemiripan (dengan entri daftar blokir diperingkat
                          pertama ketika `search_type=blocklisted_or_approved`).
                          Kosong jika tidak ada wajah terdaftar yang cukup
                          mirip.
                        items:
                          type: object
                          properties:
                            session_id:
                              type: string
                              format: uuid
                              nullable: true
                              description: >-
                                ID sesi verifikasi tempat wajah yang cocok
                                berada. Bernilai `null` jika `source` adalah
                                `imported`, `list_entry`, atau
                                `retained_template`.
                              example: 882c42d5-8a4d-4d20-8080-a22f57822c86
                            session_number:
                              type: integer
                              nullable: true
                              description: >-
                                Nomor sesi yang mudah dibaca manusia yang
                                ditampilkan di Business Console. `null` untuk
                                kecocokan non-sesi.
                              example: 323442
                            similarity_percentage:
                              type: number
                              format: float
                              minimum: 0
                              maximum: 100
                              description: >-
                                Kemiripan antara wajah yang dikirimkan dan wajah
                                yang cocok (0–100).
                              example: 99.99
                            source:
                              type: string
                              enum:
                                - session
                                - imported
                                - list_entry
                                - retained_template
                              description: >-
                                Asal pendaftaran wajah yang cocok: `session` —
                                sesi verifikasi atau panggilan API mandiri yang
                                disimpan; `imported` — wajah yang diunggah
                                langsung ke profil Pengguna; `list_entry` —
                                wajah yang dilampirkan ke salah satu daftar
                                Anda; `retained_template` — templat biometrik
                                bebas gambar yang disimpan pada Pengguna,
                                tercantum di bawah `/v3/biometric-templates/`.
                            vendor_data:
                              type: string
                              nullable: true
                              description: >-
                                `vendor_data` dari sesi yang cocok atau Pengguna
                                yang ditautkan untuk wajah yang diimpor dan
                                templatnya dipertahankan.
                              example: user-1
                            vendor_user_id:
                              type: string
                              format: uuid
                              nullable: true
                              description: >-
                                ID Pengguna yang ditautkan. `null` untuk entri
                                daftar dan kecocokan sesi tanpa Pengguna.
                              example: 2f7c1a9e-4b28-4a6d-97f1-83576f80e1b4
                            biometric_template_id:
                              type: string
                              format: uuid
                              nullable: true
                              description: >-
                                Id templat biometrik yang disimpan. Ditetapkan
                                hanya jika `source` bernilai
                                `retained_template`; jika tidak, bernilai
                                `null`.
                              example: null
                            verification_date:
                              type: string
                              format: date-time
                              nullable: true
                              description: >-
                                Waktu wajah yang cocok awalnya diambil, atau
                                waktu templat yang disimpan dibuat
                                (`YYYY-MM-DDThh:mm:ssZ`). `null` untuk kecocokan
                                `list_entry`.
                              example: '2025-01-01T00:00:00Z'
                            user_details:
                              type: object
                              nullable: true
                              description: >-
                                Data identitas yang diekstrak selama verifikasi
                                dokumen sesi yang cocok. Bernilai `null` jika
                                sesi yang cocok tidak memiliki data dokumen
                                (misalnya sesi khusus liveness) dan selalu
                                bernilai `null` untuk kecocokan
                                `retained_template`. Untuk kecocokan `source:
                                imported`, nilai diisi dari profil Pengguna:
                                `full_name` terisi,
                                `document_type`/`document_number` null.
                              properties:
                                full_name:
                                  type: string
                                  nullable: true
                                  example: Jane Marie Doe
                                document_type:
                                  type: string
                                  nullable: true
                                  example: ID
                                document_number:
                                  type: string
                                  nullable: true
                                  example: X1234567
                            match_image_url:
                              type: string
                              nullable: true
                              description: >-
                                URL dengan batas waktu
                                (`https://<media-host>/...`) dari gambar
                                referensi wajah yang cocok saat
                                `save_api_request=true`. Jika
                                `save_api_request=false`, ini adalah jalur
                                penyimpanan internal yang tidak dapat diunduh
                                secara langsung. Selalu `null` untuk kecocokan
                                `retained_template` karena templat yang disimpan
                                tidak berisi gambar.
                              example: https://<media-host>/face/3f6a1c2e/reference.jpg
                            status:
                              type: string
                              nullable: true
                              description: >-
                                Status sesi yang cocok (`Approved`, `Declined`,
                                `In Review`, …). `null` untuk kecocokan
                                `imported`/`list_entry`.
                              example: Approved
                            is_blocklisted:
                              type: boolean
                              description: >-
                                `true` saat wajah yang cocok ada di daftar
                                blokir wajah Anda. Setiap kecocokan daftar
                                blokir yang cukup mirip akan menolak pencarian.
                            is_allowlisted:
                              type: boolean
                              description: >-
                                `true` saat wajah yang cocok berada di salah
                                satu daftar izin Anda. Kecocokan yang masuk
                                daftar izin akan meniadakan peringatan duplikat.
                            api_service:
                              type: string
                              nullable: true
                              description: >-
                                Ditetapkan saat wajah yang cocok didaftarkan
                                melalui panggilan API mandiri (misalnya
                                `PASSIVE_LIVENESS`); bernilai `null` untuk sesi
                                verifikasi reguler dan wajah yang diimpor.
                              example: null
                      user_image:
                        type: object
                        description: >-
                          Hasil deteksi wajah untuk gambar yang dikirimkan.
                          Entri di sini hanya membawa `bbox` dan `confidence`.
                        properties:
                          entities:
                            type: array
                            description: >-
                              Satu entri per wajah yang terdeteksi. Wajah
                              terbesar adalah wajah yang dicari.
                            items:
                              type: object
                              properties:
                                bbox:
                                  type: array
                                  items:
                                    type: integer
                                  minItems: 4
                                  maxItems: 4
                                  description: >-
                                    Bounding box `[x_min, y_min, x_max, y_max]`
                                    dalam piksel.
                                  example:
                                    - 40
                                    - 40
                                    - 120
                                    - 120
                                confidence:
                                  type: number
                                  format: float
                                  minimum: 0
                                  maximum: 1
                                  description: Skor keyakinan deteksi wajah (0–1).
                                  example: 0.732973
                          best_angle:
                            type: integer
                            description: >-
                              Rotasi (derajat) yang menghasilkan deteksi wajah
                              terbaik; bernilai bukan nol hanya ketika
                              `rotate_image=true` mengoreksi orientasi. Tidak
                              pernah null pada endpoint ini (default ke 0 ketika
                              model menghilangkannya).
                            example: 0
                      warnings:
                        type: array
                        description: >-
                          Sinyal risiko. `FACE_IN_BLOCKLIST` /
                          `POSSIBLE_FACE_IN_BLOCKLIST` (`error`) menolak
                          pencarian; `MULTIPLE_FACES_DETECTED` (`warning`) dan
                          `DUPLICATED_FACE` / `POSSIBLE_DUPLICATED_FACE`
                          (`information`) bersifat informatif.
                        items:
                          type: object
                          properties:
                            risk:
                              type: string
                              enum:
                                - MULTIPLE_FACES_DETECTED
                                - FACE_IN_BLOCKLIST
                                - POSSIBLE_FACE_IN_BLOCKLIST
                                - DUPLICATED_FACE
                                - POSSIBLE_DUPLICATED_FACE
                              description: Kode risiko yang dapat dibaca mesin.
                            feature:
                              type: string
                              enum:
                                - LIVENESS
                              description: >-
                                Fitur yang memunculkan peringatan. Selalu
                                `LIVENESS` pada endpoint ini.
                            additional_data:
                              type: object
                              nullable: true
                              additionalProperties: true
                              description: >-
                                `null` untuk `MULTIPLE_FACES_DETECTED`. Hasil
                                yang cocok dengan daftar blokir berisi
                                `{blocklisted_session_id,
                                blocklisted_session_number, api_service}`; hasil
                                duplikat berisi `{duplicated_session_id,
                                duplicated_session_number, api_service}` yang
                                mengarah ke sesi pertama yang cocok.
                            log_type:
                              type: string
                              enum:
                                - error
                                - warning
                                - information
                              description: >-
                                Tingkat keparahan. Peringatan `error` mendorong
                                `status` menjadi `Declined`; entri `warning` dan
                                `information` bersifat anjuran dan tidak pernah
                                menolak dengan sendirinya.
                            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.
                  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, misalnya
                      `2026-06-12T01:04:42.763237+00:00`.
        '400':
          description: >-
            Kesalahan validasi. Dikembalikan ketika `user_image` tidak ada,
            melebihi 5 MB, memiliki ekstensi yang tidak didukung, atau ketika
            **tidak ada wajah yang terdeteksi** pada gambar yang dikirimkan.
            Kesalahan kolom menggunakan envelope `{field: [messages]}` milik
            DRF; kegagalan deteksi wajah menggunakan `{"error": ...}`.
          content:
            application/json:
              examples:
                No face detected:
                  summary: >-
                    Gambar dapat didekode dengan baik tetapi tidak berisi wajah
                    yang dapat dideteksi
                  value:
                    error: No face detected in the image
                Missing image:
                  summary: '`user_image` tidak disertakan dalam data formulir'
                  value:
                    user_image:
                      - No file was submitted.
                Unsupported file extension:
                  summary: Ekstensi file di luar tiff/jpg/jpeg/png/webp
                  value:
                    user_image:
                      - >-
                        File extension “txt” is not allowed. Allowed extensions
                        are: tiff, jpg, jpeg, png, webp.
                File too large:
                  summary: Unggahan melebihi batas 5 MB
                  value:
                    user_image:
                      - File size should not exceed 5 MB
        '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
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |-
            curl -X POST 'https://verification.didit.me/v3/face-search/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -F 'user_image=@./selfie.jpg' \
              -F 'search_type=most_similar' \
              -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.face_search.search(
                user_image=open("user_image.jpg", "rb"),
                search_type="most_similar",
                rotate_image=False,
                save_api_request=True,
                vendor_data="user-123",
                metadata={"flow": "dedup_check"},
            )
            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.faceSearch.search({
              user_image: await fileFromPath("user_image.jpg"),
              search_type: "most_similar",
              rotate_image: false,
              save_api_request: true,
              vendor_data: "user-123",
              metadata: { flow: "dedup_check" },
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.FaceSearch.Search(ctx, didit.FaceSearchSearchParams{\n\tUserImage:      didit.FileFromPath(\"user_image.jpg\"),\n\tSearchType:     didit.Some(didit.FaceSearchSearchParamsSearchType(\"most_similar\")),\n\tRotateImage:    didit.Bool(false),\n\tSaveAPIRequest: didit.Bool(true),\n\tVendorData:     didit.String(\"user-123\"),\n\tMetadata:       didit.Some(map[string]any{\"flow\": \"dedup_check\"}),\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.FaceSearchSearchParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.faceSearch().search(FaceSearchSearchParams.builder()
                    .userImage(Path.of("user_image.jpg"))
                    .searchType(FaceSearchSearchParams.SearchType.of("most_similar"))
                    .rotateImage(false)
                    .saveApiRequest(true)
                    .vendorData("user-123")
                    .metadata(Map.of("flow", "dedup_check"))
                    .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->faceSearch->search([
                'user_image' => File::fromPath('user_image.jpg'),
                'search_type' => 'most_similar',
                'rotate_image' => false,
                'save_api_request' => true,
                'vendor_data' => 'user-123',
                'metadata' => ['flow' => 'dedup_check'],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.face_search.search(
              user_image: Pathname("user_image.jpg"),
              search_type: "most_similar",
              rotate_image: false,
              save_api_request: true,
              vendor_data: "user-123",
              metadata: { flow: "dedup_check" }
            )
            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.FaceSearch.SearchAsync(new
            FaceSearchSearchParams

            {
                UserImage = FileUpload.FromPath("user_image.jpg"),
                SearchType = new FaceSearchSearchParamsSearchType("most_similar"),
                RotateImage = false,
                SaveApiRequest = true,
                VendorData = "user-123",
                Metadata = new Dictionary<string, object> { ["flow"] = "dedup_check" },
            });

            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.