> ## 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 Email API: Validasi Kode Sekali Pakai

> Didit memvalidasi kode email sekali pakai via POST /v3/email/check/ dengan sinyal kebocoran data, email sekali pakai, dan deliverability.

## Add-on Intelijen

Setel `enable_enrichment` ke `true` untuk juga menjalankan intelijen email pada alamat tersebut: skor risiko dan riwayat pelanggaran datanya.
Add-on ini ditagih \$0.05 per permintaan dengan harga daftar, di luar harga pemeriksaan itu sendiri.
Permintaan akan mengembalikan `403` jika saldo Anda tidak cukup untuk menutupinya.

Tiga kolom menentukan apa yang dilakukan sinyal-sinyal tersebut.
Masing-masing bernilai `NO_ACTION` (default) atau `DECLINE`, dan masing-masing hanya berlaku jika `enable_enrichment` bernilai `true`.

| Kolom | Ditolak jika |
| - | - |
| `email_intelligence_score_action` | Skor risiko berada di atas ambang batas. |
| `recent_email_breach_action` | Alamat muncul dalam pelanggaran data yang diketahui baru-baru ini. |
| `frequent_email_breach_action` | Alamat muncul dalam banyak pelanggaran data yang diketahui. |

Dengan `NO_ACTION`, sinyal tetap dikembalikan dalam `email.email_intelligence`, sehingga Anda dapat menerapkan aturan Anda sendiri.


## OpenAPI

