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

> Integrasikan verifikasi identitas Diia ke aplikasi Anda dengan Didit. Lihat cakupan negara, langkah autentikasi, hasil, dan harga.

Mulai verifikasi Diia dari backend Anda dengan menggunakan kunci API aplikasi Anda.
Anda tidak memerlukan alur kerja atau `workflow_id`.
Respons awal menjelaskan tindakan autentikasi berikutnya; respons ini bukan hasil identitas yang disetujui.

## Cakupan dan aktivasi

| Properti | Nilai |
| - | - |
| Dompet | Diia |
| ID dompet | `diia` |
| Negara | ![](https://didit-public-assets.s3.eu-west-1.amazonaws.com/flags/ua.svg)Ukraina |
| Aktivasi dompet produksi | ⏳ Segera hadir |
| Harga dompet yang dipublikasikan | Segera hadir |

Aktivasi dompet terpisah dari penerapan API dan kelayakan aplikasi Anda.
Endpoint yang terdokumentasi tidak mengaktifkan dompet yang ditandai Segera hadir.
Untuk tarif terbaru yang dipublikasikan, lihat [harga dompet ID digital](https://docs.didit.me/id/getting-started/pricing.md#harga-dompet-id-digital).

## Yang dilakukan pengguna

Ikuti tindakan berikutnya yang dikembalikan oleh permintaan awal.
Pengalaman autentikasi dompet menentukan apakah pengguna menggunakan browser, perangkat lain, atau aplikasi.

## Menerima hasil

Ikuti [panduan API dompet ID digital](https://docs.didit.me/id/standalone-apis/digital-id-wallets.md) untuk melacak verifikasi dan mengambil hasilnya.
Anggap hanya hasil yang berstatus selesai dan terverifikasi sebagai bukti bahwa dompet mengautentikasi pengguna.
Atribut identitas yang dikembalikan bervariasi tergantung dompet; jangan berasumsi bahwa alamat, potret, atau setiap atribut yang diminta tersedia.

## Terkait

* [API dompet ID digital](https://docs.didit.me/id/standalone-apis/digital-id-wallets.md)
* [Cakupan dan atribut dompet](https://docs.didit.me/id/core-technology/id-verification/digital-id-wallets.md)
* [Harga](https://docs.didit.me/id/getting-started/pricing.md#harga-dompet-id-digital)


## OpenAPI

````yaml id/openapi-25.json POST /v3/id-verification/wallets/diia/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API Verifikasi Identitas. Lakukan autentikasi dengan header x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/id-verification/wallets/diia/:
    post:
      tags:
        - Digital ID wallets
      summary: Mulai verifikasi Diia
      description: >-
        Mulai proses masuk Diia (Ministry of Digital Transformation of Ukraine;
        UKR) tanpa alur kerja apa pun. Ditagih sekali, hanya ketika identitas
        terverifikasi. Respons membawa next_action.type=redirect beserta URL
        untuk mengarahkan browser pengguna; pengguna kembali ke return_url
        dengan request_id dan result yang dilampirkan. Baca hasilnya dengan GET
        /v3/id-verification/wallets/verifications/{request_id}/ atau dari
        webhook, jangan pernah dari URL. Aplikasi sandbox mendapatkan simulasi
        deterministik (simulated: true) yang tidak pernah menghubungi penyedia.
      operationId: start_diia_wallet_verification
      parameters:
        - in: header
          name: Idempotency-Key
          schema:
            type: string
          description: >-
            Kunci keamanan coba lagi opsional (maks 255 karakter). Mencoba lagi
            dengan kunci, dompet, dan body yang sama akan mengembalikan
            verifikasi asli tanpa memulai proses masuk kedua; kunci yang sama
            dengan dompet atau body lain akan mengembalikan 409
            idempotency_key_reused.
      requestBody:
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/DigitalIdWalletApiDiiaWalletVerificationStartRequest
            example:
              country: UKR
              vendor_data: your-customer-reference
              metadata:
                reference: example
              return_url: https://app.example.com/identity/complete
          application/x-www-form-urlencoded:
            schema:
              $ref: >-
                #/components/schemas/DigitalIdWalletApiDiiaWalletVerificationStartRequest
          multipart/form-data:
            schema:
              $ref: >-
                #/components/schemas/DigitalIdWalletApiDiiaWalletVerificationStartRequest
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/DigitalIdWalletApiWalletVerificationResponse
              example:
                request_id: 00000000-0000-4000-8000-000000000001
                wallet_verification:
                  wallet:
                    id: diia
                    name: Diia
                    issuing_authority: Ministry of Digital Transformation of Ukraine
                  country: UKR
                  status: Not Finished
                  outcome: pending
                  error: null
                  interaction: redirect
                  simulated: false
                  expires_at: '2026-01-01T10:10:00Z'
                  next_action:
                    type: redirect
                    url: https://wallet.example.com/authorize
                  identity: null
                  attributes: null
                  level_of_assurance: null
                  verified_at: null
                  signature_valid: null
                  credential_type: person_identification
                vendor_data: your-customer-reference
                metadata:
                  reference: example
                created_at: '2026-01-01T10:00:00Z'
          description: ''
        '400':
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest
          description: >-
            Error validasi kolom ({field: [messages]}), atau error
            return_url_invalid, return_url_not_allowed, invalid_personal_code,
            invalid_phone_number, atau idempotency_key_invalid.
        '403':
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden
          description: >-
            Kredensial tidak ada ({detail}), atau kesalahan wallet_unavailable,
            insufficient_credits, atau contract_rate_missing.
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationError'
          description: >-
            kesalahan idempotency_key_reused atau idempotency_key_in_progress
            (dengan Retry-After).
        '502':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationError'
          description: >-
            kesalahan wallet_provider_unavailable: penyedia tidak dapat memulai;
            tidak ada yang dibuat.
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationError'
          description: >-
            kesalahan wallet_not_configured: lingkungan ini tidak dapat
            menjangkau dompet.
      security:
        - ApiKeyAuth: []
        - BearerAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |-
            curl --request POST \
              --url https://verification.didit.me/v3/id-verification/wallets/diia/ \
              --header 'x-api-key: YOUR_API_KEY' \
              --header 'Idempotency-Key: your-unique-attempt-key' \
              --header 'Content-Type: application/json' \
              --data '{
              "country": "UKR",
              "vendor_data": "your-customer-reference",
              "metadata": {
                "reference": "example"
              },
              "return_url": "https://app.example.com/identity/complete"
            }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.id_wallets.start_diia(
                vendor_data="your-customer-reference",
                metadata={"reference": "example"},
                country="UKR",
                return_url="https://app.example.com/identity/complete",
            )
            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.idWallets.startDiia({
              vendor_data: "your-customer-reference",
              metadata: { reference: "example" },
              country: "UKR",
              return_url: "https://app.example.com/identity/complete",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartDiia(ctx, didit.IDWalletsStartDiiaParams{\n\tBody: didit.DigitalIDWalletAPIDiiaWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPIDiiaWalletVerificationStartCountryEnum(\"UKR\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.util.Map;

            import me.didit.Didit;

            import
            me.didit.types.DigitalIdWalletApiDiiaWalletVerificationStartCountryEnum;

            import
            me.didit.types.DigitalIdWalletApiDiiaWalletVerificationStartRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.idWallets().startDiia(DigitalIdWalletApiDiiaWalletVerificationStartRequest.builder()
                    .vendorData("your-customer-reference")
                    .metadata(Map.of("reference", "example"))
                    .country(DigitalIdWalletApiDiiaWalletVerificationStartCountryEnum.of("UKR"))
                    .returnUrl("https://app.example.com/identity/complete")
                    .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->idWallets->startDiia([
                'vendor_data' => 'your-customer-reference',
                'metadata' => ['reference' => 'example'],
                'country' => 'UKR',
                'return_url' => 'https://app.example.com/identity/complete',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.id_wallets.start_diia(
              vendor_data: "your-customer-reference",
              metadata: { reference: "example" },
              country: "UKR",
              return_url: "https://app.example.com/identity/complete"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Collections.Generic;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.IdWallets.StartDiiaAsync(new
            DigitalIdWalletApiDiiaWalletVerificationStartRequest

            {
                VendorData = "your-customer-reference",
                Metadata = new Dictionary<string, object> { ["reference"] = "example" },
                Country = new DigitalIdWalletApiDiiaWalletVerificationStartCountryEnum("UKR"),
                ReturnUrl = "https://app.example.com/identity/complete",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    DigitalIdWalletApiDiiaWalletVerificationStartRequest:
      type: object
      description: Mulai verifikasi Diia (UKR).
      properties:
        vendor_data:
          type: string
          nullable: true
          description: >-
            Referensi Anda sendiri untuk verifikasi ini (mis. ID pengguna Anda).
            Dikembalikan dalam hasil dan webhook.
        metadata:
          type: object
          additionalProperties: {}
          nullable: true
          description: >-
            Objek JSON opsional yang disimpan bersama verifikasi dan
            dikembalikan dalam hasil serta webhook.
        sandbox_scenario:
          type: string
          minLength: 1
          description: >-
            Khusus aplikasi sandbox: hasil simulasi - 'wallet_cancelled',
            'wallet_timeout', atau 'wallet_provider_error'; skenario lain (atau
            tanpa skenario) akan lolos verifikasi. Ditolak pada aplikasi di
            lingkungan produksi. Katalog lengkap tersedia di GET
            /v1/sandbox/scenarios/.
        country:
          allOf:
            - $ref: >-
                #/components/schemas/DigitalIdWalletApiDiiaWalletVerificationStartCountryEnum
          default: UKR
          description: >-
            Negara ISO 3166-1 alpha-3 dari identitas Diia. Default-nya adalah
            UKR, satu-satunya negara yang dilayaninya.


            * `UKR` - UKR
        return_url:
          type: string
          format: uri
          minLength: 1
          description: >-
            URL https tempat peramban pengguna kembali setelah dompet, dengan
            request_id dan result ditambahkan. Host-nya harus terdaftar di
            allowed_return_hosts aplikasi (atau merupakan domain White Label
            miliknya). Jangan pernah memercayai result secara mandiri: baca
            hasilnya dengan GET .../verifications/{request_id}/ atau webhook.
          maxLength: 2048
        device:
          allOf:
            - $ref: '#/components/schemas/DigitalIdWalletApiDeviceEnum'
          default: same_device
          description: >-
            same_device saat pengguna masuk di perangkat yang menampilkan
            halaman Anda, cross_device saat mereka menggunakan perangkat lain
            (misalnya kode QR BankID).


            * `same_device` - same_device

            * `cross_device` - cross_device
      required:
        - return_url
    DigitalIdWalletApiWalletVerificationResponse:
      type: object
      description: >-
        Satu verifikasi dompet mandiri, sebagaimana setiap endpoint dompet
        meresponsnya.
      properties:
        request_id:
          type: string
          format: uuid
        wallet_verification:
          $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationResult'
        vendor_data:
          type: string
          nullable: true
        metadata:
          type: object
          additionalProperties: {}
          nullable: true
          description: Objek metadata yang dikirim saat mulai, atau null.
        created_at:
          type: string
          format: date-time
      required:
        - created_at
        - metadata
        - request_id
        - vendor_data
        - wallet_verification
    DigitalIdWalletApiWalletVerificationStartBadRequest:
      oneOf:
        - $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationError'
        - $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationFieldErrors'
    DigitalIdWalletApiWalletVerificationStartForbidden:
      oneOf:
        - $ref: >-
            #/components/schemas/DigitalIdWalletApiClientCredentialsForbiddenErrorMessage
        - $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationError'
    DigitalIdWalletApiWalletVerificationError:
      type: object
      properties:
        error:
          type: string
          description: Kode stabil yang dapat dibaca mesin, mis. wallet_unavailable.
        detail:
          type: string
      required:
        - detail
        - error
    DigitalIdWalletApiDiiaWalletVerificationStartCountryEnum:
      enum:
        - UKR
      type: string
      description: '* `UKR` - UKR'
    DigitalIdWalletApiDeviceEnum:
      enum:
        - same_device
        - cross_device
      type: string
      description: |-
        * `same_device` - same_device
        * `cross_device` - cross_device
    DigitalIdWalletApiWalletVerificationResult:
      type: object
      properties:
        wallet:
          allOf:
            - $ref: '#/components/schemas/DigitalIdWalletApiWallet'
          readOnly: true
        country:
          type: string
        status:
          type: string
          description: >-
            Belum Selesai saat tertunda, kemudian Disetujui (diverifikasi) atau
            Ditolak.
        outcome:
          $ref: >-
            #/components/schemas/DigitalIdWalletApiWalletVerificationResultOutcomeEnum
        error:
          type: string
          nullable: true
          readOnly: true
        interaction:
          allOf:
            - $ref: '#/components/schemas/DigitalIdWalletApiInteractionEnum'
          readOnly: true
        simulated:
          type: boolean
          readOnly: true
        expires_at:
          type: string
          format: date-time
        next_action:
          allOf:
            - $ref: '#/components/schemas/DigitalIdWalletApiWalletNextAction'
          nullable: true
          readOnly: true
        identity:
          allOf:
            - $ref: '#/components/schemas/DigitalIdWalletApiWalletIdentity'
          nullable: true
          readOnly: true
        attributes:
          type: object
          additionalProperties: {}
          nullable: true
          readOnly: true
        level_of_assurance:
          type: string
          nullable: true
        verified_at:
          type: string
          format: date-time
          nullable: true
        signature_valid:
          type: boolean
          nullable: true
          description: >-
            True setelah tanda tangan kredensial diverifikasi; null untuk
            kredensial simulasi.
        credential_type:
          type: string
          nullable: true
      required:
        - attributes
        - country
        - credential_type
        - error
        - expires_at
        - identity
        - interaction
        - level_of_assurance
        - next_action
        - outcome
        - signature_valid
        - simulated
        - status
        - verified_at
        - wallet
    DigitalIdWalletApiWalletVerificationFieldErrors:
      type: object
      description: >-
        Kesalahan validasi permintaan: setiap kolom yang ditolak beserta
        pesannya.
      additionalProperties:
        type: array
        items:
          type: string
    DigitalIdWalletApiClientCredentialsForbiddenErrorMessage:
      type: object
      properties:
        detail:
          type: string
          default: Forbidden - User doesn't have permission
    DigitalIdWalletApiWallet:
      type: object
      properties:
        id:
          type: string
          description: ID katalog dompet, misalnya bankid_se.
        name:
          type: string
        issuing_authority:
          type: string
          nullable: true
      required:
        - id
        - issuing_authority
        - name
    DigitalIdWalletApiWalletVerificationResultOutcomeEnum:
      enum:
        - pending
        - verified
        - cancelled
        - timeout
        - failed
      type: string
      description: |-
        * `pending` - Menunggu
        * `verified` - Terverifikasi
        * `cancelled` - Dibatalkan oleh pengguna
        * `timeout` - Waktu habis
        * `failed` - Gagal
    DigitalIdWalletApiInteractionEnum:
      enum:
        - redirect
        - in_app
        - digital_credentials
      type: string
      description: |-
        * `redirect` - redirect
        * `in_app` - in_app
        * `digital_credentials` - digital_credentials
    DigitalIdWalletApiWalletNextAction:
      type: object
      properties:
        type:
          allOf:
            - $ref: '#/components/schemas/DigitalIdWalletApiWalletNextActionTypeEnum'
          description: >-
            redirect: arahkan peramban pengguna ke url. confirm_in_app:
            tampilkan verification_code kepada pengguna, yang memeriksa
            kecocokannya dengan kode di aplikasi dompet mereka dan
            mengonfirmasinya di sana; lalu lakukan polling.
            request_digital_credential: dalam interaksi pengguna pada origin
            tempat Anda memulai, minta ke dompet dengan
            digital_credentials.request, lalu kirimkan hasilnya ke POST
            .../verifications/{request_id}/response/.


            * `redirect` - redirect

            * `confirm_in_app` - confirm_in_app

            * `request_digital_credential` - request_digital_credential
        url:
          type: string
          format: uri
          description: 'khusus redirect: tempat pengguna masuk dengan dompet.'
        digital_credentials:
          allOf:
            - $ref: >-
                #/components/schemas/DigitalIdWalletApiWalletDigitalCredentialsRequest
          description: >-
            khusus request_digital_credential: permintaan yang diserahkan ke
            dompet.
        verification_code:
          type: string
          description: >-
            hanya confirm_in_app: kode perbandingan 4 digit yang juga
            ditampilkan oleh aplikasi dompet.
        poll_interval_seconds:
          type: integer
          description: >-
            hanya confirm_in_app: seberapa sering memanggil POST
            .../verifications/{request_id}/poll/ untuk umpan balik cepat. Didit
            juga melakukan polling proses masuk yang tertunda di latar belakang,
            sehingga webhook melaporkan hasilnya meskipun Anda tidak melakukan
            polling.
      required:
        - type
    DigitalIdWalletApiWalletIdentity:
      type: object
      properties:
        full_name:
          type: string
          nullable: true
        first_name:
          type: string
          nullable: true
        last_name:
          type: string
          nullable: true
        date_of_birth:
          type: string
          format: date
          nullable: true
        nationality:
          type: string
          nullable: true
          description: >-
            Kewarganegaraan ISO3, hanya jika dompet menyatakannya (tidak pernah
            disimpulkan).
        issuing_state:
          type: string
          description: Negara ISO3 yang skemanya menerbitkan identitas.
      required:
        - date_of_birth
        - first_name
        - full_name
        - issuing_state
        - last_name
        - nationality
    DigitalIdWalletApiWalletNextActionTypeEnum:
      enum:
        - redirect
        - confirm_in_app
        - request_digital_credential
      type: string
      description: |-
        * `redirect` - redirect
        * `confirm_in_app` - confirm_in_app
        * `request_digital_credential` - request_digital_credential
    DigitalIdWalletApiWalletDigitalCredentialsRequest:
      type: object
      properties:
        protocol:
          type: string
          description: openid4vp-v1-signed.
        request:
          type: object
          additionalProperties: {}
          description: >-
            Teruskan apa adanya: navigator.credentials.get({digital: request})
            di browser, atau JSON.stringify(request) sebagai requestJson milik
            GetDigitalCredentialOption di Android. Ditandatangani oleh Didit
            untuk aplikasi Anda.
      required:
        - protocol
        - request
  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.
    BearerAuth:
      type: http
      scheme: bearer
      description: Token akses client-credentials milik aplikasi.

````

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