> ## 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 Registrasi Transfer Masuk Sunrise: Travel Rule

> Daftarkan data Travel Rule untuk deposit kripto yang sudah diselesaikan on-chain sebelum pertukaran terjadi, melalui alur sunrise setelah deposit.



Prompt API untuk Mendaftarkan Transfer Sunrise Masuk
        Salin prompt ke papan klip



      
      

\<pre>

\`Register Travel Rule data for a crypto deposit that settled on-chain BEFORE any exchange took place - because the sending VASP was unreachable at the time (the sunrise problem), or when backfilling historical deposits.

Endpoint:
POST https://verification.didit.me/v3/travel-rule/inbound/

Authentication:
Use the x-api-key header with my Didit API key. You are the beneficiary VASP.

Request body (application/json):
\{
"chain": "ETH",                        // required; stored lowercased and matched case-insensitively against your address-book entries' chain
"txid": "0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060",   // dedupe key: same txid + wallet_address returns the existing transfer
"wallet_address": "0x8ba1f109551bD432803012645Ac136ddd64DBA72",   // an XRP X-address is split into its classic address and tag
"memo": "",                              // optional destination tag or memo: on a shared deposit address it names your customer
"amount": "500.00",
"currency": "USDC",
"originator_data": { "name": "Origin CASP SL" },      // flat originator details from the sender, if known (name or full_name, first_name, last_name, vendor_data)
"beneficiary_data": { "name": "Ana Diaz" },           // flat beneficiary details (your customer); name is matched against the entry's holder_name
"originating_vasp": { "name": "Origin CASP SL", "lei": "984500ABCDEF12345634", "travel_address": "taHg7hkTmJ4mTpdQxn61H9cyx6RreB2jrDHeB3pkioRRBgKQaSAGUzp73FVsmEXXJVxdAuCCWiBEFMkcB4MCtcyjnpbyEbTeSHwym394NMS7ev" },  // optional sender identity
"utxo": { "inputs": [ { "address": "bc1q...", "amount": "0.5" } ], "outputs": [ { "address": "bc1q...", "amount": "0.25" } ] }  // optional, BTC/LTC/BCH/DOGE only
}

Behavior:
\- Creates an inbound travelRule transaction (or reuses an unclaimed recorded deposit) and resolves it against your wallet address book, by the address and its memo (an entry with exactly that memo first, else one for the whole address; a deposit without a memo never reaches an entry that has one):
\- no matching entry -> ON_HOLD
\- entry exists, ownership unproven -> UNCONFIRMED_OWNERSHIP
\- name does not match the entry's holder_name -> COUNTERPARTY_MISMATCHED_DATA
\- verified entry + name match -> COMPLETED then immediately FINISHED (the deposit already settled).
\- The address-book match is chain-scoped: an entry matches when its chain equals the request chain (case-insensitive) or the entry's chain is blank, and "ethereum" does not match "ETH".
\- Resolve ON_HOLD (and UNCONFIRMED_OWNERSHIP) with POST /v3/transactions/{transaction_id}/travel-rule/ownership/.
\{"confirmed": true} registers or verifies the wallet entry and runs the name match; {"confirmed": false} declines the transfer.
ON_HOLD does not change the transaction status by itself; only a rule that acts on the Travel Rule status changes it (for example the opt-in library preset travel-rule-pending-action sets AWAITING_USER).
\- Naming originating_vasp keeps the sender's identity on this transfer (metadata.originating_vasp, and the transfer's originator VASP in GET /v3/travel-rule/transfers/); it never creates or changes a shared VASP directory entry.
originating_vasp.lei must be a valid 20-character LEI (ISO 17442) or blank, and originating_vasp.travel_address must be a valid travel address or blank.
An inbound TRP inquiry does not create or change its sender's directory entry either.
\- Webhooks: when a new transaction was created, transaction.created is sent first and travel_rule.status.updated follows for each status transition.
Each webhook is delivered and retried on its own, so do not rely on arrival order; key on transaction_id.
\- Billing: there is no base fee.
A newly created deposit is screened and charged the Wallet Verification & Screening rate only when crypto monitoring is enabled and chain is one Didit can screen (btc, eth, sol, trx, matic, bnb, ltc, xrp, bch, doge, or their full names such as bitcoin or ethereum).
Sandbox applications are never charged.
\- utxo: the sender's wallet is originator_data.wallet_address when you declare it, else the input address that contributed the most. The result is on travel_rule.chain_details.

What to read from the response:
\- transaction_id - the Didit transaction uuid, used in /v3/transactions/{transaction_id}/ calls.
\- txn_id - tr-in-{first 80 characters of txid}-{12 hex characters} for a new transaction, or the existing txn_id of a reused recorded deposit.
\- created - true (201) when this call registered the deposit, false (200) when the same txid + wallet_address was already registered.
\- travel_rule - the full transfer object: uuid, status, direction, rail, protocol, ivms_version, required, ownership_confirmed, deadline_at, timeline, counterparty_vasp, originator_data, beneficiary_data, delivery, discovery, reason, next_actions, created_at.
beneficiary_data includes the wallet_address and the lowercased chain.
originator_data and beneficiary_data stay masked in the response (data_masked: true) until wallet ownership is confirmed.
\- travel_rule.status - the resolved state (see above).

Failure modes:
\- 400 - a missing required field (chain, txid, wallet_address, amount, currency), an invalid originating_vasp.lei, or an invalid travel address ("Invalid travel address.").
\- 403 - missing x-api-key (a wrong, revoked or expired key gets 401).

Full guide: /transaction-monitoring/travel-rule#after-deposit-sunrise-registration.`

