> ## 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 Credentials Didit: Ambil client_id & api_key

> GET client_id dan api_key aplikasi Didit Anda. Gunakan api_key sebagai header x-api-key untuk semua panggilan API verifikasi. Harga pay-per-use, tanpa kontrak.



Prompt untuk Mendapatkan Kredensial Aplikasi
        Salin prompt ke papan klip



      
      

\<pre>

\`Read one application's full record — including its client_id and api_key (client_secret). Use this to RECOVER an api_key you've misplaced.

Endpoint:
GET https://apx.didit.me/auth/v2/organizations/me/{org_id}/applications/{app_id}/

Authentication:
Authorization: Bearer <access_token>
Get a token via POST /programmatic/login/.

Path parameters:
\- org_id (UUID, required) — Organization that owns the application. Get via GET /organizations/me/.
\- app_id (UUID, required) — Application UUID. Returned by POST /programmatic/verify-email/ (in the application.uuid field), by POST /organizations/me/{org_id}/applications/, or visible in the Didit console.

curl example:
curl "https://apx.didit.me/auth/v2/organizations/me/<ORG_ID>/applications/<APP_ID>/" \
-H "Authorization: Bearer <ACCESS_TOKEN>"

Response (200 OK):
\{
"uuid": "b2c3d4e5-6789-...",
"name": "My App",
"client_id": "S9LIYGSoWNuGMLHsvEt9dQ",
"api_key": "sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"website_url": "https://example.com",
"redirect_uris": ["https://example.com/callback"],
"terms_url": "https://example.com/terms",
"privacy_url": "https://example.com/privacy",
"description": "Production application",
"created_at": "2025-06-01T10:00:00Z",
"data_location": "eu",
"products": [
\{ "product": "identity", "status": "enabled", "modules": { "user_verification": true, "business_verification": true, "case_management": true } },
\{ "product": "transactions", "status": "disabled", "modules": { "travel_rule": true, "case_management": true } },
\{ "product": "authentication", "status": "disabled", "modules": {} }
]
}

How to use the response:
\- api_key → set as the x-api-key header on EVERY call to https://verification.didit.me/v3/... (sessions, workflows, questionnaires, AML monitoring, billing, etc.).
\- client_id → shown alongside api_key for OAuth-style introspection scenarios. Routine verification calls only need api_key.
\- data_location → where the application's verification data is stored and processed: "eu" (European Union, Ireland). Chosen when the application is created; "au" (Australia, Sydney) and "mx" (Mexico) are coming soon.
\- products → read-only. Always all three products in this order: identity, transactions, authentication. Each has a status (enabled, early_access or disabled) and its module switches (true or false). identity modules: user_verification, business_verification, case_management. transactions modules: travel_rule, case_management. authentication has none ({}).

Failure modes:
\- 401: { "detail": "Invalid access token" } or { "detail": "Expired access token" } when the token is malformed or expired.
\- 403: { "detail": "Only organization owners and admins can manage applications." } when you are a member of the organization but not an owner or admin.
\- 403: { "detail": "Your access to this organization is suspended." } when your membership in the organization is suspended.
\- 403: { "detail": "You do not have permission to perform this action." } when the request has no Authorization header.
\- 404: { "detail": "Organization not found." } when the organization does not exist or you are not a member of it, or { "detail": "Application not found." } when the application is not in that organization.

When to call:
\- After programmatic login from a new machine — you have an access_token but not the api_key, and you need x-api-key to start calling verification.didit.me.
\- Auditing your applications — list all apps with GET /organizations/me/{org_id}/applications/, then read each.

Note:
This endpoint does not rotate the credential. It returns the application's current api_key on every GET, so there is no "show api_key once" model.

For end-to-end Didit integration, paste in the full prompt at /integration/integration-prompt.`

\</pre>



      
      

Tempel ke



## OpenAPI

