> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# API Verifikasi Telepon: Validasi Kode OTP SMS

> Validasi OTP telepon via POST /v3/phone/check/ di Didit: jenis operator, nomor virtual, dan deteksi nomor sekali pakai. Harga per penggunaan.

## Menangani gangguan penyedia

Jika penyedia telepon sedang tidak tersedia untuk sementara, endpoint ini mengembalikan `502` dengan kode yang stabil dan dapat dibaca mesin:

```json theme={null}
{
  "detail": "The phone verification provider is temporarily unavailable.",
  "code": "phone_provider_unavailable"
}
```

Perlakukan respons ini sebagai respons yang dapat dicoba lagi. Gunakan jeda singkat (backoff), lalu tampilkan pesan layanan sementara kepada pengguna alih-alih meminta mereka mengubah nomor telepon atau kode yang sudah valid.

## Tambahan intelijen

Atur `enable_enrichment` ke `true` untuk juga menjalankan intelijen nomor telepon tersebut: skor risiko, jenis saluran, apakah nomor baru-baru ini dipindahkan, dan indeks kepercayaan.
Tambahan ini ditagih \$0.05 per permintaan dengan harga daftar, di luar harga pemeriksaan.
Permintaan mengembalikan `403` jika saldo Anda tidak cukup untuk menutupinya.

Empat kolom menentukan tindakan sinyal.
Masing-masing bernilai `NO_ACTION` (default) atau `DECLINE`, dan masing-masing hanya berlaku jika `enable_enrichment` bernilai `true`.

| Kolom | Ditolak ketika |
| - | - |
| `phone_intelligence_score_action` | Skor risiko berada di atas ambang batas. |
| `phone_type_risk_action` | Nomor termasuk jenis saluran berisiko tinggi. |
| `recent_port_action` | Nomor baru-baru ini dipindahkan ke operator lain. |
| `low_phone_trust_action` | Indeks kepercayaan berada pada atau di bawah ambang batas. |

Dengan `NO_ACTION`, sinyal tetap dikembalikan di `phone.phone_intelligence`, sehingga Anda dapat menerapkan aturan Anda sendiri.


## OpenAPI