````yaml id/openapi-25.json POST /v3/email/check/
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/email/check/:
    post:
      tags:
        - Standalone APIs
      summary: Periksa Kode Email
      description: >-
        Verifikasi OTP yang dikirimkan oleh [`POST
        /v3/email/send/`](/id/standalone-apis/email-send) dan dapatkan hasil
        verifikasi akhir beserta intelijen email: keterkiriman, paparan
        kebocoran data (`is_breached` dan daftar `breaches` dari database
        intelijen kebocoran data), deteksi penyedia email sekali pakai, dan
        penggunaan ganda alamat tersebut di seluruh sesi Anda.


        **Cara pemeriksaan menemukan verifikasi.** Pencocokan dilakukan
        berdasarkan aplikasi Anda ditambah alamat `email` — `request_id` bukan
        merupakan input. Verifikasi tertunda terbaru yang dibuat dalam **5
        menit** terakhir akan diperiksa. Jika tidak ada (tidak pernah dikirim,
        sudah diselesaikan, tidak dapat dikirim saat pengiriman, atau lebih dari
        5 menit), endpoint mengembalikan `200` dengan `status: "Expired or Not
        Found"`.


        **Batas percobaan.** Setiap verifikasi mengizinkan **3 kali percobaan
        kode**. Dua kode salah pertama mengembalikan `status: "Failed"` dengan
        sisa percobaan dan `email: null`; kode salah ketiga menyelesaikan
        verifikasi sebagai `Declined` dengan peringatan
        `EMAIL_CODE_ATTEMPTS_EXCEEDED` dan mengembalikan laporan email lengkap.
        Kode dibandingkan secara tidak peka huruf besar/kecil (relevan untuk
        pengiriman `alphanumeric_code`); hanya kode yang paling baru dikirim
        yang valid.


        **Hasil.** `Approved` — kode benar dan tidak ada risiko penolakan.
        `Declined` — terminal: kode benar tetapi cocok dengan risiko penolakan
        (tindakan `DECLINE` di bawah, alamat yang masuk daftar blokir, atau
        alamat ditemukan tidak dapat dikirim saat finalisasi), atau batas
        percobaan telah habis. `Failed` — kode salah, masih ada sisa percobaan.
        `Expired or Not Found` — tidak ada yang perlu diperiksa. Pada
        `Approved`/`Declined`, `request_id` sama dengan `request_id` pengiriman
        (id sesi) dan `email` memuat laporan lengkap (`is_breached`, `breaches`,
        `is_disposable`, `is_undeliverable`, `warnings`, `lifecycle`,
        `matches`); pada `Failed` dan `Expired or Not Found`, `request_id`
        berupa UUID acak sekali pakai.


        **Tindakan risiko.** `duplicated_email_action`, `breached_email_action`,
        dan `disposable_email_action` menentukan apa yang terjadi ketika risiko
        terkait terdeteksi pada kode yang benar: `DECLINE` mengubah status akhir
        menjadi `Declined`; `NO_ACTION` (default) mencatat risiko dalam
        `email.warnings` tanpa memengaruhi status.


        **Penagihan.** Pemeriksaan gratis — kredit digunakan saat pengiriman
        berhasil.


        **Persistensi sesi.** Pemeriksaan yang telah selesai akan memperbarui
        sesi yang dibuat oleh pengiriman (terlihat di Business Console, dapat
        diperiksa melalui `GET /v3/session/{sessionId}/decision/`) dan memicu
        webhook `status.updated`.


        **Sandbox.** Kunci API sandbox melewati semua pemrosesan: kode apa pun
        dengan format yang benar (termasuk `123456`) mengembalikan payload
        statis `Approved` dengan objek `email` yang disederhanakan (`status`,
        `email`, `is_breached`, `is_disposable`, `is_undeliverable`); input
        dengan format salah tetap mengembalikan `400`. Tidak ada data yang
        disimpan.


        **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.** Kuota penulisan bersama sebesar 300 permintaan/menit per
        kunci API di seluruh endpoint POST/PATCH/DELETE; melebihi batas ini akan
        mengembalikan `429`.


        **Jejak sosial.** Atur `enable_social` ke `true` untuk menambahkan blok
        `email_social`: platform online tempat alamat ini terdaftar, beserta
        jumlah per kategori dan detail profil apa pun yang tersedia.
        `profiles_registered: 0` berarti platform telah diperiksa dan alamat
        tersebut tidak ditemukan di platform mana pun - jawaban yang valid dan
        dapat ditagih. Blok ini tidak ada jika add-on tidak diminta atau
        pemeriksaan tidak dapat diselesaikan, dan tidak ditagih dalam kasus
        tersebut. Penagihan menambahkan satu unit `email_social` per permintaan
        di luar harga endpoint ini sendiri.
      operationId: post_v3email_check
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  format: email
                  description: >-
                    Alamat email yang sama dengan yang digunakan dalam panggilan
                    [`POST /v3/email/send/`](/id/standalone-apis/email-send)
                    yang cocok. Ini yang menautkan pemeriksaan ke pengiriman.
                  example: alice@example.com
                code:
                  type: string
                  maxLength: 10
                  description: >-
                    OTP yang diterima pengguna akhir: 4–8 digit, atau 4–8
                    huruf/angka jika `alphanumeric_code: true` digunakan saat
                    pengiriman. Perbandingan tidak peka huruf besar/kecil.
                  example: '123456'
                duplicated_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Tindakan yang harus diambil ketika alamat yang sama telah
                    digunakan dan disetujui oleh pengguna yang berbeda (hanya
                    verifikasi yang disetujui sebelumnya yang dihitung)
                    (`vendor_data` berbeda) dari aplikasi Anda. `DECLINE`
                    mengubah `status` akhir menjadi `Declined`; `NO_ACTION`
                    mencatat risiko dalam `email.warnings` dan mengisi
                    `email.matches`.
                breached_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Tindakan yang diambil saat alamat muncul dalam kebocoran
                    data yang diketahui (`email.is_breached`). `DECLINE`
                    mengubah `status` akhir menjadi `Declined`; `NO_ACTION`
                    mencatat risiko tersebut dalam `email.warnings`.
                disposable_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Tindakan yang harus diambil ketika domain milik penyedia
                    email sekali pakai/sementara (`email.is_disposable`).
                    `DECLINE` mengubah `status` akhir menjadi `Declined`;
                    `NO_ACTION` mencatat risiko dalam `email.warnings`.
                enable_enrichment:
                  type: boolean
                  default: false
                  description: >-
                    Jika `true`, jalankan juga intelijen email pada alamat
                    tersebut: skor risiko dan riwayat kebocorannya. Ditagihkan
                    sebagai satu unit `email_intelligence_api` per permintaan
                    ($0.05 pada harga terdaftar) di luar harga endpoint ini
                    sendiri. Permintaan mengembalikan `403` jika saldo Anda
                    tidak mencukupi.
                  example: false
                email_intelligence_score_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Tindakan saat skor risiko intelijen email berada di atas
                    ambang batas. `DECLINE` mengubah `status` akhir menjadi
                    `Declined`; `NO_ACTION` mencatat sinyal tanpa menolak. Hanya
                    berlaku saat `enable_enrichment` bernilai `true`.
                recent_email_breach_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Tindakan saat alamat muncul dalam kebocoran data terkini
                    yang diketahui. `DECLINE` mengubah `status` akhir menjadi
                    `Declined`; `NO_ACTION` mencatat sinyal tanpa menolak. Hanya
                    berlaku saat `enable_enrichment` bernilai `true`.
                frequent_email_breach_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Tindakan saat alamat muncul dalam banyak kebocoran data yang
                    diketahui. `DECLINE` mengubah `status` akhir menjadi
                    `Declined`; `NO_ACTION` mencatat sinyal tanpa menolak. Hanya
                    berlaku saat `enable_enrichment` bernilai `true`.
                enable_social:
                  type: boolean
                  default: false
                  description: >-
                    Jika true, cari juga jejak sosial alamat tersebut - platform
                    email, sosial, profesional, e-commerce, dan hiburan tempat
                    alamat tersebut terdaftar. Ditagih sebagai satu unit
                    `email_social` per permintaan selain harga endpoint ini
                    sendiri.
                  example: true
                email_no_social_presence_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Tindakan saat pemeriksaan jejak sosial mendapati alamat
                    tidak terdaftar di platform mana pun yang dicakup. Hanya
                    NO_ACTION dan DECLINE yang diterima pada endpoint ini;
                    REVIEW tersedia pada kunci konfigurasi alur kerja dengan
                    nama yang sama.
              required:
                - email
                - code
            examples:
              Default:
                summary: Catat semua risiko tetapi jangan pernah menolak otomatis
                value:
                  email: alice@example.com
                  code: '123456'
              Strict risk policy:
                summary: >-
                  Tolak otomatis kotak masuk sekali pakai dan yang mengalami
                  kebocoran data
                value:
                  email: alice@example.com
                  code: '123456'
                  disposable_email_action: DECLINE
                  breached_email_action: DECLINE
      responses:
        '200':
          description: >-
            Pemeriksaan selesai — kode yang salah dan verifikasi yang tidak
            ditemukan juga mengembalikan `200`; periksa `status`, bukan kode
            HTTP. `email` hanya diisi pada hasil akhir (`Approved`/`Declined`),
            `null` pada `Failed`, dan tidak ada pada `Expired or Not Found`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmailVerificationCheckResponse'
              examples:
                Approved:
                  summary: Kode benar — alamat bersih, laporan email lengkap
                  value:
                    request_id: e39cb057-92fc-4b59-b84e-02fec29a0f24
                    status: Approved
                    message: The verification code is correct.
                    email:
                      status: Approved
                      email: alice@example.com
                      is_breached: false
                      breaches: []
                      is_disposable: false
                      is_undeliverable: false
                      verification_attempts: 1
                      verified_at: '2026-06-12T01:24:47.311323Z'
                      warnings: []
                      lifecycle:
                        - type: EMAIL_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                          fee: 0.02
                        - type: VALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '123456'
                            status: Approved
                          fee: 0
                        - type: EMAIL_VERIFICATION_APPROVED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details: null
                          fee: 0
                      matches: []
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:47.401719+00:00'
                Approved with breach exposure:
                  summary: >-
                    Kode benar; paparan pelanggaran dicatat sebagai peringatan
                    (breached_email_action=NO_ACTION)
                  value:
                    request_id: 3a1f2b6c-9d4e-4f7a-8b2c-1e5d6f7a8b9c
                    status: Approved
                    message: The verification code is correct.
                    email:
                      status: Approved
                      email: bob@example.com
                      is_breached: true
                      breaches:
                        - name: ExampleApp
                          domain: exampleapp.com
                          breach_date: '2019-03-21'
                          breach_emails_count: 763117
                          description: >-
                            In March 2019, the social platform ExampleApp
                            suffered a data breach that exposed email addresses
                            and passwords.
                          logo_path: https://<media-host>/logos/ExampleApp.png
                          data_classes:
                            - email_addresses
                            - passwords
                          is_verified: true
                      is_disposable: false
                      is_undeliverable: false
                      verification_attempts: 1
                      verified_at: '2026-06-12T01:24:47.311323Z'
                      warnings:
                        - feature: EMAIL
                          risk: BREACHED_EMAIL_DETECTED
                          additional_data: null
                          log_type: information
                          short_description: Breached email detected
                          long_description: >-
                            This email address was found in one or more known
                            data breaches.
                      lifecycle:
                        - type: EMAIL_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                          fee: 0.02
                        - type: VALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '835126'
                            status: Approved
                          fee: 0
                        - type: EMAIL_VERIFICATION_APPROVED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details: null
                          fee: 0
                      matches: []
                    vendor_data: user-5678
                    metadata: null
                    created_at: '2026-06-12T01:24:47.401719+00:00'
                Failed (attempts remaining):
                  summary: >-
                    Kode salah — pengguna dapat mencoba lagi; request_id di sini
                    adalah UUID satu kali pakai
                  value:
                    request_id: 11111111-2222-3333-4444-555555555555
                    status: Failed
                    message: 'The verification code is incorrect. Attempts remaining: 2'
                    email: null
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:21.512340+00:00'
                Declined (risk policy):
                  summary: >-
                    Kode benar, tetapi alamat tersebut adalah alamat sekali
                    pakai dan disposable_email_action=DECLINE
                  value:
                    request_id: 8c2d3e4f-5a6b-4c7d-8e9f-0a1b2c3d4e5f
                    status: Declined
                    message: The verification code is correct.
                    email:
                      status: Declined
                      email: tempuser42@mailinator.com
                      is_breached: false
                      breaches: []
                      is_disposable: true
                      is_undeliverable: false
                      verification_attempts: 1
                      verified_at: '2026-06-12T01:24:47.311323Z'
                      warnings:
                        - feature: EMAIL
                          risk: DISPOSABLE_EMAIL_DETECTED
                          additional_data: null
                          log_type: error
                          short_description: Disposable email detected
                          long_description: >-
                            The system detected that the email is disposable,
                            which is not allowed.
                      lifecycle:
                        - type: EMAIL_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                          fee: 0.02
                        - type: VALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '123456'
                            status: Approved
                          fee: 0
                        - type: EMAIL_VERIFICATION_DECLINED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details:
                            reason: DISPOSABLE_EMAIL_DETECTED
                          fee: 0
                      matches: []
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:47.401719+00:00'
                Expired or Not Found:
                  summary: >-
                    Tidak ada verifikasi tertunda untuk alamat ini dalam 5 menit
                    terakhir
                  value:
                    request_id: 88808a77-06e9-4cb0-85f5-9c052ddfd987
                    status: Expired or Not Found
                    message: No pending email verification found in the last 5 minutes.
                    vendor_data: null
                    metadata: null
                    created_at: '2026-06-12T01:24:59.887904+00:00'
        '400':
          description: >-
            Kesalahan validasi — envelope kesalahan kolom DRF: satu array pesan
            per kolom yang bermasalah.
          content:
            application/json:
              examples:
                Invalid email:
                  summary: Alamat email salah format
                  value:
                    email:
                      - Enter a valid email address.
                Missing code:
                  summary: '`code` tidak disertakan dalam bodi'
                  value:
                    code:
                      - This field is required.
        '403':
          description: >-
            Izin ditolak. Dikembalikan ketika header `x-api-key` tidak ada;
            kunci yang salah, dicabut, atau kedaluwarsa mengembalikan `401`.
            Pemeriksaan ini gratis, sehingga tidak ada pemeriksaan kredit di
            sini.
          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.
        '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/email/check/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "email": "alice@example.com",
                "code": "123456",
                "disposable_email_action": "DECLINE"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.email.check_code(
                email="alice@example.com",
                code="123456",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

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

            const result = await didit.email.checkCode({
              email: "alice@example.com",
              code: "123456",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Email.CheckCode(ctx, didit.EmailCheckCodeParams{\n\tEmail: \"alice@example.com\",\n\tCode:  \"123456\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: |-
            import me.didit.Didit;
            import me.didit.types.EmailCheckCodeParams;

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

            var result = client.email().checkCode(EmailCheckCodeParams.builder()
                    .email("alice@example.com")
                    .code("123456")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

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

            $result = $didit->email->checkCode([
                'email' => 'alice@example.com',
                'code' => '123456',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.email.check_code(
              email: "alice@example.com",
              code: "123456"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.Email.CheckCodeAsync(new
            EmailCheckCodeParams

            {
                Email = "alice@example.com",
                Code = "123456",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    EmailVerificationCheckResponse:
      type: object
      properties:
        request_id:
          type: string
          format: uuid
          description: >-
            Pada `Approved`/`Declined`: ID sesi verifikasi yang cocok — identik
            dengan `request_id` yang dikembalikan oleh `POST /v3/email/send/`.
            Pada `Failed` dan `Expired or Not Found`: UUID acak sekali pakai
            yang tidak dapat dicari kemudian.
        status:
          type: string
          enum:
            - Approved
            - Declined
            - Failed
            - Expired or Not Found
          description: >-
            `Approved` — kode benar, tidak ada risiko penolakan. `Declined` —
            terminal: risiko penolakan cocok atau batas percobaan (3) telah
            habis. `Failed` — kode salah, percobaan masih tersisa. `Expired or
            Not Found` — tidak ada verifikasi tertunda untuk alamat ini dalam 5
            menit terakhir.
        message:
          type: string
          description: >-
            Penjelasan hasil yang mudah dibaca manusia, termasuk jumlah
            percobaan yang tersisa setelah kode yang salah.
        email:
          type: object
          nullable: true
          description: >-
            Laporan email lengkap. Ada (tidak bernilai null) hanya pada hasil
            akhir (`Approved`/`Declined`); bernilai `null` pada status `Failed`
            dan tidak ada pada `Expired or Not Found`.
          properties:
            status:
              type: string
              enum:
                - Approved
                - Declined
                - In Review
                - Not Finished
                - Expired
              description: >-
                Status akhir dari verifikasi email. Cocok dengan `status`
                tingkat teratas untuk pemeriksaan yang sudah selesai.
            email:
              type: string
              format: email
              description: Alamat email yang terverifikasi.
              example: alice@example.com
            is_breached:
              type: boolean
              description: >-
                `true` jika alamat muncul dalam kebocoran data yang diketahui
                (pencarian intelijen kebocoran data dijalankan saat finalisasi).
            breaches:
              type: array
              description: >-
                Hingga 5 kebocoran data terbaru yang diketahui berisi alamat
                ini. Larik kosong (atau dihilangkan) jika `is_breached` bernilai
                `false`.
              items:
                type: object
                properties:
                  name:
                    type: string
                    description: Pengidentifikasi pelanggaran.
                  domain:
                    type: string
                    description: Domain dari layanan yang mengalami kebocoran data.
                  breach_date:
                    type: string
                    format: date
                    description: Tanggal pelanggaran terjadi.
                  breach_emails_count:
                    type: integer
                    description: Jumlah total akun yang terekspos dalam pelanggaran data.
                  description:
                    type: string
                    description: >-
                      Deskripsi pelanggaran yang mudah dibaca manusia (dapat
                      berisi markup HTML).
                  logo_path:
                    type: string
                    description: URL logo layanan yang mengalami kebocoran data.
                  data_classes:
                    type: array
                    items:
                      type: string
                    description: >-
                      Kategori data yang terekspos, dalam snake_case (misalnya,
                      `email_addresses`, `passwords`).
                  is_verified:
                    type: boolean
                    description: Apakah pelanggaran telah diverifikasi sebagai sah.
            is_disposable:
              type: boolean
              description: >-
                `true` saat domain milik penyedia email sekali pakai/sementara
                yang dikenal.
            is_undeliverable:
              type: boolean
              description: >-
                `true` jika alamat tidak dapat menerima email (validasi sintaks
                atau DNS/MX gagal, atau pesan terpental).
            verification_attempts:
              type: integer
              description: >-
                Jumlah pengiriman OTP untuk verifikasi ini (1, atau 2 setelah
                coba lagi).
            verified_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Waktu ketika kode yang benar dimasukkan. `null` jika verifikasi
                tidak pernah disetujui.
            warnings:
              type: array
              description: >-
                Peringatan risiko yang dicatat selama verifikasi (duplikat,
                bocor, sekali pakai, tidak dapat dikirim, batas percobaan
                terlampaui, daftar blokir, dll.). Berupa array kosong jika tidak
                ada.
              items:
                type: object
                properties:
                  feature:
                    type: string
                    description: >-
                      Fitur yang menghasilkan peringatan. Selalu `EMAIL` di
                      sini.
                  risk:
                    type: string
                    description: Kode risiko yang dapat dibaca mesin.
                  additional_data:
                    type: object
                    nullable: true
                    description: >-
                      Konteks khusus risiko (misalnya, id sesi yang terduplikasi
                      untuk risiko duplikat). `null` saat risiko tidak membawa
                      data tambahan.
                  log_type:
                    type: string
                    enum:
                      - error
                      - warning
                      - information
                    description: >-
                      Tingkat keparahan. Risiko `error` menyebabkan verifikasi
                      ditolak, `warning` menandainya untuk ditinjau,
                      `information` dicatat tanpa memengaruhi 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.
            lifecycle:
              type: array
              description: >-
                Jejak audit kronologis verifikasi. Event `type` adalah salah
                satu dari `EMAIL_VERIFICATION_MESSAGE_SENT`,
                `EMAIL_VERIFICATION_RETRY_MESSAGE_SENT`, `VALID_CODE_ENTERED`,
                `INVALID_CODE_ENTERED`, `EMAIL_VERIFICATION_APPROVED`,
                `EMAIL_VERIFICATION_DECLINED`, `EMAIL_VERIFICATION_IN_REVIEW`,
                `EMAIL_VERIFICATION_EXPIRED`.
              items:
                type: object
                properties:
                  type:
                    type: string
                    description: Tipe event.
                  timestamp:
                    type: string
                    format: date-time
                    description: Waktu ketika peristiwa terjadi.
                  details:
                    type: object
                    nullable: true
                    description: >-
                      Payload khusus event. Event kirim: `{status, reason}`.
                      Event entri kode: `{code_tried, status}`. Event status
                      akhir: `null`, atau `{reason}` jika ditolak atau dalam
                      peninjauan.
                  fee:
                    type: number
                    description: >-
                      Jumlah USD yang ditagihkan untuk event ini. Bernilai bukan
                      nol hanya pada pengiriman pertama yang berhasil; 0 untuk
                      percobaan ulang, entri kode, dan event status.
            matches:
              type: array
              description: >-
                Sesi lain dari aplikasi Anda (KYC, KYB, atau API) tempat alamat
                email yang sama digunakan oleh pengguna yang berbeda
                (`vendor_data` berbeda). Hingga 5 entri; kecocokan daftar blokir
                sintetis dari entri daftar ditambahkan di awal jika ada (dan
                hanya jika tidak ada email turunan sesi yang masuk daftar
                blokir) — kecocokan turunan sesi mempertahankan urutan
                created_at. Larik kosong jika tidak ada kecocokan.
              items:
                type: object
                properties:
                  session_id:
                    type: string
                    format: uuid
                    description: >-
                      ID sesi dari verifikasi lain yang menggunakan alamat email
                      ini.
                  session_number:
                    type: integer
                    description: Nomor urut sesi yang mudah dibaca manusia.
                  vendor_data:
                    type: string
                    nullable: true
                    description: '`vendor_data` dari sesi tersebut.'
                  verification_date:
                    type: string
                    description: >-
                      Waktu ketika sesi tersebut dibuat
                      (`YYYY-MM-DDTHH:MM:SSZ`).
                  email:
                    type: string
                    description: Alamat email yang cocok.
                  status:
                    type: string
                    description: >-
                      Status sesi tersebut (misalnya, `Approved`, `Declined`,
                      `In Progress`).
                  is_blocklisted:
                    type: boolean
                    description: Apakah alamat email ada di daftar blokir aplikasi Anda.
                  api_service:
                    type: string
                    nullable: true
                    description: >-
                      Untuk sesi bertipe API, API mandiri yang membuatnya
                      (misalnya, `PHONE_VERIFICATION`); `null` untuk sesi
                      verifikasi reguler.
                  source:
                    type: string
                    description: >-
                      Tempat kecocokan ditemukan. Biasanya `session`; kecocokan
                      daftar blokir melalui entri daftar organisasi menambahkan
                      kecocokan sintetis di awal dengan `source: "list_entry"`
                      serta `session_id`/`session_number` bernilai null.
            email_social:
              $ref: '#/components/schemas/EmailSocialFootprint'
            email_intelligence:
              allOf:
                - $ref: '#/components/schemas/EmailIntelligence'
              description: >-
                Sinyal intelijen email. Hanya ada jika `enable_enrichment`
                bernilai `true` pada pemeriksaan.
        vendor_data:
          type: string
          nullable: true
          description: >-
            `vendor_data` dari sesi verifikasi yang cocok. `null` pada `Expired
            or Not Found`.
        metadata:
          type: object
          nullable: true
          description: >-
            `metadata` dari sesi verifikasi yang cocok. `null` pada `Expired or
            Not Found`.
        created_at:
          type: string
          format: date-time
          description: Cap waktu respons pemeriksaan ini.
    EmailSocialFootprint:
      type: object
      nullable: true
      description: >-
        Jejak sosial dari alamat email: platform online tempat alamat tersebut
        terdaftar. Ada hanya jika `enable_social` diatur dan pemeriksaan
        selesai. Setiap hitungan dapat bernilai null jika tidak ada data yang
        dikembalikan untuknya. `profiles_registered: 0` berarti platform telah
        diperiksa dan alamat email tidak ditemukan di platform mana pun -
        respons yang valid, dapat ditagih, dan merupakan sinyal identitas
        sintetis yang umum.
      properties:
        profiles_registered:
          type: integer
          nullable: true
          description: Platform tempat alamat email dikonfirmasi terdaftar.
          example: 5
        profiles_checked:
          type: integer
          nullable: true
          description: Platform yang dievaluasi untuk pendaftaran.
          example: 14
        names_found:
          type: integer
          nullable: true
          description: Platform yang mengembalikan nama terkait.
          example: 0
        photos_found:
          type: integer
          nullable: true
          description: Platform yang mengembalikan foto profil.
          example: 0
        communication_breadth:
          type: integer
          nullable: true
          description: Platform komunikasi yang keberadaannya terdeteksi.
          example: 2
        digital_footprint_diversity:
          type: integer
          nullable: true
          description: Kategori platform unik dengan keberadaan yang terdeteksi.
          example: 5
        digital_sophistication_index:
          type: integer
          nullable: true
          description: Indikator kematangan digital komposit, 0-10.
          example: 5
        engagement_depth_index:
          type: integer
          nullable: true
          description: Indikator kekayaan profil, 0-10.
          example: 3
        subscription_affordability_index:
          type: integer
          nullable: true
          description: Bauran platform gratis vs berbayar, 0-10.
          example: 2
        free_platforms:
          type: integer
          nullable: true
          description: Pendaftaran pada platform gratis.
          example: 4
        full_paid_platforms:
          type: integer
          nullable: true
          description: Pendaftaran pada platform berbayar penuh.
          example: 0
        partial_paid_platforms:
          type: integer
          nullable: true
          description: Pendaftaran pada platform freemium.
          example: 1
        whatsapp_profile_completeness:
          type: string
          nullable: true
          enum:
            - Basic
            - Partial
            - Complete
            - Not Present
            - null
          description: Kelengkapan profil WhatsApp. Hanya untuk telepon; null untuk email.
          example: Partial
        registered_platforms:
          type: array
          description: Platform tempat pendaftaran dikonfirmasi.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        not_registered_platforms:
          type: array
          description: Platform yang diperiksa dengan hasil negatif.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        categories:
          type: object
          description: Jumlah dan rasio terdaftar per kategori platform.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintCategorySummary'
        profiles:
          type: object
          description: >-
            Detail profil per platform, dikunci berdasarkan platform, jika
            platform menyediakannya.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintProfile'
    EmailIntelligence:
      type: object
      description: >-
        Blok intelijen email yang dinormalisasi. Hanya ada ketika add-on
        intelijen dijalankan untuk email ini; jika ada, ini juga diekspos
        sebagai alias `enrichment` dengan nilai yang identik.
      properties:
        score:
          type: number
          nullable: true
          description: >-
            Skor risiko 0-100 yang dinormalisasi. Lebih tinggi berarti lebih
            berisiko.
        deliverable:
          type: string
          nullable: true
          description: Tingkat keterkiriman (misalnya, `high`).
        breach_risk_level:
          type: string
          nullable: true
          description: '`Low`, `Medium`, atau `High`.'
        breach_risk_index:
          type: number
          nullable: true
          description: Indeks risiko pelanggaran numerik.
        is_recent_breach:
          type: boolean
          nullable: true
          description: '`true` jika alamat muncul dalam kebocoran data terkini.'
        is_frequent_breached:
          type: boolean
          nullable: true
          description: '`true` jika alamat muncul dalam banyak kebocoran data.'
        is_disposable:
          type: boolean
          nullable: true
          description: '`true` saat domain merupakan penyedia email sekali pakai.'
        is_free_domain:
          type: boolean
          nullable: true
          description: '`true` saat domain merupakan penyedia email gratis.'
        is_breached:
          type: boolean
          nullable: true
          description: '`true` jika alamat muncul dalam kebocoran data yang diketahui.'
        no_of_breaches:
          type: number
          nullable: true
          description: Jumlah kebocoran data yang diketahui yang memuat alamat tersebut.
        reason_codes:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                description: >-
                  Pengidentifikasi Didit yang stabil untuk sinyal tersebut,
                  misalnya `IR-5AC67A32`. Tidak transparan: kelompokkan dan
                  filter berdasarkan nilai ini, jangan menguraikannya.
              value:
                nullable: true
                description: >-
                  Untuk flag risiko (misalnya `voip`, `leaked`, `disposable`,
                  `spam_trap`), nilainya: boolean, level, atau tanggal. Null
                  untuk kode alasan dengan skor.
              direction:
                type: string
                enum:
                  - risk
                  - trust
                description: Apakah sinyal meningkatkan risiko atau menambah kepercayaan.
              message:
                type: string
                description: >-
                  Penjelasan sinyal yang mudah dibaca manusia, dalam bahasa
                  Inggris.
              impact_level:
                type: string
                nullable: true
                description: >-
                  Seberapa kuat sinyal tersebut memengaruhi skor, misalnya
                  `low`, `medium`, atau `high`.
          description: >-
            Sinyal yang menjelaskan skor tersebut, masing-masing dengan kode
            Didit yang stabil, arah, pesan, dan tingkat dampak. Kode baru dapat
            muncul sewaktu-waktu, jadi jangan tolak kode yang tidak dikenal.
    SocialFootprintPlatform:
      type: object
      properties:
        platform:
          type: string
          description: Pengenal platform.
          example: whatsapp
        category:
          type: string
          description: >-
            Kategori platform, mis. MESSAGING, SOCIAL_MEDIA, ECOMMERCE,
            PROFESSIONAL, EMAIL_PROVIDER.
          example: MESSAGING
        scope:
          type: string
          enum:
            - global
            - local
          description: >-
            `global` untuk platform di seluruh dunia, `local` untuk platform
            khusus kawasan tertentu.
          example: global
    SocialFootprintCategorySummary:
      type: object
      properties:
        registered:
          type: integer
          nullable: true
          description: Platform dalam kategori ini tempat pendaftaran dikonfirmasi.
          example: 2
        ratio:
          type: number
          format: float
          nullable: true
          description: >-
            Porsi platform yang diperiksa dalam kategori tersebut yang memiliki
            registrasi, 0.0-1.0.
          example: 0.6667
    SocialFootprintProfile:
      type: object
      properties:
        name:
          type: string
          nullable: true
          description: Nama profil, jika platform menampilkannya.
        photo:
          type: string
          nullable: true
          description: URL foto profil, jika platform menampilkannya.
        about:
          type: string
          nullable: true
          description: Teks tentang/bio profil, jika platform menampilkannya.
        privacy_status:
          type: string
          nullable: true
          enum:
            - PUBLIC
            - PRIVATE
            - null
          description: Visibilitas profil, jika platform menampilkannya.
        business_account:
          type: boolean
          nullable: true
          description: >-
            Apakah profil tersebut merupakan akun bisnis, jika platform
            menampilkannya.
  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.