````yaml id/openapi-auth.json GET /organizations/me/{org_id}/applications/{app_id}/
openapi: 3.0.0
info:
  version: 1.0.0
  title: Didit Auth API
  description: >-
    API pendaftaran dan autentikasi terprogram untuk pengembang dan agen AI.
    Daftar dalam 2 panggilan API -- tanpa perlu browser. Platform verifikasi
    identitas yang paling ramah agen.


    ## URL Dasar


    Semua endpoint dalam spesifikasi ini di-hosting di
    `https://apx.didit.me/auth/v2`. Ini adalah host yang berbeda dari API
    verifikasi (`https://verification.didit.me/v3`). Perhatikan perbedaannya:
    host autentikasi ini menerbitkan **token akses JWT** Anda dan memungkinkan
    Anda mencantumkan serta mengelola **organisasi** dan **aplikasi** Anda. Host
    verifikasi adalah tempat Anda memanggil sesi, alur kerja, AML, dll., yang
    diautentikasi dengan **`api_key`** yang dikembalikan oleh API ini.


    ## Cara kerja alur autentikasi


    1. `POST /programmatic/register/` — kirimkan email + kata sandi.

    2. Terima kode alfanumerik 6 karakter melalui email.

    3. `POST /programmatic/verify-email/` — kirimkan kode tersebut. Anda akan
    mendapatkan kembali JWT `access_token`, `refresh_token`, sebuah organisasi,
    dan aplikasi default dengan `client_id` + `api_key`.

    4. Simpan `api_key`. Gunakan sebagai `x-api-key` untuk setiap panggilan ke
    `https://verification.didit.me/v3/...`.

    5. Dari mesin mana pun di masa mendatang, `POST /programmatic/login/`
    menukarkan email + kata sandi Anda dengan JWT baru, lalu panggil `GET
    /organizations/me/` dan endpoint aplikasi untuk memulihkan atau merotasi
    kredensial.


    JWT hanya diperlukan untuk endpoint **Manajemen Akun** dalam spesifikasi
    ini; lalu lintas API verifikasi menggunakan `api_key` yang berjangka
    panjang, bukan JWT.


    ## Konvensi


    - Semua body permintaan dan respons berupa JSON (`Content-Type:
    application/json`).

    - **Gunakan alamat email asli yang dapat menerima pesan saat menguji `POST
    /programmatic/register/`.** Endpoint ini mengirimkan kode verifikasi secara
    sinkron, sehingga alamat pada domain pengujian yang dicadangkan
    (`@example.com`, `@example.org`, `@*.test`, `@*.example`, `@*.invalid`)
    ditolak oleh pengiriman email dan permintaan mengembalikan `500`. Ganti
    placeholder `you@yourdomain.com` dalam contoh dengan kotak masuk yang
    benar-benar dapat Anda baca.

    - Error validasi mengembalikan HTTP `400` dengan salah satu dari dua format:
    `{"field": ["message", ...]}` untuk masalah tingkat kolom, atau `{"detail":
    "message"}` untuk error aturan bisnis. Sejumlah kecil validator (kekuatan
    kata sandi saat mendaftar, kedaluwarsa kode saat verifikasi email) saat ini
    merespons dengan array sederhana `["message"]` alih-alih bentuk dengan kunci
    kolom -- ini adalah inkonsistensi sisi server yang diketahui, sehingga kode
    klien harus menerima kedua bentuk tersebut.

    - Error autentikasi kembali sebagai `{"detail": "..."}` dengan HTTP `401`
    (bearer token tidak valid) atau `403` (bearer token tidak ada / hak istimewa
    tidak memadai).

    - Respons batas laju menyertakan kolom `wait` dengan durasi cooldown dalam
    detik.
servers:
  - url: https://apx.didit.me/auth/v2
    description: Server autentikasi produksi
security: []
tags:
  - name: Programmatic Auth
    description: >-
      Siklus hidup akun dengan email dan kata sandi: daftar, verifikasi, masuk.
      Mengembalikan `access_token` JWT yang Anda gunakan untuk endpoint
      Manajemen Akun, ditambah (saat verifikasi) `client_id` dan `api_key`
      aplikasi pertama Anda.
  - name: Account Management
    description: >-
      Endpoint terautentikasi (JWT bearer) yang mencantumkan organisasi dan
      membuat, mengambil, atau memperbarui aplikasi. Gunakan endpoint ini untuk
      memulihkan atau merotasi `api_key` yang Anda gunakan untuk mengautentikasi
      panggilan API verifikasi.
