> ## 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 Perbarui Aplikasi: Kelola Aplikasi Pelanggan

> Perbarui metadata aplikasi Didit via PATCH /organizations/me/{org_id}/applications/{app_id}/ untuk aplikasi pelanggan reseller atau brand.



Prompt Pembaruan Aplikasi
        Salin prompt ke papan klip



      
      

\<pre>

\`Partially update one Didit application's metadata (name, public URLs, redirect URIs, description). Credentials (client_id, api_key, uuid) are NEVER changed by this call.

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

Authentication:
Authorization: Bearer <access_token>
The access token must belong to an OWNER or ADMIN of the organization.

Path parameters:
\- org_id (UUID, required) — Organization that owns the application.
\- app_id (UUID, required) — Application UUID to update.

Request body — PATCH semantics. Send ONLY the fields you want to change. Omitted fields are preserved.
\- name (string, optional) — Display name.
\- website_url (string, URL, optional) — Public homepage.
\- redirect_uris (array of strings, optional) — Allowlisted OAuth-style redirect URIs. The array REPLACES the previous value entirely.
\- terms_url (string, URL, optional) — Terms-of-service link.
\- privacy_url (string, URL, optional) — Privacy policy link.
\- description (string, optional) — Internal note (not shown to end users).
\- products is read-only: a products key in the body is ignored.
\- data_location (string, optional) — The application's data location, chosen when it was created. Naming the location it already has is accepted; any other location answers 400. One exception: the live application created with your organization (at sign-up or by POST /programmatic/verify-email/) has its location chosen by the first update that names data_location, once, while none of its API keys has been used and it has no verification session. Only "eu" (European Union, Ireland) is available today.

What does NOT change:
\- uuid, client_id, api_key — credentials stay the same. Existing integrations keep working; no key rotation happens here.
\- data_location — set when the application is created (see above for the one exception).

curl example — rename and move to a new domain:
curl -X PATCH "https://apx.didit.me/auth/v2/organizations/me/<ORG_ID>/applications/<APP_ID>/" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Production App",
"website_url": "https://app.acme.example"
}'

curl example — add a second redirect URI (full replacement of the array):
curl -X PATCH "https://apx.didit.me/auth/v2/organizations/me/<ORG_ID>/applications/<APP_ID>/" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"redirect_uris": [
  "https://acme.example/callback",
  "https://staging.acme.example/callback"
]
}'

Response (200 OK):
The full application record after the change, including products (same shape as GET /organizations/me/{org_id}/applications/{app_id}/). uuid, client_id, and api_key are unchanged.

When to call:
\- Reseller customer rebrands → rename their application.
\- Domain migration → update website_url, terms_url, privacy_url.
\- Add or remove a staging redirect URI.
\- Refresh terms / privacy URLs shown in the verification flow.

Failure modes:
\- 400 — { "<field>": ["Enter a valid URL."] } for malformed website_url / redirect_uris / terms_url / privacy_url.
\- 400 — { "data_location": ["An application's data location can't be changed after it is created."] } for a location other than the application's own, and { "data_location": ["This data location is not available yet."] } for "au" or "mx". Nothing is changed.
\- 503 — { "detail": "We couldn't confirm that this application is unused. Try again in a moment.", "code": "data_location_check_unavailable" } only while choosing the first application's location. Nothing is changed; retry.
\- 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.

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

\</pre>



      
      

Tempel ke

Gunakan endpoint ini untuk memastikan setiap aplikasi selaras dengan pelanggan, merek, lingkungan, atau kasus penggunaan internal yang diwakilinya.Untuk reseller, endpoint ini memungkinkan Anda mengganti nama atau memperbarui setiap aplikasi pelanggan tanpa membagikan kredensial antar pelanggan. Untuk pelanggan langsung, endpoint ini membantu memisahkan produk, wilayah, atau lingkungan sambil tetap menyimpan semuanya di bawah satu organisasi.> [!NOTE]
>
> Endpoint ini memperbarui metadata aplikasi. `api_key` tetap sama kecuali Anda merotasi kredensial secara terpisah.## Lokasi dataLokasi data aplikasi (`data_location`) dipilih saat aplikasi dibuat dan tidak dapat diubah setelahnya: pembaruan yang menyebutkan lokasi yang sudah dimiliki aplikasi akan diterima, sedangkan lokasi lain akan menghasilkan respons 400.Satu-satunya pengecualian adalah aplikasi produksi yang dibuat bersama organisasi Anda, saat pendaftaran atau melalui [Verifikasi Email](https://docs.didit.me/id/auth-api/verify-email.md).
Pembaruan pertama yang menyebutkan `data_location` akan menetapkan lokasinya, sekali saja, selama tidak ada kunci API aplikasi yang pernah digunakan dan aplikasi belum memiliki sesi verifikasi.
Langkah **Beri nama aplikasi pertama Anda** di konsol menggunakan mekanisme ini untuk menyimpan lokasi yang Anda pilih di sana.
Saat ini, satu-satunya lokasi yang tersedia adalah `eu`, Uni Eropa (Irlandia).


## OpenAPI

````yaml id/openapi-auth.json PATCH /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}/:
    patch:
      tags:
        - Account Management
      summary: Perbarui Aplikasi
      description: >-
        Perbarui metadata aplikasi (nama, URL, URI pengalihan). `api_key` dan
        `client_id` tidak pernah dirotasi. `products` bersifat hanya-baca: kunci
        `products` dalam body diabaikan. `data_location` tidak dapat diubah
        setelah aplikasi dibuat, kecuali satu kali pada aplikasi lingkungan
        produksi yang dibuat bersama organisasi Anda, selama belum digunakan
        (lihat body permintaan). Memerlukan JWT pemilik/admin.
      operationId: update_organization_application
      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 akan diperbarui.
          schema:
            type: string
            format: uuid
            example: b2c3d4e5-6789-01bc-defg-222222222222
      requestBody:
        required: true
        description: >-
          Kirim hanya kolom yang ingin Anda ubah. Semantik PATCH: kolom yang
          tidak disertakan akan dipertahankan.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApplicationUpdateRequest'
            examples:
              RenameCustomerApplication:
                summary: Ubah nama dan pindahkan ke domain baru
                value:
                  name: Acme Production App
                  website_url: https://app.acme.example
              UpdateRedirectUris:
                summary: Tambahkan URI pengalihan kedua
                value:
                  redirect_uris:
                    - https://acme.example/callback
                    - https://staging.acme.example/callback
              UpdatePolicies:
                summary: Perbarui URL syarat dan ketentuan serta URL privasi
                value:
                  terms_url: https://acme.example/v2/terms
                  privacy_url: https://acme.example/v2/privacy
      responses:
        '200':
          description: >-
            Aplikasi diperbarui. Responsnya adalah catatan aplikasi lengkap
            setelah perubahan, termasuk `products`; `uuid`, `client_id`, dan
            `api_key` tidak berubah.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Application'
              examples:
                Success:
                  value:
                    uuid: b2c3d4e5-6789-01bc-defg-222222222222
                    name: Acme Production App
                    client_id: S9LIYGSoWNuGMLHsvEt9dQ
                    api_key: sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                    website_url: https://app.acme.example
                    redirect_uris:
                      - https://acme.example/callback
                    terms_url: https://acme.example/terms
                    privacy_url: https://acme.example/privacy
                    description: null
                    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: {}
        '400':
          description: >-
            Kesalahan validasi pada body permintaan: misalnya URL salah format,
            `data_location` yang belum tersedia, atau `data_location` selain
            milik aplikasi itu sendiri. Tidak ada yang diubah.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
              examples:
                InvalidUrl:
                  value:
                    website_url:
                      - Enter a valid URL.
                DataLocationFixed:
                  summary: Lokasi data selain milik aplikasi itu sendiri
                  value:
                    data_location:
                      - >-
                        An application's data location can't be changed after it
                        is created.
                DataLocationNotAvailable:
                  summary: Lokasi data yang akan segera hadir
                  value:
                    data_location:
                      - This data location is not available yet.
        '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 memperbarui 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.
        '503':
          description: >-
            Hanya ketika pembaruan memilih lokasi data lain untuk aplikasi live
            yang dibuat bersama organisasi Anda: Didit tidak dapat mengonfirmasi
            bahwa aplikasi tersebut belum memiliki sesi verifikasi, sehingga
            tidak ada yang diubah. Coba lagi permintaan tersebut.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceUnavailableError'
              examples:
                DataLocationCheckUnavailable:
                  value:
                    detail: >-
                      We couldn't confirm that this application is unused. Try
                      again in a moment.
                    code: data_location_check_unavailable
      security:
        - BearerAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: >-
            curl -X PATCH
            "https://apx.didit.me/auth/v2/organizations/me/$ORG_ID/applications/$APP_ID/"
            \
              -H "Authorization: Bearer $ACCESS_TOKEN" \
              -H "Content-Type: application/json" \
              -d '{
                "name": "Acme Production App",
                "website_url": "https://app.acme.example"
              }'
        - 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.update(
                "a1b2c3d4-5678-90ab-cdef-111111111111",
                "b2c3d4e5-6789-01bc-defg-222222222222",
                name="Acme Production App",
                website_url="https://app.acme.example",
            )
            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.update(
              "a1b2c3d4-5678-90ab-cdef-111111111111",
              "b2c3d4e5-6789-01bc-defg-222222222222",
              {
                name: "Acme Production App",
                website_url: "https://app.acme.example",
              },
            );
            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.Update(ctx, \"a1b2c3d4-5678-90ab-cdef-111111111111\", \"b2c3d4e5-6789-01bc-defg-222222222222\", didit.ApplicationUpdateRequest{\n\tName:       didit.String(\"Acme Production App\"),\n\tWebsiteURL: didit.String(\"https://app.acme.example\"),\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.ApplicationUpdateRequest;


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

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


            var result =
            client.account().applications().update("a1b2c3d4-5678-90ab-cdef-111111111111",
            "b2c3d4e5-6789-01bc-defg-222222222222",
            ApplicationUpdateRequest.builder()
                    .name("Acme Production App")
                    .websiteUrl("https://app.acme.example")
                    .build());
            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->update('a1b2c3d4-5678-90ab-cdef-111111111111',
            'b2c3d4e5-6789-01bc-defg-222222222222', [
                'name' => 'Acme Production App',
                'website_url' => 'https://app.acme.example',
            ]);

            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.update(
              "a1b2c3d4-5678-90ab-cdef-111111111111",
              "b2c3d4e5-6789-01bc-defg-222222222222",
              name: "Acme Production App",
              website_url: "https://app.acme.example"
            )
            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.UpdateAsync("a1b2c3d4-5678-90ab-cdef-111111111111",
            "b2c3d4e5-6789-01bc-defg-222222222222", new ApplicationUpdateRequest

            {
                Name = "Acme Production App",
                WebsiteUrl = "https://app.acme.example",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    ApplicationUpdateRequest:
      type: object
      description: >-
        Isi (body) PATCH untuk metadata aplikasi. Kirim hanya kolom yang ingin
        Anda ubah; kolom yang diabaikan tetap dipertahankan. `uuid`,
        `client_id`, dan `api_key` tidak dapat diperbarui. `products` bersifat
        hanya-baca: kunci `products` dalam body akan diabaikan. `data_location`
        tidak dapat diubah setelah aplikasi dibuat: menyebutkan lokasi yang
        sudah dimilikinya akan diterima, dan lokasi lain mana pun akan
        menghasilkan respons 400. Satu pengecualian adalah aplikasi produksi
        yang dibuat bersama organisasi Anda: pembaruan pertama yang menyebutkan
        `data_location` akan memilihnya, sekali saja, selama belum ada kunci API
        dari aplikasi yang digunakan dan aplikasi tersebut tidak memiliki sesi
        verifikasi.
      properties:
        name:
          type: string
          description: Nama tampilan aplikasi.
          example: Acme Production App
        website_url:
          type: string
          description: URL situs web atau aplikasi yang terkait dengan aplikasi ini.
          example: https://app.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
          description: URL ketentuan layanan yang ditampilkan dalam alur verifikasi.
        privacy_url:
          type: string
          description: URL kebijakan privasi yang ditampilkan dalam alur verifikasi.
        description:
          type: string
          description: Deskripsi internal untuk aplikasi.
        data_location:
          $ref: '#/components/schemas/ApplicationDataLocation'
    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: {}
    ValidationError:
      description: >-
        Isi kesalahan validasi. Envelope yang diharapkan adalah pemetaan
        `{field: ["message", ...]}` untuk kesalahan tingkat kolom atau envelope
        kunci tunggal `{detail: "..."}` untuk kesalahan aturan bisnis. Sejumlah
        kecil validator (kekuatan kata sandi saat mendaftar, validitas kode pada
        verifikasi email) saat ini merespons dengan array polos `["message"]` --
        inkonsistensi sisi server yang sudah diketahui. Skema di bawah ini
        mempertahankan cabang array polos tersebut sehingga kode klien yang
        dihasilkan dari spesifikasi ini mendeserialisasi respons saat ini, namun
        kode klien baru harus memperlakukannya sebagai bentuk dengan kunci kolom
        yang relevan (`{password: [...]}` atau `{code: [...]}`) dan kontrak
        server akan disesuaikan ke bentuk tersebut.
      oneOf:
        - type: object
          additionalProperties:
            type: array
            items:
              type: string
          example:
            email:
              - Enter a valid email address.
        - type: object
          properties:
            detail:
              type: string
          example:
            detail: An account with this email already exists.
        - type: array
          items:
            type: string
          example:
            - Invalid or expired verification code.
    AuthError:
      type: object
      description: Struktur respons error autentikasi / otorisasi / tidak ditemukan.
      properties:
        detail:
          type: string
          example: Invalid access token
    ServiceUnavailableError:
      type: object
      description: >-
        Permintaan tidak dapat diselesaikan saat ini dan tidak ada yang diubah.
        Coba lagi beberapa saat lagi.
      properties:
        detail:
          type: string
          example: >-
            We couldn't confirm that this application is unused. Try again in a
            moment.
        code:
          type: string
          example: data_location_check_unavailable
    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.