````yaml id/openapi-25.json POST /v3/phone/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/phone/check/:
    post:
      tags:
        - Standalone APIs
      summary: Periksa Kode Telepon
      description: >-
        Verifikasi OTP yang dikirimkan oleh [`POST
        /v3/phone/send/`](/id/standalone-apis/phone-send) dan dapatkan hasil
        verifikasi akhir beserta informasi telepon: nama operator dan jenis
        saluran, penanda virtual (VoIP) serta sekali pakai, dan penggunaan nomor
        duplikat di seluruh sesi Anda.


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


        **Batas percobaan.** Setiap verifikasi mengizinkan **3 percobaan kode**.
        Dua kode salah pertama mengembalikan `status: "Failed"` dengan sisa
        percobaan dan `phone: null`; kode salah ketiga menyelesaikan verifikasi
        sebagai `Declined` dengan peringatan
        `VERIFICATION_CODE_ATTEMPTS_EXCEEDED` dan mengembalikan laporan telepon
        lengkap.


        **Hasil.** `Approved` — kode benar dan tidak ada risiko penolakan.
        `Declined` — terminal: kode benar tetapi cocok dengan risiko penolakan
        (tindakan `DECLINE` di bawah, nomor dalam daftar blokir atau berisiko
        tinggi), 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 `phone` memuat laporan lengkap
        (`carrier`, `is_virtual`, `is_disposable`, `warnings`, `lifecycle`,
        `matches`); pada `Failed` dan `Expired or Not Found`, `request_id`
        berupa UUID acak sekali pakai.


        **Tindakan risiko.** `duplicated_phone_number_action`,
        `disposable_number_action`, dan `voip_number_action` menentukan apa yang
        terjadi ketika risiko terkait terdeteksi pada kode yang benar: `DECLINE`
        mengubah status akhir menjadi `Declined`; `NO_ACTION` (bawaan) mencatat
        risiko di `phone.warnings` tanpa memengaruhi status.


        **Penagihan.** Pemeriksaan gratis — pengiriman ditagihkan di sisi
        pengiriman (lihat [Harga Verifikasi
        Telepon](/id/getting-started/phone-verification-pricing)).


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


        **Sandbox.** Kunci API sandbox melewati semua pemrosesan: kode apa pun
        dengan format yang valid (4–8 digit, termasuk `123456`) mengembalikan
        payload `Approved` statis dengan objek `phone` datar yang disederhanakan
        (`status`, `phone_number`, `country_code`, `carrier_name`, `line_type`,
        `flags`); input yang tidak valid 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.** Anggaran penulisan bersama sebesar 300 permintaan/menit
        per kunci API, ditambah batas anti-penyalahgunaan hulu sebesar 4
        percobaan per nomor per jam; melampaui salah satunya akan mengembalikan
        `429`.


        **Jejak sosial.** Atur `enable_social` ke `true` untuk menambahkan blok
        `phone_social`: platform online tempat nomor ini terdaftar, dengan
        jumlah per kategori dan detail profil apa pun yang tersedia.
        `profiles_registered: 0` berarti platform telah diperiksa dan nomor
        tidak ditemukan di platform mana pun - jawaban yang valid dan dapat
        ditagih. Blok ini tidak ada jika pengaya tidak diminta atau pemeriksaan
        tidak dapat diselesaikan, dan tidak ditagihkan dalam kasus tersebut.
        Penagihan menambahkan satu unit `phone_social` per permintaan di luar
        harga endpoint ini sendiri.
      operationId: post_v3phone_check
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                phone_number:
                  type: string
                  maxLength: 20
                  description: >-
                    Nomor telepon yang sama dengan yang digunakan dalam
                    panggilan [`POST
                    /v3/phone/send/`](/id/standalone-apis/phone-send) yang
                    cocok, dalam format E.164. Ini yang menautkan pemeriksaan ke
                    pengiriman.
                  example: '+14155552671'
                code:
                  type: string
                  minLength: 4
                  maxLength: 8
                  pattern: ^[0-9]{4,8}$
                  description: >-
                    OTP yang diterima pengguna akhir. Harus terdiri dari 4–8
                    digit angka — selain itu akan mengembalikan `400` tanpa
                    menghabiskan percobaan. Kode yang formatnya benar tetapi
                    salah akan mengembalikan `200` dengan `status: "Failed"` dan
                    menghabiskan salah satu dari 3 percobaan.
                  example: '123456'
                duplicated_phone_number_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Tindakan yang harus diambil ketika nomor yang sama telah
                    digunakan oleh pengguna yang berbeda (`vendor_data` berbeda)
                    dari aplikasi Anda. `DECLINE` mengubah `status` akhir
                    menjadi `Declined`; `NO_ACTION` mencatat risiko dalam
                    `phone.warnings` dan mengisi `phone.matches`.
                disposable_number_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Tindakan yang diambil saat pemeriksaan operator menandai
                    nomor tersebut sebagai nomor sementara/sekali pakai
                    (`phone.is_disposable`). `DECLINE` mengubah `status` akhir
                    menjadi `Declined`; `NO_ACTION` mencatat risiko tersebut
                    dalam `phone.warnings`.
                voip_number_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Tindakan yang diambil saat pencarian operator melaporkan
                    jenis nomor virtual — `voip`, `isp`, atau `vpn`
                    (`phone.is_virtual`). `DECLINE` mengubah `status` akhir
                    menjadi `Declined`; `NO_ACTION` mencatat risiko tersebut
                    dalam `phone.warnings`.
                enable_enrichment:
                  type: boolean
                  default: false
                  description: >-
                    Jika `true`, jalankan juga intelijen telepon pada nomor
                    tersebut: skor risiko, jenis saluran, apakah nomor baru saja
                    di-porting, dan indeks kepercayaan. Ditagihkan sebagai satu
                    unit `phone_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
                phone_intelligence_score_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Tindakan saat skor risiko intelijen telepon berada di atas
                    ambang batas. `DECLINE` mengubah `status` akhir menjadi
                    `Declined`; `NO_ACTION` mencatat sinyal tanpa menolak. Hanya
                    berlaku saat `enable_enrichment` bernilai `true`.
                phone_type_risk_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Tindakan saat nomor telepon merupakan jenis saluran berisiko
                    tinggi. `DECLINE` mengubah `status` akhir menjadi
                    `Declined`; `NO_ACTION` mencatat sinyal tanpa menolak. Hanya
                    berlaku saat `enable_enrichment` bernilai `true`.
                recent_port_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Tindakan saat nomor baru saja di-porting ke operator lain.
                    `DECLINE` mengubah `status` akhir menjadi `Declined`;
                    `NO_ACTION` mencatat sinyal tanpa menolak. Hanya berlaku
                    saat `enable_enrichment` bernilai `true`.
                low_phone_trust_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Tindakan saat indeks kepercayaan intelijen telepon berada
                    pada atau di bawah ambang batas. `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 nomor tersebut - platform
                    perpesanan, sosial, e-commerce, dan profesional tempat nomor
                    tersebut terdaftar. Ditagih sebagai satu unit `phone_social`
                    per permintaan selain harga endpoint ini sendiri.
                  example: true
                phone_no_social_presence_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Tindakan saat pemeriksaan jejak sosial mendapati nomor 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:
                - phone_number
                - code
            examples:
              Default:
                summary: Catat semua risiko tetapi jangan pernah menolak otomatis
                value:
                  phone_number: '+14155552671'
                  code: '123456'
              Strict risk policy:
                summary: Tolak otomatis nomor VoIP dan sekali pakai
                value:
                  phone_number: '+14155552671'
                  code: '123456'
                  voip_number_action: DECLINE
                  disposable_number_action: DECLINE
      responses:
        '200':
          description: >-
            Pemeriksaan selesai — kode yang salah dan verifikasi yang tidak
            ditemukan juga mengembalikan `200`; periksa `status`, bukan kode
            HTTP. `phone` 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/PhoneVerificationCheckResponse'
              examples:
                Approved:
                  summary: >-
                    Kode benar — laporan telepon lengkap dengan operator, siklus
                    hidup, dan kecocokan
                  value:
                    request_id: e39cb057-92fc-4b59-b84e-02fec29a0f24
                    status: Approved
                    message: The verification code is correct.
                    phone:
                      status: Approved
                      phone_number_prefix: '+1'
                      phone_number: '4155552671'
                      full_number: '+14155552671'
                      country_code: US
                      country_name: United States
                      carrier:
                        name: AT&T
                        type: mobile
                      is_disposable: false
                      is_virtual: false
                      verification_method: whatsapp
                      verification_attempts: 1
                      verified_at: '2026-06-12T01:24:47.311323Z'
                      warnings: []
                      lifecycle:
                        - type: PHONE_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                            channel: whatsapp
                            actual_channel: whatsapp
                          fee: 0.0509
                        - type: PHONE_DELIVERY_DELIVERED
                          timestamp: '2026-06-12T01:23:43.118220+00:00'
                          details:
                            channel: whatsapp
                            status: delivered
                          fee: 0
                        - type: VALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '123456'
                            status: Approved
                          fee: 0
                        - type: PHONE_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'
                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'
                    phone: null
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:21.512340+00:00'
                Declined (max attempts):
                  summary: Kode salah ketiga — verifikasi diselesaikan sebagai Ditolak
                  value:
                    request_id: e39cb057-92fc-4b59-b84e-02fec29a0f24
                    status: Declined
                    message: >-
                      The verification code is incorrect. Maximum attempts
                      reached.
                    phone:
                      status: Declined
                      phone_number_prefix: '+1'
                      phone_number: '4155552671'
                      full_number: '+14155552671'
                      country_code: US
                      country_name: United States
                      carrier:
                        name: AT&T
                        type: mobile
                      is_disposable: false
                      is_virtual: false
                      verification_method: whatsapp
                      verification_attempts: 1
                      verified_at: null
                      warnings:
                        - feature: PHONE
                          risk: VERIFICATION_CODE_ATTEMPTS_EXCEEDED
                          additional_data: null
                          log_type: error
                          short_description: Verification code attempts exceeded
                          long_description: >-
                            The system detected that the phone number has
                            exceeded the maximum number of verification code
                            attempts.
                      lifecycle:
                        - type: PHONE_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                            channel: whatsapp
                            actual_channel: whatsapp
                          fee: 0.0509
                        - type: INVALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:01.118220+00:00'
                          details:
                            code_tried: '111111'
                            status: Failed
                          fee: 0
                        - type: INVALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:21.512340+00:00'
                          details:
                            code_tried: '222222'
                            status: Failed
                          fee: 0
                        - type: INVALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '333333'
                            status: Failed
                          fee: 0
                        - type: PHONE_VERIFICATION_DECLINED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details:
                            reason: VERIFICATION_CODE_ATTEMPTS_EXCEEDED
                          fee: 0
                      matches: []
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:47.401719+00:00'
                Declined (risk policy):
                  summary: >-
                    Kode benar, tetapi nomornya adalah nomor VoIP dan
                    voip_number_action=DECLINE
                  value:
                    request_id: 7f1c9d2e-44a1-4b6e-9a3e-5b8e6f1c2d3a
                    status: Declined
                    message: The verification code is correct.
                    phone:
                      status: Declined
                      phone_number_prefix: '+1'
                      phone_number: '5005550006'
                      full_number: '+15005550006'
                      country_code: US
                      country_name: United States
                      carrier:
                        name: CLEC LLC
                        type: voip
                      is_disposable: false
                      is_virtual: true
                      verification_method: sms
                      verification_attempts: 1
                      verified_at: '2026-06-12T01:24:47.311323Z'
                      warnings:
                        - feature: PHONE
                          risk: VOIP_NUMBER_DETECTED
                          additional_data: null
                          log_type: error
                          short_description: VoIP number detected
                          long_description: >-
                            The system detected that the phone number is a VoIP
                            number, which is not allowed.
                      lifecycle:
                        - type: PHONE_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                            channel: whatsapp
                            actual_channel: sms
                          fee: 0.0509
                        - type: VALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '123456'
                            status: Approved
                          fee: 0
                        - type: PHONE_VERIFICATION_DECLINED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details:
                            reason: VOIP_NUMBER_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 nomor ini dalam 5 menit
                    terakhir
                  value:
                    request_id: 69cc35c6-280a-47a6-ab8c-4f32abc02ed0
                    status: Expired or Not Found
                    message: No pending phone verification found in the last 5 minutes.
                    vendor_data: null
                    metadata: null
                    created_at: '2026-06-12T01:24:47.311323+00:00'
        '400':
          description: >-
            Kesalahan validasi — envelope kesalahan kolom DRF: satu array pesan
            per kolom yang bermasalah.
          content:
            application/json:
              examples:
                Invalid code format:
                  summary: '`code` bukan 4–8 digit numerik'
                  value:
                    code:
                      - Invalid code format. Enter 4 to 8 numeric digits.
                Invalid phone number:
                  summary: '`phone_number` bukan format E.164 yang valid'
                  value:
                    phone_number:
                      - Invalid phone number provided.
                Invalid action:
                  summary: Tindakan risiko hanya menerima NO_ACTION atau DECLINE
                  value:
                    voip_number_action:
                      - '"REVIEW" is not a valid choice.'
        '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).
            Selain itu, batas atas anti-penyalahgunaan sebanyak 4 upaya
            verifikasi per nomor telepon per jam berlaku di sisi hulu. Respons
            menyertakan header `X-RateLimit-Limit`, `X-RateLimit-Remaining`,
            `X-RateLimit-Reset`, dan `Retry-After`. Catatan: header
            `X-RateLimit-*`/`Retry-After` hanya menyertai 429 batas penulisan
            300/menit; 429 batas per nomor tidak menyertakan header batas laju.
          content:
            application/json:
              examples:
                Per-number cap:
                  summary: >-
                    Lebih dari 4 upaya verifikasi untuk nomor yang sama dalam
                    satu jam terakhir
                  value:
                    detail: >-
                      Maximum verification attempts reached for this phone
                      number. Only 4 authentication attempts are allowed per
                      hour. Try again later or use a different number.
                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
        '500':
          description: >-
            Kegagalan tak terduga saat memverifikasi kode di sistem upstream
            yang bukan merupakan gangguan penyedia yang sudah diketahui. Aman
            untuk dicoba lagi; kuota percobaan hanya terpakai oleh pemeriksaan
            yang selesai.
          content:
            application/json:
              examples:
                Provider error:
                  summary: Verifikasi kode tidak dapat diselesaikan
                  value:
                    detail: Error checking phone verification
              schema:
                type: object
                properties:
                  detail:
                    type: string
        '502':
          description: >-
            Penyedia verifikasi telepon sementara tidak tersedia - respons 5xx,
            batas waktu habis (timeout), atau kegagalan koneksi yang tetap
            terjadi setelah coba lagi bawaan. Aman untuk dicoba lagi; kuota
            upaya tidak terpakai.
          content:
            application/json:
              examples:
                Provider outage:
                  summary: Penyedia tidak menjawab permintaan pemeriksaan
                  value:
                    detail: >-
                      Phone verification is temporarily unavailable. Please try
                      again shortly.
                    code: phone_provider_unavailable
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v3/phone/check/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "phone_number": "+14155552671",
                "code": "123456",
                "voip_number_action": "DECLINE"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.phone.check_code(
                phone_number="+14155552671",
                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.phone.checkCode({
              phone_number: "+14155552671",
              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.Phone.CheckCode(ctx, didit.PhoneCheckCodeParams{\n\tPhoneNumber: \"+14155552671\",\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.PhoneCheckCodeParams;

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

            var result = client.phone().checkCode(PhoneCheckCodeParams.builder()
                    .phoneNumber("+14155552671")
                    .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->phone->checkCode([
                'phone_number' => '+14155552671',
                'code' => '123456',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.phone.check_code(
              phone_number: "+14155552671",
              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.Phone.CheckCodeAsync(new
            PhoneCheckCodeParams

            {
                PhoneNumber = "+14155552671",
                Code = "123456",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    PhoneVerificationCheckResponse:
      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/phone/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 nomor ini dalam 5
            menit terakhir.
        message:
          type: string
          description: >-
            Penjelasan hasil yang mudah dibaca manusia, termasuk jumlah
            percobaan yang tersisa setelah kode yang salah.
        phone:
          type: object
          nullable: true
          description: >-
            Laporan telepon lengkap. Ada (non-null) hanya pada hasil akhir
            (`Approved`/`Declined`); bernilai `null` pada `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 telepon. Cocok dengan `status`
                tingkat teratas untuk pemeriksaan yang sudah selesai.
            phone_number_prefix:
              type: string
              description: Kode panggilan negara dengan awalan `+` (misalnya, `+1`).
              example: '+1'
            phone_number:
              type: string
              description: Nomor nasional tanpa kode panggilan negara.
              example: '4155552671'
            full_number:
              type: string
              description: Nomor lengkap dalam format E.164.
              example: '+14155552671'
            country_code:
              type: string
              nullable: true
              description: Negara ISO 3166-1 alpha-2 dari nomor tersebut.
              example: US
            country_name:
              type: string
              description: Nama lengkap negara yang diturunkan dari `country_code`.
              example: United States
            carrier:
              type: object
              description: >-
                Jaringan saat ini yang melayani nomor tersebut, dari pencarian
                operator yang dijalankan pada saat finalisasi.
              properties:
                name:
                  type: string
                  description: >-
                    Nama operator. String kosong jika pencarian tidak dapat
                    mengidentifikasinya.
                type:
                  type: string
                  description: >-
                    Jenis saluran yang dilaporkan oleh pencarian: `mobile`,
                    `fixed_line`, `voip`, `isp`, `vpn`, `toll_free`,
                    `premium_rate`, `pager`, `payphone`, `satellite`, `service`,
                    `shared_cost`, `short_codes_commercial`, `calling_cards`,
                    `local_rate`, `universal_access`, `voice_mail`, `other`,
                    atau `unknown`.
            is_disposable:
              type: boolean
              description: >-
                `true` saat nomor tersebut milik layanan nomor sementara/sekali
                pakai.
            is_virtual:
              type: boolean
              description: >-
                `true` saat jenis saluran bersifat virtual (`voip`, `isp`, atau
                `vpn`).
            verification_method:
              type: string
              description: >-
                Saluran yang benar-benar mengirimkan OTP setelah pengiriman
                dikonfirmasi (misalnya, `whatsapp`, `sms`); sebelum itu, saluran
                yang diminta.
            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,
                sekali pakai, VoIP, 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 `PHONE` 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 `PHONE_VERIFICATION_MESSAGE_SENT`,
                `PHONE_VERIFICATION_RETRY_MESSAGE_SENT`,
                `PHONE_VERIFICATION_BLOCKED`, `PHONE_DELIVERY_DELIVERED`,
                `PHONE_DELIVERY_UNDELIVERABLE`, `VALID_CODE_ENTERED`,
                `INVALID_CODE_ENTERED`, `PHONE_VERIFICATION_APPROVED`,
                `PHONE_VERIFICATION_DECLINED`, `PHONE_VERIFICATION_IN_REVIEW`,
                `PHONE_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,
                      channel, actual_channel}` (`actual_channel` terisi setelah
                      pengiriman dikonfirmasi). Event pengiriman: `{channel,
                      status}`. 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 event pengiriman (harga pengiriman); 0
                      untuk entri kode, konfirmasi pengiriman, dan event status.
            matches:
              type: array
              description: >-
                Sesi lain dari aplikasi Anda (KYC, KYB, atau API) tempat nomor
                telepon yang sama digunakan oleh pengguna berbeda (`vendor_data`
                berbeda). Hingga 5 entri, kecocokan daftar blokir dari entri
                daftar sintetis ditampilkan pertama jika ada (kecocokan yang
                berasal dari sesi mempertahankan urutan kueri). Array kosong
                jika tidak ada kecocokan.
              items:
                type: object
                properties:
                  session_id:
                    type: string
                    format: uuid
                    description: >-
                      ID sesi dari verifikasi lain yang menggunakan nomor
                      telepon 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`).
                  phone_number:
                    type: string
                    description: Nomor telepon yang cocok.
                  status:
                    type: string
                    description: >-
                      Status sesi tersebut (misalnya, `Approved`, `Declined`,
                      `In Progress`).
                  is_blocklisted:
                    type: boolean
                    description: Apakah nomor telepon 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.
            phone_social:
              $ref: '#/components/schemas/PhoneSocialFootprint'
            phone_intelligence:
              allOf:
                - $ref: '#/components/schemas/PhoneIntelligence'
              description: >-
                Sinyal intelijen telepon. Hanya ada saat `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.
    PhoneSocialFootprint:
      type: object
      nullable: true
      description: >-
        Jejak sosial dari nomor telepon: platform online tempat nomor 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 nomor telepon 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 nomor telepon 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'
    PhoneIntelligence:
      type: object
      description: >-
        Blok intelijen telepon yang dinormalisasi. Hanya ada ketika add-on
        intelijen dijalankan untuk pencarian ini; jika ada, ini juga diekspos di
        bawah alias `enrichment` dengan nilai yang identik.
      properties:
        score:
          type: number
          nullable: true
          description: >-
            Skor risiko 0-100 yang dinormalisasi. Lebih tinggi berarti lebih
            berisiko.
        phone_type_risk:
          type: string
          nullable: true
          description: '`Low`, `Medium`, atau `High`, diperoleh dari skor.'
        phone_trust_index:
          type: number
          nullable: true
          description: >-
            Kebalikan dari skor, untuk dasbor yang memilih semakin tinggi
            semakin baik.
        network_stability_index:
          type: number
          nullable: true
          description: Stabilitas jaringan lini tersebut.
        is_disposable:
          type: boolean
          nullable: true
          description: '`true` saat nomor tampak sekali pakai atau virtual.'
        is_ported:
          type: boolean
          nullable: true
          description: '`true` saat nomor telah berganti operator.'
        is_recently_ported:
          type: boolean
          nullable: true
          description: '`true` saat pemindahan nomor (port) baru saja terjadi.'
        carrier_type:
          type: string
          nullable: true
          description: >-
            Klasifikasi saluran yang dilaporkan oleh pencarian (misalnya,
            `mobile`).
        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.