paths:
  /organizations/me/{org_id}/applications/{app_id}/:
    get:
      tags:
        - Account Management
      summary: Dapatkan Kredensial Aplikasi
      description: >-
        Baca rekaman lengkap satu aplikasi termasuk `client_id` dan `api_key`.
        Gunakan ini untuk memulihkan `api_key` yang hilang.
      operationId: get_application_credentials
      parameters:
        - name: org_id
          in: path
          required: true
          description: UUID dari organisasi pemilik aplikasi.
          schema:
            type: string
            format: uuid
            example: a1b2c3d4-5678-90ab-cdef-111111111111
        - name: app_id
          in: path
          required: true
          description: UUID dari aplikasi yang kredensialnya ingin Anda baca.
          schema:
            type: string
            format: uuid
            example: b2c3d4e5-6789-01bc-defg-222222222222
      responses:
        '200':
          description: Catatan aplikasi termasuk `client_id` dan `api_key` miliknya.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Application'
              examples:
                Success:
                  value:
                    uuid: b2c3d4e5-6789-01bc-defg-222222222222
                    name: My App
                    client_id: S9LIYGSoWNuGMLHsvEt9dQ
                    api_key: sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                    website_url: https://example.com
                    redirect_uris:
                      - https://example.com/callback
                    terms_url: https://example.com/terms
                    privacy_url: https://example.com/privacy
                    description: Production application
                    created_at: '2025-06-01T10:00:00Z'
                    data_location: eu
                    products:
                      - product: identity
                        status: enabled
                        modules:
                          user_verification: true
                          business_verification: true
                          case_management: true
                      - product: transactions
                        status: disabled
                        modules:
                          travel_rule: true
                          case_management: true
                      - product: authentication
                        status: disabled
                        modules: {}
        '401':
          description: >-
            Token akses salah format, tidak valid, atau kedaluwarsa. Dapatkan
            token baru dengan `POST /programmatic/login/`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                InvalidToken:
                  value:
                    detail: Invalid access token
                ExpiredToken:
                  value:
                    detail: Expired access token
        '403':
          description: >-
            Anda tidak dapat membaca aplikasi ini. Anggota organisasi yang bukan
            pemilik atau admin mendapatkan `Only organization owners and admins
            can manage applications.` Pemilik atau admin yang aksesnya ke
            organisasi ditangguhkan mendapatkan `Your access to this
            organization is suspended.` Permintaan tanpa header `Authorization`
            mendapatkan `You do not have permission to perform this action.`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                NotOwnerOrAdmin:
                  summary: Anggota yang bukan pemilik atau admin
                  value:
                    detail: >-
                      Only organization owners and admins can manage
                      applications.
                Suspended:
                  summary: Keanggotaan ditangguhkan
                  value:
                    detail: Your access to this organization is suspended.
                MissingToken:
                  summary: Tidak ada header Authorization
                  value:
                    detail: You do not have permission to perform this action.
        '404':
          description: >-
            Organisasi tidak ada atau Anda bukan anggotanya, atau aplikasi tidak
            ada di dalam organisasi tersebut.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                OrganizationNotFound:
                  summary: Organisasi tidak ditemukan, atau Anda bukan anggota
                  value:
                    detail: Organization not found.
                ApplicationNotFound:
                  summary: Tidak ada aplikasi seperti itu di organisasi ini
                  value:
                    detail: Application not found.
      security:
        - BearerAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: >-
            curl
            "https://apx.didit.me/auth/v2/organizations/me/$ORG_ID/applications/$APP_ID/"
            \
              -H "Authorization: Bearer $ACCESS_TOKEN"
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Use the access token that account.login returns.
            client = Didit(account_token="YOUR_ACCESS_TOKEN")

            result = client.account.applications.retrieve(
                "a1b2c3d4-5678-90ab-cdef-111111111111",
                "b2c3d4e5-6789-01bc-defg-222222222222",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // Use the access token that account.login returns.
            const didit = new Didit({ accountToken: "YOUR_ACCESS_TOKEN" });

            const result = await didit.account.applications.retrieve(
              "a1b2c3d4-5678-90ab-cdef-111111111111",
              "b2c3d4e5-6789-01bc-defg-222222222222",
            );
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Use the access token that account.login returns.\nclient := didit.NewClient(option.WithAccountToken(\"YOUR_ACCESS_TOKEN\"))\n\nresult, err := client.Account.Applications.Retrieve(ctx, \"a1b2c3d4-5678-90ab-cdef-111111111111\", \"b2c3d4e5-6789-01bc-defg-222222222222\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;


            // Use the access token that account.login returns.

            Didit client =
            Didit.builder().accountToken("YOUR_ACCESS_TOKEN").build();


            var result =
            client.account().applications().retrieve("a1b2c3d4-5678-90ab-cdef-111111111111",
            "b2c3d4e5-6789-01bc-defg-222222222222");

            System.out.println(result);
        - lang: php
          label: PHP
          source: >-
            <?php


            require 'vendor/autoload.php';


            use Didit\DiditClient;


            // Use the access token that account.login returns.

            $didit = new DiditClient(accountToken: 'YOUR_ACCESS_TOKEN');


            $result =
            $didit->account->applications->retrieve('a1b2c3d4-5678-90ab-cdef-111111111111',
            'b2c3d4e5-6789-01bc-defg-222222222222');

            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Use the access token that account.login returns.
            didit = Didit::Client.new(account_token: "YOUR_ACCESS_TOKEN")

            result = didit.account.applications.retrieve(
              "a1b2c3d4-5678-90ab-cdef-111111111111",
              "b2c3d4e5-6789-01bc-defg-222222222222"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Use the access token that account.login returns.

            using var client = new DiditClient(new DiditClientOptions {
            AccountToken = "YOUR_ACCESS_TOKEN" });


            var result = await
            client.Account.Applications.RetrieveAsync("a1b2c3d4-5678-90ab-cdef-111111111111",
            "b2c3d4e5-6789-01bc-defg-222222222222");

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    Application:
      type: object
      description: >-
        Catatan aplikasi lengkap. Nilai `uuid`, `client_id`, dan `api_key` tidak
        pernah berubah setelah pembuatan. Begitu pula dengan `data_location`,
        kecuali satu kali pada aplikasi produksi yang dibuat bersama organisasi
        Anda, sebelum digunakan (lihat permintaan pembaruan).
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            UUID aplikasi. Gunakan sebagai `{app_id}` dalam panggilan
            berikutnya.
          example: b2c3d4e5-6789-01bc-defg-222222222222
        name:
          type: string
          description: Nama tampilan aplikasi yang ditampilkan di konsol Didit.
          example: Acme Production App
        client_id:
          type: string
          description: >-
            Pengenal klien publik, aman untuk disematkan dalam alur bergaya
            OAuth.
          example: S9LIYGSoWNuGMLHsvEt9dQ
        api_key:
          type: string
          description: >-
            Rahasia jangka panjang (juga disebut `client_secret`). Gunakan
            sebagai header `x-api-key` untuk setiap panggilan ke
            `https://verification.didit.me/v3/...` (sesi, alur kerja, AML,
            dll.). Perlakukan sebagai kredensial; jangan pernah mengeksposnya di
            sisi klien. Kunci baru diawali dengan `sk_live_` (aplikasi produksi)
            atau `sk_test_` (aplikasi sandbox), diikuti oleh 43 karakter
            aman-URL (huruf, angka, `-`, dan `_`). Kunci yang dibuat sebelum
            format ini tidak memiliki awalan dan tetap berfungsi tanpa
            perubahan. Selama 72 jam setelah Anda memulihkan akun, operasi
            daftar, ambil, dan perbarui mengembalikan string kosong di sini
            alih-alih kunci.
          example: sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        website_url:
          type: string
          nullable: true
          description: URL situs web atau aplikasi yang terkait dengan aplikasi ini.
          example: https://acme.example
        redirect_uris:
          type: array
          items:
            type: string
          description: >-
            URI pengalihan yang diizinkan untuk alur pengalihan gaya OAuth dan
            verifikasi.
          example:
            - https://acme.example/callback
        terms_url:
          type: string
          nullable: true
          description: URL ketentuan layanan yang ditampilkan dalam alur verifikasi.
          example: https://acme.example/terms
        privacy_url:
          type: string
          nullable: true
          description: URL kebijakan privasi yang ditampilkan dalam alur verifikasi.
          example: https://acme.example/privacy
        description:
          type: string
          nullable: true
          description: >-
            Deskripsi internal untuk aplikasi (tidak ditampilkan kepada pengguna
            akhir).
        created_at:
          type: string
          format: date-time
          example: '2025-06-01T10:00:00Z'
        data_location:
          $ref: '#/components/schemas/ApplicationDataLocation'
        products:
          type: array
          readOnly: true
          description: >-
            Produk aplikasi. Selalu ketiganya, dalam urutan ini: `identity`,
            `transactions`, `authentication`. Aplikasi baru memiliki `identity`
            yang diaktifkan dengan semua modul aktif, serta `transactions` dan
            `authentication` dinonaktifkan. Hanya baca: kunci `products` dalam
            body pembuatan atau pembaruan akan diabaikan.
          items:
            $ref: '#/components/schemas/ApplicationProduct'
          example:
            - product: identity
              status: enabled
              modules:
                user_verification: true
                business_verification: true
                case_management: true
            - product: transactions
              status: disabled
              modules:
                travel_rule: true
                case_management: true
            - product: authentication
              status: disabled
              modules: {}
    AuthError:
      type: object
      description: Struktur respons error autentikasi / otorisasi / tidak ditemukan.
      properties:
        detail:
          type: string
          example: Invalid access token
    ApplicationDataLocation:
      type: string
      enum:
        - eu
        - au
        - mx
      description: >-
        Tempat data verifikasi aplikasi disimpan dan diproses, dipilih saat
        aplikasi dibuat. `eu` adalah Uni Eropa (Irlandia), sebagai default. `au`
        (Australia, Sydney) dan `mx` (Meksiko) akan segera hadir: permintaan
        yang mencantumkannya akan menghasilkan respons 400 `This data location
        is not available yet.` Aplikasi Sandbox suatu organisasi selalu berada
        di Uni Eropa.
      example: eu
    ApplicationProduct:
      type: object
      description: >-
        Satu produk dari suatu aplikasi beserta statusnya. Hanya-baca: endpoint
        aplikasi mengembalikannya dan mengabaikannya dalam body permintaan.
      properties:
        product:
          type: string
          enum:
            - identity
            - transactions
            - authentication
          description: >-
            `identity` (Verifikasi identitas), `transactions` (Pemantauan
            transaksi) atau `authentication` (Autentikasi).
          example: identity
        status:
          type: string
          enum:
            - enabled
            - early_access
            - disabled
          description: >-
            Apakah produk aktif untuk aplikasi ini. `early_access` hanya berlaku
            untuk `authentication`, yang diaktifkan Didit untuk Anda.
          example: enabled
        modules:
          type: object
          additionalProperties:
            type: boolean
          description: >-
            Sakelar modul produk, masing-masing bernilai `true` atau `false`.
            `identity` memiliki `user_verification`, `business_verification`,
            dan `case_management`. `transactions` memiliki `travel_rule` dan
            `case_management`. `authentication` tidak memilikinya (`{}`).
            `case_management` adalah satu pengaturan yang ditampilkan di bawah
            `identity` dan `transactions`, sehingga memiliki nilai yang sama
            pada keduanya.
          example:
            user_verification: true
            business_verification: true
            case_management: true
      required:
        - product
        - status
        - modules
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        `access_token` JWT bertanda tangan RS256 yang dikembalikan oleh `POST
        /programmatic/login/` atau `POST /programmatic/verify-email/`. Kirim
        sebagai `Authorization: Bearer <access_token>`. Masa berlaku default
        adalah 86400 detik (24 jam). Token ini hanya valid untuk endpoint
        Manajemen Akun di `apx.didit.me/auth/v2`. Sebagai gantinya, API
        verifikasi (`verification.didit.me/v3`) menggunakan `api_key` berjangka
        panjang sebagai `x-api-key`.

````

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