\</pre>



      
      

Tempel ke



## OpenAPI

````yaml id/openapi-25.json POST /v3/travel-rule/inbound/
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/travel-rule/inbound/:
    post:
      tags:
        - Travel Rule
      summary: Daftarkan transfer masuk pasca-deposit (sunrise)
      description: >-
        Daftarkan data Travel Rule untuk deposit kripto yang telah diselesaikan
        on-chain sebelum pertukaran apa pun berlangsung. Membuat transaksi
        travelRule masuk (atau menggunakan kembali deposit yang belum diklaim)
        dan mencocokkan transfer dengan buku alamat dompet Anda. Untuk transaksi
        yang baru dibuat, Didit mengirimkan transaction.created terlebih dahulu
        dan webhook travel_rule.status.updated setelahnya.
      operationId: registerTravelRuleInbound
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleInboundRequest'
            example:
              chain: ETH
              txid: 0xdeposit-hash
              wallet_address: 0xYourDepositWallet
              amount: '500.00'
              currency: USDC
              originator_data:
                name: Origin CASP SL
              beneficiary_data:
                name: Ana Diaz
              originating_vasp:
                name: Origin CASP SL
                lei: ''
                travel_address: >-
                  ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC
      responses:
        '200':
          description: >-
            Transfer untuk txid dan wallet_address ini sudah terdaftar; transfer
            yang ada dikembalikan tanpa perubahan (created bernilai false).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleInboundResponse'
        '201':
          description: >-
            Transfer Travel Rule baru telah didaftarkan, pada transaksi masuk
            baru atau pada deposit belum diklaim yang sudah ada (created
            bernilai true).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleInboundResponse'
        '400':
          description: >-
            Kolom wajib (`chain`, `txid`, `wallet_address`, `amount`,
            `currency`) tidak ada, `originating_vasp.lei` bukan LEI yang valid,
            `originating_vasp.travel_address` bukan Travel Address yang valid,
            memo, X-address, atau `utxo` yang tidak dapat dibawa oleh chain,
            atau `originator_data` / `beneficiary_data` yang bukan merupakan
            objek.
          content:
            application/json:
              examples:
                Missing field:
                  value:
                    txid:
                      - This field is required.
                Invalid LEI:
                  value:
                    originating_vasp:
                      lei:
                        - >-
                          Invalid LEI: expected 20 alphanumeric characters (ISO
                          17442).
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v3/travel-rule/inbound/ \
              -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \
              -d '{"chain":"ETH","txid":"0xdeposit-hash","wallet_address":"0xYourDepositWallet","amount":"500.00","currency":"USDC"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.travel_rule.register_inbound(
                chain="ETH",
                txid="0xdeposit-hash",
                wallet_address="0xYourDepositWallet",
                amount="500.00",
                currency="USDC",
                originator_data={"name": "Origin CASP SL"},
                beneficiary_data={"name": "Ana Diaz"},
                originating_vasp={
                    "name": "Origin CASP SL",
                    "lei": "",
                    "travel_address": "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
                },
            )
            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.travelRule.registerInbound({
              chain: "ETH",
              txid: "0xdeposit-hash",
              wallet_address: "0xYourDepositWallet",
              amount: "500.00",
              currency: "USDC",
              originator_data: { name: "Origin CASP SL" },
              beneficiary_data: { name: "Ana Diaz" },
              originating_vasp: {
                name: "Origin CASP SL",
                lei: "",
                travel_address: "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
              },
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.RegisterInbound(ctx, didit.TravelRuleInboundRequest{\n\tChain:           \"ETH\",\n\tTxid:            \"0xdeposit-hash\",\n\tWalletAddress:   \"0xYourDepositWallet\",\n\tAmount:          \"500.00\",\n\tCurrency:        \"USDC\",\n\tOriginatorData:  didit.Some(map[string]any{\"name\": \"Origin CASP SL\"}),\n\tBeneficiaryData: didit.Some(map[string]any{\"name\": \"Ana Diaz\"}),\n\tOriginatingVASP: didit.Some(didit.TravelRuleInboundRequestOriginatingVASP{\n\t\tName:          didit.String(\"Origin CASP SL\"),\n\t\tLei:           didit.String(\"\"),\n\t\tTravelAddress: didit.String(\"ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC\"),\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.TravelRuleInboundRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.travelRule().registerInbound(TravelRuleInboundRequest.builder()
                    .chain("ETH")
                    .txid("0xdeposit-hash")
                    .walletAddress("0xYourDepositWallet")
                    .amount("500.00")
                    .currency("USDC")
                    .originatorData(Map.of("name", "Origin CASP SL"))
                    .beneficiaryData(Map.of("name", "Ana Diaz"))
                    .originatingVasp(TravelRuleInboundRequest.OriginatingVasp.builder()
                            .name("Origin CASP SL")
                            .lei("")
                            .travelAddress("ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC")
                            .build())
                    .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->travelRule->registerInbound([
                'chain' => 'ETH',
                'txid' => '0xdeposit-hash',
                'wallet_address' => '0xYourDepositWallet',
                'amount' => '500.00',
                'currency' => 'USDC',
                'originator_data' => ['name' => 'Origin CASP SL'],
                'beneficiary_data' => ['name' => 'Ana Diaz'],
                'originating_vasp' => [
                    'name' => 'Origin CASP SL',
                    'lei' => '',
                    'travel_address' => 'ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC',
                ],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.travel_rule.register_inbound(
              chain: "ETH",
              txid: "0xdeposit-hash",
              wallet_address: "0xYourDepositWallet",
              amount: "500.00",
              currency: "USDC",
              originator_data: { name: "Origin CASP SL" },
              beneficiary_data: { name: "Ana Diaz" },
              originating_vasp: {
                name: "Origin CASP SL",
                lei: "",
                travel_address: "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
              }
            )
            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.TravelRule.RegisterInboundAsync(new
            TravelRuleInboundRequest

            {
                Chain = "ETH",
                Txid = "0xdeposit-hash",
                WalletAddress = "0xYourDepositWallet",
                Amount = "500.00",
                Currency = "USDC",
                OriginatorData = new Dictionary<string, object> { ["name"] = "Origin CASP SL" },
                BeneficiaryData = new Dictionary<string, object> { ["name"] = "Ana Diaz" },
                OriginatingVasp = new TravelRuleInboundRequestOriginatingVasp
                {
                    Name = "Origin CASP SL",
                    Lei = "",
                    TravelAddress = "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
                },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleInboundRequest:
      type: object
      required:
        - chain
        - txid
        - wallet_address
        - amount
        - currency
      properties:
        chain:
          type: string
          description: >-
            Chain tempat deposit diselesaikan, misalnya `ETH`. Disimpan dalam
            huruf kecil dan dibandingkan secara tidak peka huruf besar/kecil
            dengan entri buku alamat dompet Anda, jadi gunakan token chain yang
            sama di sana.
          maxLength: 32
        txid:
          type: string
          description: >-
            Hash transaksi on-chain. Dideduplikasi bersama dengan
            wallet_address.
          maxLength: 128
        wallet_address:
          type: string
          description: >-
            Dompet tujuan tempat Anda menerima setoran. X-address XRP dipisahkan
            menjadi alamat klasik dan tag-nya.
          maxLength: 128
        amount:
          type: string
          description: >-
            Jumlah deposit sebagai string desimal, nol atau lebih besar, hingga
            18 tempat desimal.
        currency:
          type: string
          description: Aset deposit, misalnya "USDC".
          maxLength: 16
        originator_data:
          type: object
          description: >-
            Detail pengirim dari VASP pengirim, jika diketahui, sebagai objek
            datar seperti `{"name": "..."}`. Didit membaca name (atau
            full_name), first_name, last_name, dan vendor_data darinya.
          additionalProperties: true
        beneficiary_data:
          type: object
          description: >-
            Detail penerima (pelanggan Anda), sebagai objek datar seperti
            `{"name": "..."}`. Didit mencocokkan name dengan holder_name dari
            entri buku alamat yang cocok, dan menyetel wallet_address serta
            chain dari permintaan.
          additionalProperties: true
        originating_vasp:
          type: object
          description: >-
            Deskripsi opsional dari VASP pengirim. Deskripsi ini hanya berada
            pada transfer ini (`metadata.originating_vasp`, dan VASP pengirim
            transfer di GET /v3/travel-rule/transfers/); tidak pernah membuat,
            mengedit, atau menautkan entri direktori VASP bersama.
          properties:
            name:
              type: string
              maxLength: 255
            lei:
              type: string
              maxLength: 20
              description: Opsional. LEI ISO 17442 20 karakter yang valid, atau kosong.
            travel_address:
              type: string
              description: Travel Address pengirim, dicatat pada transfer ini.
              maxLength: 512
        memo:
          type: string
          maxLength: 256
          description: >-
            Opsional. Tag tujuan deposit atau memo pada jaringan memo: pada
            alamat deposit bersama, nilai ini membedakan pelanggan Anda, dan
            entri buku alamat untuk memo tersebut dicocokkan. XRP: tag tujuan,
            bilangan bulat dari 0 hingga 4294967295 (angka JSON diterima). XLM:
            memo teks hingga 28 byte, ID 64-bit, atau hash heksadesimal 32 byte.
            EOS: hingga 256 byte. ATOM: hingga 256 karakter. HBAR: hingga 100
            byte. Dompet Bitcoin, EVM, Solana, Tron, Litecoin, Bitcoin Cash,
            Dogecoin, dan Lightning tidak menerima memo: adanya memo
            menghasilkan `400`. Alias: `destinationTag` atau `destination_tag`.
        utxo:
          allOf:
            - $ref: '#/components/schemas/TravelRuleUtxo'
          description: >-
            Opsional, hanya rantai UTXO. Input dan output transaksi deposit:
            dompet pengirim adalah `originator_data.wallet_address` yang
            dideklarasikan, jika tidak, input terbesar.
    TravelRuleInboundResponse:
      type: object
      properties:
        transaction_id:
          type: string
          format: uuid
          description: UUID transaksi Didit untuk deposit masuk.
        txn_id:
          type: string
          description: >-
            txn_id transaksi masuk: dibuat oleh Didit saat Didit membuat
            transaksi, atau milik Anda sendiri saat deposit yang belum diklaim
            digunakan kembali.
        created:
          type: boolean
          description: >-
            true saat panggilan ini mendaftarkan transfer (HTTP 201); false saat
            transfer untuk txid dan wallet_address yang sama sudah ada (HTTP
            200).
        travel_rule:
          $ref: '#/components/schemas/TravelRuleTransferDetail'
    TravelRuleUtxo:
      type: object
      description: >-
        Input dan output dari transfer UTXO (BTC, LTC, BCH, DOGE). Hanya
        diterima pada blockchain tersebut: pada blockchain lain akan
        menghasilkan `400`. Dari informasi tersebut, Didit menyimpulkan dompet
        pengirim (yang dideklarasikan, jika tidak ada maka alamat input yang
        berkontribusi paling banyak) dan output penerima (yang dideklarasikan,
        jika tidak ada maka satu-satunya output yang tidak mengembalikan
        kembalian ke alamat input, jika tidak ada maka output yang membayar
        jumlah transfer). Hasilnya ada di `chain_details` transfer tersebut.
      required:
        - outputs
      properties:
        inputs:
          type: array
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
          description: >-
            Opsional. Tanpa input, tidak ada pengirim yang disimpulkan dan tidak
            ada output kembalian (change) yang dikenali.
        outputs:
          type: array
          minItems: 1
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
    TravelRuleTransferDetail:
      type: object
      description: >-
        Objek transfer lengkap yang dikembalikan oleh endpoint konfirmasi
        kepemilikan dan penyelesaian/pembatalan. Selama kepemilikan dompet
        transfer masuk belum dikonfirmasi, `originator_data` dan
        `beneficiary_data` pihak lawan akan dikembalikan dalam kondisi
        disamarkan (huruf pertama dari setiap kata dipertahankan; dompet,
        blockchain, dan perutean VASP tetap dapat dibaca) dan `data_masked`
        bernilai true.
      properties:
        uuid:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - AWAITING_COUNTERPARTY
            - ON_HOLD
            - COMPLETED
            - FINISHED
            - CANCELLED
            - EXPIRED
            - COUNTERPARTY_MISMATCHED_DATA
            - COUNTERPARTY_VASP_NOT_FOUND
            - COUNTERPARTY_VASP_NOT_REACHABLE
            - UNCONFIRMED_OWNERSHIP
            - COUNTERPARTY_VASP_GENERAL_DECLINE
            - NOT_ENOUGH_COUNTERPARTY_DATA
            - NOT_APPLICABLE
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
        rail:
          type: string
          nullable: true
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - TEST_VASP
            - null
          description: >-
            Jalur yang digunakan untuk merutekan transfer, atau null ketika
            tidak ada jalur yang dipilih (misalnya di bawah ambang batas, dompet
            pihak lawan swakelola, registrasi setelah deposit, atau tidak ada
            pihak lawan yang dapat dijangkau). INTERNAL berarti kedua belah
            pihak adalah aplikasi Didit; EMAIL berarti pihak lawan dijangkau
            melalui tautan pengambilan yang dikirim lewat email. TEST_VASP
            berarti Test VASP Didit merespons transfer sandbox. Melalui GTR,
            VERIFYVASP, dan SYGNA, Didit membaca jawaban pihak lawan dari
            respons jaringan atau dengan melakukan polling setiap 5 menit. TRUST
            hanya mengirim, sehingga transfer TRUST tetap berstatus
            AWAITING_COUNTERPARTY hingga kedaluwarsa. Jalur jaringan hanya
            digunakan ketika Anda telah menghubungkan keanggotaan Anda sendiri
            untuk jaringan tersebut. Jalur dipilih setelah pembuatan transaksi
            menghasilkan respons, sehingga nilainya null dalam respons tersebut.
        protocol:
          type: string
          nullable: true
        ivms_version:
          type: string
          example: ivms101.2023
        required:
          type: boolean
        ownership_confirmed:
          type: boolean
          nullable: true
        deadline_at:
          type: string
          format: date-time
          nullable: true
        timeline:
          type: array
          items:
            type: object
            properties:
              status:
                type: string
              at:
                type: string
                format: date-time
              detail:
                type: string
              name_match:
                allOf:
                  - $ref: '#/components/schemas/TravelRuleNameMatch'
                nullable: true
                description: >-
                  Perbandingan nama yang diputuskan oleh entri ini, di samping
                  `detail`. Tidak ada pada entri yang tidak membandingkan nama.
              reason:
                type: string
                description: >-
                  Hadir hanya pada entri transisi yang disebabkan oleh
                  pengiriman yang gagal: `email_undeliverable` atau
                  `delivery_failed`, nilai yang dilaporkan oleh `reason`
                  transfer.
        counterparty_vasp:
          type: object
          nullable: true
          properties:
            name:
              type: string
            lei:
              type: string
            dd_score:
              type: integer
              description: >-
                Skor uji tuntas dari 0 hingga 100, dengan nilai lebih tinggi
                lebih baik. Skala yang sama seperti dalam direktori VASP.
            dd_score_breakdown:
              type: object
              description: >-
                Kontribusi per komponen ke dd_score, satu objek per komponen
                seperti di direktori VASP (jurisdiction, verification, protocol,
                lei, history, essentials, responsiveness), masing-masing
                {points, max, reason, detail}. {} sampai pihak lawan telah
                dinilai.
              additionalProperties:
                type: object
                properties:
                  points:
                    type: number
                    description: Poin yang diberikan untuk komponen ini.
                  max:
                    type: integer
                    description: Poin maksimum yang dapat diberikan komponen ini.
                  reason:
                    type: string
                    description: Kode yang dapat dibaca mesin untuk keputusan komponen.
                  detail:
                    type: string
                    description: Alasan yang dapat dibaca manusia atas poin yang diberikan.
            dd_assessed_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Waktu ketika penilaian uji tuntas terakhir kali dijalankan. Null
                hingga pihak lawan telah dinilai.
        originator_data:
          type: object
          description: >-
            Pihak pengirim. Untuk transfer masuk, nilai pihak lawan disamarkan
            sampai kepemilikan dikonfirmasi.
        beneficiary_data:
          type: object
          description: >-
            Pihak penerima. Untuk transfer masuk, nilai pihak lawan disamarkan
            hingga kepemilikan dikonfirmasi.
        name_match:
          allOf:
            - $ref: '#/components/schemas/TravelRuleNameMatch'
          nullable: true
          description: >-
            Perbandingan nama yang menentukan transfer, atau null hingga
            perbandingan dijalankan. Saat para pihak disamarkan, dan pada
            salinan pertukaran INTERNAL milik pelanggan lain, `transfer_name`,
            `compared_name`, `matched_names`, dan `mismatched_names`
            disembunyikan. `score` dan `matched` bisa tidak sejalan: `matched`
            mengikuti tingkat ketatnya, sedangkan `score` adalah kesamaan dari
            kedua nama lengkap tersebut.
        data_match:
          $ref: '#/components/schemas/TravelRuleDataMatch'
        mismatched_fields:
          type: array
          items:
            type: string
          description: >-
            Pintasan untuk `data_match.mismatched_fields`. Kosong jika tidak ada
            perbedaan.
        data_unmasked:
          $ref: '#/components/schemas/TravelRuleDataUnmasked'
        data_masked:
          type: boolean
          description: True selama data pribadi pihak lawan disamarkan dalam respons ini.
        created_at:
          type: string
          format: date-time
        delivery:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TravelRuleDelivery'
          description: >-
            Status pesan terbaru yang harus dikirimkan transfer ini ke pihak
            lain. Bernilai null jika transfer tidak pernah diharuskan
            mengirimkannya (misalnya di bawah `threshold_amount`, dompet
            swakelola yang dideklarasikan, atau registrasi sunrise).
        discovery:
          type: array
          description: >-
            Cara Didit mencari pihak lawan, satu entri per langkah yang
            dijalankan. Kosong jika tidak ada penemuan yang dijalankan, misalnya
            pada transfer masuk.
          items:
            $ref: '#/components/schemas/TravelRuleDiscoveryStep'
        reason:
          type: string
          description: >-
            Alasan transfer `COUNTERPARTY_VASP_NOT_FOUND` atau
            `COUNTERPARTY_VASP_NOT_REACHABLE` tertahan; `""` untuk status
            lainnya. Pengiriman yang gagal menentukannya terlebih dahulu, hanya
            pada `COUNTERPARTY_VASP_NOT_REACHABLE`: `email_undeliverable`
            (penyedia email menolak email kepatuhan dan tidak ada alamat tersisa
            untuk dicoba: saat dikirim, pada pengingat, atau sebagai pantulan
            permanen yang dilaporkan kemudian) atau `delivery_failed` (jalur
            pengiriman gagal total: jalur jaringan menolak pesan atau kehabisan
            percobaan coba lagi, host identitas `TRP` tidak menjawab, atau host
            `TRP` pihak lawan tidak menerima permintaan informasi). Jika tidak,
            jejak `discovery` yang menentukannya: `awaiting_end_user` (tidak ada
            langkah yang menyebutkan pihak lawan yang dapat dijangkau Didit),
            `directory_match_no_route` (suatu langkah menyebutkan VASP direktori
            yang tidak memiliki rute), `picked_member_without_proven_wallet`
            (pengguna akhir memilih pelanggan Didit yang belum membuktikan
            kendali atas dompet), atau `no_directory_match` saat jejak tidak
            memberikan alasan lain. Pengiriman ulang akan memajukan transfer,
            sehingga alasannya dihapus. Lihat [Mengapa transfer
            tertahan](/id/transaction-monitoring/travel-rule#mengapa-transfer-macet).
        next_actions:
          type: array
          description: >-
            Apa yang melanjutkan transfer; `[]` untuk status apa pun selain
            `COUNTERPARTY_VASP_NOT_FOUND` atau
            `COUNTERPARTY_VASP_NOT_REACHABLE`. `email_undeliverable` menawarkan
            `update_compliance_email`, lalu `resend`. `delivery_failed`
            menawarkan `resend`. Alasan penemuan menawarkan
            `select_counterparty_vasp`, `declare_self_hosted`, `add_vasp_hint`,
            dan `resend`.
          items:
            $ref: '#/components/schemas/TravelRuleNextAction'
        chain_details:
          $ref: '#/components/schemas/TravelRuleChainDetails'
    TravelRuleUtxoEntry:
      type: object
      description: >-
        Satu input atau output dari transaksi UTXO, sebagaimana dicatat oleh
        rantai blockchain.
      required:
        - address
      properties:
        address:
          type: string
          maxLength: 128
        amount:
          type: string
          nullable: true
          description: >-
            String desimal dalam unit koin itu sendiri (BTC, bukan satoshi).
            Opsional.
          example: '0.0125'
        txid:
          type: string
          maxLength: 128
          description: Opsional. Transaksi yang digunakan oleh input.
        vout:
          type: integer
          nullable: true
          minimum: 0
          description: Opsional. Indeks output yang digunakan oleh input.
    TravelRuleNameMatch:
      type: object
      nullable: true
      description: >-
        Perbandingan nama yang menentukan transfer, atau null hingga
        perbandingan dijalankan. Saat para pihak disamarkan, dan pada salinan
        pertukaran INTERNAL milik pelanggan lain, `transfer_name`,
        `compared_name`, `matched_names`, dan `mismatched_names` disembunyikan.
        `score` dan `matched` bisa tidak sejalan: `matched` mengikuti tingkat
        ketatnya, sedangkan `score` adalah kesamaan dari kedua nama lengkap
        tersebut.
      properties:
        score:
          type: integer
          minimum: 0
          maximum: 100
          description: >-
            Kemiripan antara kedua nama lengkap, 0 hingga 100. Bernilai 0 jika
            salah satu nama kosong.
        matched:
          type: boolean
          description: >-
            Apakah nama-nama tersebut memenuhi `strictness`. Hasil transfer
            mengikuti `data_match`, yang membandingkan setiap kolom, sehingga
            transfer dapat berstatus COUNTERPARTY_MISMATCHED_DATA meskipun ini
            bernilai true.
        method:
          type: string
          enum:
            - none
            - exact_token
            - token_subset
            - token_containment
            - sequence_ratio
          description: >-
            Cara `matched` ditentukan: none (`NONE`), exact_token (`STRICT`),
            token_subset (`DEFAULT`), token_containment (`CONTAINS`), atau
            sequence_ratio (`FUZZY`).
        strictness:
          type: string
          enum:
            - NONE
            - STRICT
            - CONTAINS
            - DEFAULT
            - FUZZY
        compared_with:
          type: string
          enum:
            - wallet_holder
            - counterparty_vasp
          description: >-
            wallet_holder: pemegang yang tercatat untuk dompet tersebut.
            counterparty_vasp: nama yang diberikan pihak lawan di halaman
            respons email, atau jawaban Didit Test VASP di sandbox.
        transfer_name:
          type: string
          description: Nama pada transfer.
        compared_name:
          type: string
          description: Nama yang dibandingkan dengannya.
        matched_names:
          type: array
          items:
            type: string
          description: Kata-kata dari `transfer_name` yang ditemukan di `compared_name`.
        mismatched_names:
          type: array
          items:
            type: string
          description: >-
            Kata-kata dari `transfer_name` yang tidak ditemukan di
            `compared_name`, lalu kata-kata dari `compared_name` yang tidak
            ditemukan di `transfer_name`.
    TravelRuleDataMatch:
      type: object
      nullable: true
      description: >-
        Perbandingan kolom demi kolom antara data pihak transfer dan apa yang
        diketahui pihak lain tentang pemegang dompet. Ini menyebutkan kolom dan
        hasil, tidak pernah nilai, sehingga tetap dapat dibaca sementara data
        pihak lawan disamarkan. Bernilai null sampai perbandingan dijalankan.
      properties:
        matched:
          type: boolean
          description: True saat tidak ada kolom yang dibandingkan yang berbeda.
        mismatched_fields:
          type: array
          items:
            type: string
            enum:
              - name
              - date_of_birth
              - address
              - account
          description: Kolom yang berbeda.
        fields:
          type: object
          description: >-
            Satu entri per kolom yang dibandingkan untuk tipe entitas pihak
            tersebut (`name`, `date_of_birth`, `address`, `account`; perusahaan
            tidak memiliki `date_of_birth`).
          additionalProperties:
            type: object
            properties:
              result:
                type: string
                enum:
                  - matched
                  - mismatched
                  - not_compared
                description: >-
                  `not_compared` saat aturan bernilai `NONE` atau salah satu
                  pihak tidak memiliki nilai untuk kolom tersebut.
              strictness:
                type: string
                enum:
                  - NONE
                  - STRICT
                  - CONTAINS
                  - DEFAULT
                  - FUZZY
    TravelRuleDataUnmasked:
      type: object
      nullable: true
      description: >-
        Catatan audit saat data pihak lawan dibuka penyamarannya. Bernilai null
        selama data masih disamarkan, dan untuk transfer keluar.
      properties:
        at:
          type: string
          format: date-time
        reason:
          type: string
          enum:
            - ownership_confirmed
            - wallet_proof
            - address_book_match
            - own_verified_wallet
            - inquiry_approved
            - known_payment_method
            - travel_address
          description: >-
            Hal yang mengonfirmasi kepemilikan: ownership_confirmed (konfirmasi
            Anda melalui konsol atau API), wallet_proof (bukti dompet di widget,
            atau transfer masuk INTERNAL, ditetapkan saat dibuat),
            address_book_match (dompet di buku alamat yang terverifikasi),
            own_verified_wallet (dompet terverifikasi milik pengguna Anda
            sendiri), inquiry_approved (persetujuan Anda atas permintaan masuk
            TRP atau pesan GTR atau Sygna), known_payment_method (dompet yang
            sudah digunakan pengguna Anda untuk membayar) atau travel_address
            (Travel Address per dompet mencantumkan dompet tersebut).
        actor:
          type: string
          description: >-
            Pihak yang mengonfirmasinya: email pengguna konsol atau label kunci
            API. Kosong untuk keputusan otomatis.
    TravelRuleDelivery:
      type: object
      description: >-
        Status pesan terbaru yang harus dikirimkan transfer ke pihak lain. Didit
        menghubungi pihak lawan setelah permintaan yang membuat atau mengubah
        transfer dikembalikan, sehingga objek ini menunjukkan apakah pesan
        tersebut berhasil terkirim: queued, being sent, waiting to be retried
        after an error, delivered, atau failed. Kegagalan yang masih dapat
        dipulihkan oleh jaringan (tidak ada jawaban tepat waktu, koneksi gagal,
        HTTP `408`, `429`, atau `5xx`) akan dicoba lagi setelah 30 detik, 2
        menit, 10 menit, 30 menit, dan 1 jam. Saat pesan pertama (`kind: SEND`)
        gagal permanen, baik karena jaringan menolaknya atau percobaan keenam
        juga gagal, transfer berpindah ke `COUNTERPARTY_VASP_NOT_REACHABLE`
        dengan `last_error` di `timeline`-nya; pesan lain yang gagal permanen
        akan dicatat di `timeline`. `status` transfer tetap menjadi sumber
        kebenaran tunggal untuk pertukaran itu sendiri.
      required:
        - kind
        - status
        - rail
        - attempts
        - last_error
        - next_attempt_at
        - delivered_at
      properties:
        kind:
          type: string
          enum:
            - SEND
            - ANSWER
            - TXID
            - CANCEL
            - POLL
          description: >-
            Apa yang dibawa pesan. `SEND`: pesan pertama transfer ke pihak lawan
            (keluar; jalur pembayaran dipilih saat dikirim). `ANSWER`:
            persetujuan atau penolakan Anda, yang harus diberikan ke jaringan
            yang meminta (masuk). `TXID`: hash transaksi on-chain, setelah Anda
            menyelesaikan transfer. `CANCEL`: pembatalan, setelah Anda
            membatalkannya. `POLL`: kueri status ke jaringan yang menawarkannya,
            diulang setiap 5 menit saat transfer menunggu pihak lawan.
        status:
          type: string
          enum:
            - QUEUED
            - SENDING
            - RETRYING
            - DELIVERED
            - FAILED
          description: >-
            `QUEUED`: menunggu untuk dikirim. `SENDING`: percobaan sedang
            berjalan. `RETRYING`: percobaan gagal dan percobaan berikutnya
            berjalan pada `next_attempt_at`. `DELIVERED`: pihak lain menerima
            pesan. `FAILED`: pihak lain menolaknya, atau percobaan terakhir
            gagal.
        rail:
          type: string
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - ''
          description: >-
            Jalur yang membawa pesan. Kosong hingga Didit memilih salah satu
            untuk pesan pertama.
        attempts:
          type: integer
          minimum: 0
          description: >-
            Percobaan yang dilakukan sejauh ini untuk pesan ini. Pesan yang
            bukan polling status dicoba paling banyak 6 kali.
        last_error:
          type: string
          description: >-
            Jenis kegagalan yang dialami pada upaya terakhir, `""` jika tidak
            ada: misalnya `email undeliverable`, `trp identity endpoint
            unreachable`, atau `trp transfer inquiry delivery failed`. Kolom ini
            tidak pernah membawa jawaban pihak lawan itu sendiri, yang tetap
            berada di `timeline` transfer.

            Ketika GTR merespons dengan kesalahan, kode status dan pesannya
            sendiri disertakan. Isi respons tidak pernah disertakan.
          example: email undeliverable
        next_attempt_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Waktu upaya berikutnya dijalankan saat pesan berstatus `QUEUED` atau
            `RETRYING`.
        delivered_at:
          type: string
          format: date-time
          nullable: true
          description: Waktu pihak lain menerima pesan.
    TravelRuleDiscoveryStep:
      type: object
      description: >-
        Satu langkah penemuan pihak lawan yang dijalankan Didit untuk transfer
        keluar, sesuai urutan eksekusinya. Langkah pertama yang menyebutkan VASP
        dengan rute akan mengakhiri rantai tersebut.
      properties:
        step:
          type: string
          enum:
            - internal_address_book
            - wallet_attribution
            - network_lookup
            - customer_hint
            - end_user
          description: >-
            `internal_address_book`: pelanggan Didit lain yang membuktikan
            kontrol atas dompet tujuan. `wallet_attribution`: atribusi analitik
            blockchain dompet tersebut. `network_lookup`: jaringan yang dapat
            menyatakan VASP mana yang memegang alamat tersebut. `customer_hint`:
            nama VASP, LEI, atau yurisdiksi yang Anda kirimkan di
            `beneficiary_data`. `end_user`: pihak lawan yang dipilih oleh
            pengguna akhir (atau Anda), atau permintaan untuk memilih salah
            satunya.
        outcome:
          type: string
          enum:
            - match
            - miss
            - skipped
          description: >-
            `match`: langkah tersebut menyebutkan pihak lawan. `miss`: langkah
            berjalan dan tidak menemukan apa pun. `skipped`: langkah tidak dapat
            berjalan, dan `reason` menjelaskan alasannya.
        reason:
          type: string
          description: >-
            Alasan yang dapat dibaca mesin, `""` pada kecocokan:
            `no_proven_internal_wallet`, `attribution_disabled`,
            `already_attributed`, `no_attributed_entity`,
            `directory_match_no_route`, `gtr_address_lookup_runs_on_dispatch`,
            `no_membership`, `network_switched_off`,
            `no_network_address_lookup`, `no_directory_match`,
            `awaiting_end_user` atau `picked_member_without_proven_wallet`.
        vasp:
          type: string
          format: uuid
          nullable: true
          description: VASP direktori yang disebutkan oleh langkah tersebut, jika ada.
        rail:
          type: string
          nullable: true
          description: >-
            Jalur yang menjangkau pihak lawan tersebut, ketika langkah
            menemukannya.
        at:
          type: string
          format: date-time
    TravelRuleNextAction:
      type: object
      description: >-
        Satu hal yang melanjutkan transfer `COUNTERPARTY_VASP_NOT_FOUND` atau
        `COUNTERPARTY_VASP_NOT_REACHABLE`. Lihat [Mengapa transfer
        terhenti](/id/transaction-monitoring/travel-rule#mengapa-transfer-macet).
      properties:
        action:
          type: string
          enum:
            - select_counterparty_vasp
            - declare_self_hosted
            - add_vasp_hint
            - update_compliance_email
            - resend
          description: >-
            `select_counterparty_vasp`: pengguna akhir memilih VASP tujuan di
            widget kepemilikan dompet, atau Anda melakukan PATCH
            `action=beneficiary_vasp`. `declare_self_hosted`: pengguna akhir
            menyatakan dompet tersebut swakelola di dalam widget.
            `add_vasp_hint`: beri tahu Didit siapa pihak lawannya, dengan nama
            VASP, LEI, atau Travel Address (misalnya `travel_address` pada entri
            buku alamat dompet tujuan), lalu kirim ulang.
            `update_compliance_email` dan `resend` adalah nilai `action` dari
            `PATCH /v3/transactions/{transaction_id}/travel-rule/`: berikan
            kembali email kepatuhan pihak lawan, dan jalankan perutean ulang.
        url:
          type: string
          format: uri
          description: >-
            Tautan widget kepemilikan dompet, pada `select_counterparty_vasp`
            dan `declare_self_hosted` saat transfer memiliki sesi widget yang
            terbuka.
      required:
        - action
    TravelRuleChainDetails:
      type: object
      description: >-
        Bagaimana rantai transfer menamai kedua dompetnya, ketika melibatkan
        lebih dari satu alamat yang membayar satu sama lain. Kosong (`{}`) untuk
        transfer rantai akun (EVM, Solana, Tron), di mana kedua alamat tersebut
        adalah dompetnya. Pencocokan, perutean, dan buku alamat membaca dompet
        dari sini terlebih dahulu.
      properties:
        chain:
          type: string
          description: >-
            Blockchain kanonis, misalnya `BTC`, `XRP`, atau `LIGHTNING` untuk
            transfer Lightning.
        shape:
          type: string
          enum:
            - utxo
            - memo
            - lightning
        originator:
          $ref: '#/components/schemas/TravelRuleChainSide'
        beneficiary:
          $ref: '#/components/schemas/TravelRuleChainSide'
        utxo:
          type: object
          description: >-
            Pada transfer UTXO: input dan output sebagaimana disimpan (jumlah
            dalam bentuk string desimal) dan output mana yang dibaca Didit
            sebagai apa.
          properties:
            inputs:
              type: array
              items:
                $ref: '#/components/schemas/TravelRuleUtxoEntry'
            outputs:
              type: array
              items:
                $ref: '#/components/schemas/TravelRuleUtxoEntry'
            change_output_indexes:
              type: array
              items:
                type: integer
              description: Output yang membayar kembali alamat input.
            beneficiary_output_index:
              type: integer
              nullable: true
              description: >-
                Output yang membayar penerima; null jika tidak ada yang dapat
                dibedakan.
        lightning:
          type: object
          description: >-
            Pada transfer Lightning: apa yang tertera pada permintaan
            pembayaran. Selalu berupa `kind` (`bolt11`, `bolt12_offer`,
            `bolt12_invoice`, `bolt12_invoice_request`, `lnurl`,
            `lightning_address`, `node_id`, atau `unknown`); faktur BOLT11
            menambahkan `network`, `payee_node_id`, `payment_hash`,
            `amount_msat`, `created_at`, dan `expires_at`; string BOLT12
            menambahkan `blinded_paths` dan `payee_node_id`; LNURL atau
            Lightning Address menambahkan `domain`-nya. Tidak ada yang
            di-resolve melalui jaringan: permintaan hanya didekode.
          additionalProperties: true
        warnings:
          type: array
          items:
            type: string
            enum:
              - declared_originator_not_an_input
              - declared_beneficiary_not_an_output
              - beneficiary_output_ambiguous
              - beneficiary_output_amount_differs
          description: >-
            Inkonsistensi UTXO yang perlu diperiksa: pengirim yang
            dideklarasikan bukan merupakan input, penerima yang dideklarasikan
            bukan merupakan output, tidak ada satu pun output penerima yang
            dapat dibedakan, atau output penerima membayar jumlah yang berbeda
            dari yang tertera pada transaksi.
        not_applicable_reason:
          type: string
          enum:
            - LIGHTNING_NO_PAYEE_IDENTIFIER
            - LIGHTNING_BOLT12_BLINDED_PAYEE
            - LIGHTNING_LNURL_NAMES_NO_PAYEE
          description: >-
            Pada transfer Lightning keluar yang permintaan pembayarannya tidak
            menyebutkan penerima: alasan transfer berstatus `NOT_APPLICABLE`.
            `LIGHTNING_NO_PAYEE_IDENTIFIER` (permintaan tidak menyebutkan node
            penerima, atau tidak dapat didekode),
            `LIGHTNING_BOLT12_BLINDED_PAYEE` (penawaran menyembunyikan
            penerimanya di balik blinded path), `LIGHTNING_LNURL_NAMES_NO_PAYEE`
            (LNURL menyebutkan nama layanan, bukan penerima). Kode yang sama
            membuka entri `timeline` terakhir dari transfer.
    TravelRuleChainSide:
      type: object
      description: >-
        Dompet salah satu pihak sebagaimana Didit menyelesaikannya dari data
        chain.
      properties:
        address:
          type: string
          description: >-
            Dompet. Pada jaringan memo berupa alamat klasik (alamat X XRP
            dipisahkan menjadi alamat klasik dan tag-nya); pada Lightning berupa
            ID node penerima pembayaran atau Lightning Address.
        memo:
          type: string
          description: >-
            Destination tag atau memo yang merupakan bagian dari dompet; `""`
            jika tidak ada.
        source:
          type: string
          enum:
            - declared
            - x_address
            - largest_input
            - only_non_change_output
            - amount_match
            - invoice_payee
            - updated
          description: >-
            Asal dompet: `declared` (permintaan Anda), `x_address` (dipisahkan
            dari X-address XRP), `largest_input` (alamat input UTXO yang
            berkontribusi paling banyak), `only_non_change_output` (satu-satunya
            output UTXO yang bukan kembalian), `amount_match` (satu output UTXO
            yang membayar jumlah transfer), `invoice_payee` (penerima pembayaran
            yang disebutkan dalam permintaan pembayaran Lightning), `updated`
            (ditetapkan kemudian dengan `action: update_originator_wallet`).
  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.