> ## 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 Buat Transaksi: Pengiriman KYT

> Kirim transaksi ke Didit KYT untuk penilaian risiko, skrining, dan travel rule. 1,000 transaksi/bulan termasuk, lalu $0.001 per transaksi.



Prompt API Pembuatan Transaksi
        Salin prompt ke papan klip



      
      

\<pre>

\`Submit a transaction for Didit monitoring through the Management API.

Endpoint:
POST https://verification.didit.me/v3/transactions/

Authentication:
Use the x-api-key header with my Didit API key.

Goal:
\- Submit a transaction for KYT (transaction monitoring). Didit runs the configured rules engine, blockchain analytics, and AML screening synchronously and returns the verdict in the response. The full detail (parties, rule runs, provider results, remediation links) is also returned.
\- A Travel Rule transfer is stored in the same call, but Didit contacts the counterparty after the response: travel_rule.status comes back AWAITING_COUNTERPARTY (or NOT_APPLICABLE, UNCONFIRMED_OWNERSHIP, or COMPLETED for your own verified wallet) with travel_rule.protocol null, and every later status change, including COUNTERPARTY_VASP_NOT_FOUND, arrives as a travel_rule.status.updated webhook. Your rules run again when the rail or the status changes.

When to call:
\- At payment authorization, before fanning out funds, to decide allow / hold / decline based on status, score, severity.
\- On post-trade events (gambling bets, audit-trail events, KYC events) for long-running monitoring without a per-transaction decision.
\- On crypto deposits / withdrawals — set transaction_details.currency_kind = "crypto" and provide the relevant wallet address in payment_method.account_id.
\- For Travel Rule, set transaction_category = "travel_rule" and include travel_rule_details (alias travelRule).
travel_rule_details.status is required (400 if missing); when Travel Rule is enabled, Didit runs the exchange and ignores the status you send, and otherwise Didit records the transfer passively with that status.
When the subject is a user with an approved Didit KYC verification and Travel Rule is on, Didit replaces the originator_data fields the verification holds with the verified values (metadata.originator_provenance says which); otherwise it sends originator_data as you provide it, so build it from the identity you verified.
beneficiary_data carries the beneficiary (name, wallet_address, chain) and any routing hints (travel_address, counterparty_vasp_lei, counterparty_vasp_name, counterparty_vasp_email).
If beneficiary_data.chain is empty, Didit takes transaction_details.crypto_params.crypto_chain, else custom_properties.crypto_chain, else the currency, uppercases it, and sets it only when it is a chain Didit recognises (for example ETH or BTC).
\- Chain shapes: on XRP, XLM, EOS, ATOM and HBAR send the destination tag or memo as payment_method.memo (or beneficiary_data.memo); on BTC, LTC, BCH and DOGE send the transaction's inputs and outputs as travel_rule_details.utxo; on bitcoin or Lightning, payment_method.account_id may be a Lightning payment request or Lightning Address. What Didit resolved is on travel_rule.chain_details (see /transaction-monitoring/travel-rule#chain-shapes).

Identifiers:
\- transaction_id (alias txnId) is YOUR identifier (max 128 chars), unique per application.
It becomes txn_id on subsequent calls.
Reusing a transaction_id that already exists returns 400 {"transaction_id": ["A transaction with this transaction_id already exists."]}, and when two identical requests race each other the loser gets 409.
Neither response returns the existing transaction, so to retry safely, treat a 400 or 409 for a duplicate id as already created and look the transaction up instead of resubmitting: GET /v3/transactions/{uuid}/ with the Didit uuid from the first response, or with the transaction_id (the Didit uuid) that the transaction.created webhook carries next to your txn_id.
GET does not accept your txn_id. Sandbox applications do not receive transaction.created or transaction.status.updated, so save the Didit uuid from the create response. Sandbox Travel Rule exchanges do emit travel_rule.status.updated with environment: sandbox.
\- The returned uuid is Didit's stable identifier — use it in GET /v3/transactions/{transaction_id}/.

Linking to entities:
\- subject.vendor_data (and optionally counterparty.vendor_data) are your internal user/business identifiers. They link the transaction to the long-lived User / Business entity assembled from prior verification sessions. Use the SAME vendor_data you supplied when creating the KYC session.

Minimum request body (application/json):
\{
"transaction_id": "your-txn-2026-05-17-001",
"transaction_category": "finance",   // finance | kyc | travel_rule | user_event | audit_trail_event | gambling_bet | gambling_limit_change | gambling_bonus_change
"transaction_details": {
"direction": "outbound",            // "inbound" | "outbound"
"amount": 1500,                     // number or decimal string, up to 18 decimal places (string for exact precision); never negative, because direction carries the sign
"currency": "EUR",                  // any ISO 4217 code (EUR, USD, NGN, ...) or a crypto symbol
"currency_kind": "fiat",            // "fiat" | "crypto" (optional)
"action_type": "withdrawal"         // optional, e.g. deposit/withdrawal/transfer
},
"subject": {                          // APPLICANT party
"entity_type": "individual",        // "individual" | "company"
"vendor_data": "user-12345",        // required
"full_name": "Maria Garcia",        // required
"address": { "country": "ESP" }     // optional
},
"counterparty": { ... },              // optional COUNTERPARTY party (same shape as subject)
"transaction_at": "2026-05-17T08:42:00Z",  // optional, defaults to now
"travel_rule_details": { "status": "AWAITING_COUNTERPARTY", ... }   // optional, for crypto Travel Rule; status is required inside it
}

Currency codes:
\- currency has no enum. Any ISO 4217 alphabetic code (EUR, USD, NGN, ...) and any crypto asset symbol (BTC, ETH, ...) are accepted and stored exactly as you send them, up to 10 characters.
\- Prefer a currently-circulating code. Not every accepted code has an exchange rate: withdrawn currencies and accounting units such as XDR are often still quoted, but when Didit has no rate for the code you send (for example the ISO accounting unit XSU, or a crypto symbol Didit does not price), automatic conversion to your base currency fails and preferred_currency_amount comes back null. A pre-converted amount_in_default_currency is always used as sent when present, so supply it for any code you are not sure has a rate.
\- Set currency_kind = "crypto" for on-chain amounts. The kind gates the transaction's own crypto AML screening: without currency_kind = "crypto" that regular screening step is skipped and no screening fee is estimated or charged for it, even with monitoring enabled or include_crypto_screening = true. Travel Rule attribution is a separate path: on a production application with Travel Rule and VASP attribution enabled, an outbound transaction_category = "travel_rule" request whose beneficiary wallet and chain cannot be reached over any rail triggers a VASP attribution wallet screening, and that screening is billed at the wallet screening price whatever currency_kind is or is not set. The kind does not change the stored decimal scale: up to 18 decimal places are kept either way, but only when amount arrives as a decimal string ("0.123456789012345678"). A JSON number is parsed as a binary float first, so anything beyond about 15 significant digits is rounded before it is stored (0.123456789012345678 is stored as 0.12345678901234568). The kind also decides how the amount is rendered in the transaction PDF. Crypto amounts render with up to 8 decimal places, fiat amounts with their ISO 4217 minor unit (2 for most currencies). Without the kind, RON, MNT and GEL are rendered as fiat because each is both a token and an ISO 4217 currency, so a small token amount can show as 0 in the report.
The VASP attribution screening is skipped when the transaction's own crypto screening already screened that wallet: Didit reuses that result and charges nothing extra.

Example call:
curl -X POST "https://verification.didit.me/v3/transactions/" \
-H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{
"transaction_id": "your-txn-2026-05-17-001",
"transaction_category": "finance",
"transaction_details": {"direction":"outbound","amount":1500,"currency":"EUR","action_type":"withdrawal"},
"subject": {"entity_type":"individual","vendor_data":"user-12345","full_name":"Maria Garcia"}
}'

What to read from the response:
\- uuid — Didit transaction id, use for GET /v3/transactions/{transaction_id}/.
\- status - APPROVED | IN_REVIEW | DECLINED | AWAITING_USER (live verdict; at creation, AWAITING_USER comes from a rule action).
\- score (0–100, higher = riskier) and severity (LOW | MEDIUM | HIGH | CRITICAL).
\- decision_reason_code / decision_reason_label — machine + human verdict reason.
\- parties (role APPLICANT for the subject, COUNTERPARTY for the counterparty; kind USER, BUSINESS or EXTERNAL), cost_breakdown, rule_runs, provider_results (crypto screening results) and network_snapshot.
\- travel_rule - the Travel Rule transfer (status, protocol, required, originator_data, beneficiary_data, direction, rail, counterparty_vasp, delivery, discovery, reason, next_actions), or null; action_required - a pending wallet-ownership or verification step, or null.
reason and next_actions say why a COUNTERPARTY_VASP_NOT_FOUND or COUNTERPARTY_VASP_NOT_REACHABLE transfer is stuck and what moves it on (for example email_undeliverable: update_compliance_email, then resend); they are "" and [] for any other status.

Webhooks:
\- transaction.created fires after this call succeeds.
\- For a travel_rule transaction, travel_rule.status.updated fires for each Travel Rule transition, after transaction.created. Each webhook is delivered and retried on its own, so key on transaction_id rather than on arrival order.
\- transaction.status.updated fires whenever the verdict changes (manual review, async screening, rule re-runs). Subscribe a destination via POST /v3/webhook/destinations/.

Failure modes:
\- 400 - duplicate transaction_id, missing required field (including travel_rule_details.status), an unknown travel_rule_details.status ("Invalid travel rule status: ..."), invalid direction/category enum, or malformed party object.
\- 409 - a concurrent request with the same transaction_id was created first.
\- 403 - missing x-api-key (a wrong, revoked or expired key gets 401), or a key without permission for this action; the body is a { "detail": "..." } envelope.
\- 403 - the organization's balance cannot cover the fees this request would charge: { "detail": "...", "code": "insufficient_credits" }, and nothing is created.
\- 429 - more than 600 ingestion requests per minute for this API key (transaction and event ingestion share this budget, apart from the 300 of every other write); wait Retry-After seconds and retry.

Side effects:
\- Creates the transaction record and runs the synchronous rules + screening pipeline.
\- Links the transaction to the User / Business entity that shares the subject.vendor_data.
\- An outbound travel_rule transaction is billed once, at creation, on one line. It pays the Travel Rule fee ($0.02) when Travel Rule is on and Didit starts an exchange for it (amount at or above threshold_amount, including a transfer to a self-hosted wallet or to the user's own verified wallet). Otherwise it is billed as transaction monitoring (included in the plan's monthly transaction allowance, $0.001 each beyond it): below threshold_amount, a Lightning payment the Travel Rule does not apply to, or data recorded while Travel Rule is disabled. A resend never charges again.
\- An inbound travel_rule transaction pays no base fee, an application that joined Travel Rule free pays none on outbound transactions until it turns outbound billing on, and sandbox applications are never charged.
\- Crypto screening, when it runs, adds the Wallet Verification & Screening charge.

For the full integration shape, see /integration/integration-prompt.`

\</pre>



      
      

Tempel ke



## OpenAPI

````yaml id/openapi-25.json POST /v3/transactions/
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/transactions/:
    post:
      tags:
        - Transactions
      summary: Buat transaksi
      description: >-
        Kirim transaksi untuk pemantauan AML/risiko sinkron. Transaksi dibuat
        dengan status `APPROVED`, lalu aturan Anda (dan skrining kripto, jika
        berlaku) dijalankan secara inline dan dapat mengubah `status` yang
        dikembalikan menjadi `IN_REVIEW` atau `DECLINED`. **`transaction_id`
        adalah kunci idempotensi Anda** (maks 128 karakter, unik per aplikasi);
        menggunakan kembali ID ini akan mengembalikan 400. Webhook
        `transaction.created` dikirim saat berhasil untuk aplikasi produksi.
        Aplikasi sandbox tidak ditagih dan tidak memancarkan webhook
        `transaction.created` atau `transaction.status.updated`. Pertukaran
        Travel Rule sandbox memancarkan webhook `travel_rule.status.updated`
        dengan `environment: sandbox`. Transfer Travel Rule disimpan dan
        dikembalikan sebelum pihak lawan dihubungi: `travel_rule.status` kembali
        dengan `AWAITING_COUNTERPARTY` (atau `NOT_APPLICABLE` jika di bawah
        ambang batas Anda, `UNCONFIRMED_OWNERSHIP` untuk dompet swakelola yang
        dideklarasikan, `COMPLETED` jika dompet lain tersebut adalah dompet
        terverifikasi milik Anda sendiri) dan `travel_rule.protocol` bernilai
        null. Didit kemudian memilih jalur dan mengirim pertukaran tersebut, dan
        setiap perubahan status transfer berikutnya, termasuk
        `COUNTERPARTY_VASP_NOT_FOUND` jika tidak ada jalur yang dapat menjangkau
        pihak lawan, akan diterima sebagai webhook `travel_rule.status.updated`.
        Aturan Anda akan dijalankan kembali saat jalur atau status berubah.
      operationId: createTransaction
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                transaction_id:
                  type: string
                  description: >-
                    Pengidentifikasi unik Anda untuk transaksi ini (maks 128
                    karakter).
                  example: your-txn-2026-05-17-001
                transaction_at:
                  type: string
                  format: date-time
                  description: >-
                    Kapan transaksi terjadi. Defaultnya adalah sekarang jika
                    dihilangkan.
                time_zone:
                  type: string
                  description: Pengenal zona waktu IANA, misalnya `Europe/Madrid`.
                transaction_category:
                  type: string
                  description: >-
                    Kategori transaksi. Alias CamelCase (`travelRule`,
                    `userPlatformEvent`, `gamblingBet`, …) juga diterima; nilai
                    yang disimpan/dikembalikan berupa camelCase untuk kategori
                    multi-kata.
                  example: finance
                  enum:
                    - finance
                    - kyc
                    - travel_rule
                    - user_event
                    - audit_trail_event
                    - gambling_bet
                    - gambling_limit_change
                    - gambling_bonus_change
                    - travelRule
                transaction_details:
                  type: object
                  description: Detail keuangan inti dari transaksi.
                  required:
                    - direction
                    - amount
                    - currency
                  properties:
                    direction:
                      type: string
                      description: >-
                        Arah transaksi relatif terhadap subjek. Tidak peka huruf
                        besar/kecil; `in`/`out` diterima sebagai alias.
                        Dikembalikan dalam huruf besar (`INBOUND`/`OUTBOUND`).
                      example: outbound
                      enum:
                        - inbound
                        - outbound
                        - in
                        - out
                    amount:
                      type: number
                      description: >-
                        Jumlah transaksi (hingga 18 tempat desimal). Kirimkan
                        sebagai string desimal (misalnya
                        `"0.123456789012345678"`) jika presisi tepat diperlukan:
                        angka JSON diurai sebagai float biner terlebih dahulu,
                        sehingga digit di luar sekitar 15 digit signifikan akan
                        dibulatkan sebelum jumlah disimpan. Harus nol atau lebih
                        besar: arah menentukan tanda, dan jumlah negatif
                        menghasilkan `400`.
                      example: 1500
                    currency:
                      type: string
                      description: >-
                        Kode mata uang. Kode alfabet ISO 4217 apa pun diterima
                        (misalnya `EUR`, `USD`, `NGN`), begitu pula simbol aset
                        kripto (misalnya `BTC`). Sebaiknya gunakan kode yang
                        saat ini beredar. Tidak semua kode yang diterima
                        memiliki nilai tukar: jika tidak ada nilai tukar yang
                        tersedia untuk kode tersebut (misalnya unit akuntansi
                        ISO `XSU`, atau simbol kripto yang harganya tidak
                        ditetapkan oleh Didit), konversi otomatis gagal dan
                        `preferred_currency_amount` dikembalikan sebagai null
                        kecuali permintaan menyertakan
                        `amount_in_default_currency` yang telah dikonversi
                        sebelumnya.
                      example: EUR
                    currency_kind:
                      type: string
                      description: Apakah mata uang berupa `fiat` atau `crypto`.
                    amount_in_default_currency:
                      type: number
                      nullable: true
                      description: >-
                        Jumlah yang dikonversi sebelumnya dalam mata uang
                        default. Jika dihilangkan, konversi valas otomatis akan
                        dicoba. Harus bernilai nol atau lebih besar.
                    default_currency:
                      type: string
                      description: >-
                        Kode mata uang default untuk jumlah yang dikonversi.
                        Kode ISO 4217 apa pun yang saat ini beredar.
                    payment_details:
                      type: string
                      nullable: true
                      description: Referensi atau memo pembayaran teks bebas.
                    payment_reference_id:
                      type: string
                      nullable: true
                      description: >-
                        Referensi sistem pembayaran eksternal. Untuk skrining
                        hash transaksi AML kripto, kirim hash transaksi
                        blockchain dan berikan juga
                        `subject.payment_method.account_id` dengan alamat
                        terkait.
                    action_type:
                      type: string
                      nullable: true
                      description: >-
                        Subtipe transaksi, misalnya `deposit`, `withdrawal`,
                        `transfer`.
                    crypto_params:
                      type: object
                      description: >-
                        Pemilihan jaringan kripto, terpisah dari mata uang
                        (simbol aset). Mencatat simbol token kustom tidak
                        menjamin cakupan hash transaksi untuk kontraknya.
                      properties:
                        crypto_chain:
                          type: string
                          description: >-
                            Jaringan aktual yang digunakan untuk skrining.
                            Skrining terkelola mendukung BTC, ETH, LTC, XRP,
                            BCH, DOGE, TRX, SOL, MATIC, BNB, BASE (Base), OP
                            (Optimism), ARB (Arbitrum One), AVAX (Avalanche
                            C-Chain), ADA (Cardano), XLM (Stellar), dan HBAR
                            (Hedera). Nama jaringan umum juga diterima, misalnya
                            POLYGON atau POL untuk MATIC, BSC untuk BNB, dan
                            TRON untuk TRX. Selalu tentukan parameter ini untuk
                            token multi-jaringan. Jika tidak diisi untuk USDT,
                            USDC, atau ETH yang dikirim dengan hash transaksi
                            0x, Didit akan mencari hash tersebut di Ethereum,
                            BNB Chain, Polygon, Base, Arbitrum, dan Optimism,
                            lalu melakukan skrining pada jaringan tempat hash
                            ditemukan; jika tidak ditemukan di jaringan mana
                            pun, transaksi tidak diskrining dan
                            custom_values.aml_screening_status bernilai FAILED
                            dengan alasannya di
                            custom_values.aml_screening_error. Jika tidak diisi
                            untuk USDT atau USDC yang diskrining berdasarkan
                            dompet (tanpa hash transaksi), alamat Tron
                            diskrining di Tron, alamat Solana di Solana, dan
                            alamat 0x di jaringan pertama dari keenam jaringan
                            tersebut tempat alamat tersebut pernah mengirim
                            transaksi atau menyimpan token, atau di Ethereum
                            jika tidak aktif di jaringan mana pun. Cakupan
                            penyedia terhubung bervariasi; LIGHTNING memerlukan
                            penyedia terhubung yang didukung.
                          example: BASE
                subject:
                  type: object
                  description: Subjek (pemohon) dari transaksi.
                  required:
                    - vendor_data
                    - full_name
                  properties:
                    entity_type:
                      type: string
                      description: 'Tipe entitas: `individual` atau `company`.'
                    vendor_data:
                      type: string
                      description: Pengenal pengguna/bisnis internal Anda.
                      example: user-12345
                    full_name:
                      type: string
                      description: Nama lengkap subjek.
                      example: Maria Garcia
                    first_name:
                      type: string
                      description: Nama depan subjek.
                    last_name:
                      type: string
                      description: Nama belakang subjek.
                    date_of_birth:
                      type: string
                      format: date
                      description: Tanggal lahir (YYYY-MM-DD).
                    address:
                      type: object
                      description: Objek alamat.
                      properties:
                        country:
                          type: string
                          description: >-
                            Kode negara (disarankan ISO 3166-1 alpha-3). Disalin
                            ke `country_code` pihak tersebut.
                        town:
                          type: string
                        state:
                          type: string
                        street:
                          type: string
                        post_code:
                          type: string
                    institution_details:
                      type: object
                      description: Detail institusi (untuk subjek institusional).
                      properties:
                        name:
                          type: string
                        code:
                          type: string
                        address:
                          type: object
                    device_context:
                      type: object
                      description: >-
                        Konteks perangkat yang diambil pada saat transaksi.
                        browser_family dan platform harus dikirim sebagai kunci
                        tingkat atas eksplisit — keduanya tidak diturunkan dari
                        user_agent. Alias camelCase device juga diterima pada
                        permintaan.
                      properties:
                        fingerprint:
                          type: string
                          description: Sidik jari perangkat yang unik.
                        persistent_device_id:
                          type: string
                          description: >-
                            Pengidentifikasi perangkat lintas-sesi yang stabil
                            (skema fingerprint v2).
                        user_agent:
                          type: string
                          description: >-
                            String user agent browser atau aplikasi. Alias
                            CamelCase: userAgent.
                        browser_family:
                          type: string
                          description: >-
                            Famili browser (misalnya Chrome, Firefox, Safari).
                            Harus dikirim secara eksplisit — ini tidak
                            diturunkan dari user_agent. Alias CamelCase:
                            browserFamily.
                        browser_version:
                          type: string
                          description: >-
                            String versi browser. Harus dikirim secara
                            eksplisit. Alias CamelCase: browserVersion.
                        platform:
                          type: string
                          description: >-
                            Pengenal platform (web, ios, android, macos,
                            windows, linux). Harus dikirim secara eksplisit —
                            ini tidak diturunkan dari user_agent.
                        os_family:
                          type: string
                          description: >-
                            Keluarga sistem operasi (misalnya iOS, Android,
                            Windows). Alias CamelCase: osFamily.
                        os_version:
                          type: string
                          description: >-
                            String versi sistem operasi. Alias CamelCase:
                            osVersion.
                        accept_language:
                          type: string
                          description: >-
                            Nilai header Accept-Language. Alias CamelCase:
                            acceptLang.
                        session_id:
                          type: string
                          description: >-
                            Pengenal sesi untuk sesi pengguna saat ini. Disimpan
                            dalam metadata. Alias CamelCase: sessionId.
                        session_age_ms:
                          type: number
                          description: >-
                            Usia sesi pengguna dalam milidetik pada saat
                            transaksi. Alias CamelCase: sessionAgeMs.
                        network_context:
                          type: object
                          description: >-
                            Konteks jaringan dengan alamat IP dan geolokasi.
                            Blok ipInfo tingkat atas juga digabungkan ke dalam
                            objek ini.
                          properties:
                            ip_address:
                              type: string
                              description: 'Alamat IP klien. Alias CamelCase: ip.'
                            ip_country_code:
                              type: string
                              description: >-
                                Negara dari IP yang ditentukan secara geografis
                                (ISO 3166-1 alpha-3). Alias CamelCase:
                                countryCode3.
                            latitude:
                              type: number
                              description: >-
                                Garis lintang geografis IP. Alias CamelCase:
                                lat.
                            longitude:
                              type: number
                              description: 'Garis bujur geografis IP. Alias CamelCase: lon.'
                    payment_method:
                      type: object
                      description: Metode pembayaran yang digunakan oleh subjek.
                      properties:
                        method_type:
                          type: string
                          description: >-
                            Jenis metode pembayaran: `bank_card`,
                            `bank_account`, `crypto_wallet`, `ewallet`,
                            `unhosted_wallet`, `other`.
                        account_id:
                          type: string
                          description: >-
                            Pengidentifikasi akun (misalnya IBAN, alamat
                            dompet). Untuk skrining kripto, ini harus berisi
                            alamat dompet untuk partisipan ini. Skrining hash
                            transaksi masuk memerlukan alamat deposit
                            layanan/pelanggan pada subjek. Skrining keluar
                            menggunakan dompet tujuan pada pihak lawan. Pada
                            transfer kripto di bitcoin atau Lightning, ini dapat
                            berupa permintaan pembayaran Lightning (faktur
                            BOLT11, penawaran BOLT12, LNURL) atau Lightning
                            Address: Didit menyimpan penerima pembayaran yang
                            disebutkan sebagai akun ("" jika tidak menyebutkan
                            siapa pun) dan apa yang tertera pada permintaan di
                            `chain_details.lightning` transfer Travel Rule.
                            Maksimal 255 karakter setelah disimpan. Pada
                            transfer kripto di bitcoin atau Lightning, ini dapat
                            berupa permintaan pembayaran Lightning (faktur
                            BOLT11, penawaran BOLT12, LNURL) atau Lightning
                            Address: Didit menyimpan penerima pembayaran yang
                            disebutkan sebagai akun ("" jika tidak menyebutkan
                            siapa pun) dan apa yang tertera pada permintaan di
                            `chain_details.lightning` transfer Travel Rule.
                            Maksimal 255 karakter setelah disimpan.
                        memo:
                          type: string
                          maxLength: 256
                          description: >-
                            Destination tag atau memo yang merupakan bagian dari
                            dompet di jaringan memo (XRP, XLM, EOS, ATOM, HBAR).
                            Pada satu alamat bursa bersama, setiap memo adalah
                            metode pembayarannya sendiri. XRP: destination tag,
                            bilangan bulat dari 0 hingga 4294967295 (angka JSON
                            diterima). XLM: memo teks hingga 28 byte, ID 64-bit,
                            atau hash 32-byte dalam heksadesimal. EOS: hingga
                            256 byte. ATOM: hingga 256 karakter. HBAR: hingga
                            100 byte. Dompet Bitcoin, EVM, Solana, Tron,
                            Litecoin, Bitcoin Cash, Dogecoin, dan Lightning
                            tidak memerlukan memo: keberadaan memo akan
                            menghasilkan `400`. Alias: `destinationTag` atau
                            `destination_tag`.
                        issuing_country:
                          type: string
                          description: Kode negara ISO 3166-1 alpha-3 dari penerbit.
                counterparty:
                  type: object
                  description: Pihak lawan dari transaksi (opsional).
                  properties:
                    entity_type:
                      type: string
                      description: 'Tipe entitas: `individual` atau `company`.'
                    vendor_data:
                      type: string
                      description: Pengenal internal Anda untuk pihak lawan.
                    full_name:
                      type: string
                      description: Nama lengkap pihak lawan.
                    first_name:
                      type: string
                    last_name:
                      type: string
                    date_of_birth:
                      type: string
                      format: date
                    address:
                      type: object
                      description: Objek alamat dengan `country` (ISO 3166-1 alpha-3).
                    institution_details:
                      type: object
                    device_context:
                      type: object
                      description: >-
                        Konteks perangkat untuk pihak lawan. browser_family dan
                        platform harus dikirim sebagai kunci tingkat atas
                        eksplisit — keduanya tidak diturunkan dari user_agent.
                      properties:
                        fingerprint:
                          type: string
                          description: Sidik jari perangkat yang unik.
                        persistent_device_id:
                          type: string
                          description: >-
                            Pengidentifikasi perangkat lintas-sesi yang stabil
                            (skema fingerprint v2).
                        user_agent:
                          type: string
                          description: >-
                            String user agent browser atau aplikasi. Alias
                            CamelCase: userAgent.
                        browser_family:
                          type: string
                          description: >-
                            Famili browser (misalnya Chrome, Firefox, Safari).
                            Harus dikirim secara eksplisit — ini tidak
                            diturunkan dari user_agent. Alias CamelCase:
                            browserFamily.
                        browser_version:
                          type: string
                          description: >-
                            String versi browser. Harus dikirim secara
                            eksplisit. Alias CamelCase: browserVersion.
                        platform:
                          type: string
                          description: >-
                            Pengenal platform (web, ios, android, macos,
                            windows, linux). Harus dikirim secara eksplisit —
                            ini tidak diturunkan dari user_agent.
                        os_family:
                          type: string
                          description: >-
                            Keluarga sistem operasi (misalnya iOS, Android,
                            Windows). Alias CamelCase: osFamily.
                        os_version:
                          type: string
                          description: >-
                            String versi sistem operasi. Alias CamelCase:
                            osVersion.
                        accept_language:
                          type: string
                          description: >-
                            Nilai header Accept-Language. Alias CamelCase:
                            acceptLang.
                        session_id:
                          type: string
                          description: >-
                            Pengenal sesi untuk sesi pihak lawan. Disimpan dalam
                            metadata. Alias CamelCase: sessionId.
                        session_age_ms:
                          type: number
                          description: >-
                            Usia sesi pengguna dalam milidetik pada saat
                            transaksi. Alias CamelCase: sessionAgeMs.
                        network_context:
                          type: object
                          description: >-
                            Konteks jaringan dengan alamat IP dan geolokasi.
                            Blok ipInfo tingkat atas juga digabungkan ke dalam
                            objek ini.
                          properties:
                            ip_address:
                              type: string
                              description: 'Alamat IP klien. Alias CamelCase: ip.'
                            ip_country_code:
                              type: string
                              description: >-
                                Negara dari IP yang ditentukan secara geografis
                                (ISO 3166-1 alpha-3). Alias CamelCase:
                                countryCode3.
                            latitude:
                              type: number
                              description: >-
                                Garis lintang geografis IP. Alias CamelCase:
                                lat.
                            longitude:
                              type: number
                              description: 'Garis bujur geografis IP. Alias CamelCase: lon.'
                    payment_method:
                      type: object
                      description: >-
                        Metode pembayaran yang digunakan oleh pihak lawan. Pada
                        transaksi travelRule, `method_type: "unhosted_wallet"`
                        mendeklarasikan dompet pihak lawan sebagai dompet
                        swakelola: transfer mengabaikan perutean VASP pihak
                        lawan, dibuat langsung dalam `UNCONFIRMED_OWNERSHIP`,
                        dan (ketika `auto_wallet_verification` diaktifkan) sesi
                        widget kepemilikan dompet dibuat secara otomatis dan
                        dikembalikan di blok `action_required` transaksi.
                      properties:
                        method_type:
                          type: string
                          description: >-
                            Jenis metode pembayaran: `bank_card`,
                            `bank_account`, `crypto_wallet`, `ewallet`,
                            `unhosted_wallet`, `other`. Gunakan
                            `unhosted_wallet` untuk mendeklarasikan dompet
                            swakelola untuk Travel Rule.
                        account_id:
                          type: string
                          description: >-
                            Pengidentifikasi akun (misalnya IBAN atau alamat
                            dompet). Pada transfer kripto di bitcoin atau
                            Lightning, ini dapat berupa permintaan pembayaran
                            Lightning (faktur BOLT11, penawaran BOLT12, LNURL)
                            atau Lightning Address: Didit menyimpan penerima
                            pembayaran yang disebutkan sebagai akun ("" jika
                            tidak menyebutkan siapa pun) dan apa yang tertera
                            pada permintaan di `chain_details.lightning`
                            transfer Travel Rule. Maksimal 255 karakter setelah
                            disimpan. Pada transfer kripto di bitcoin atau
                            Lightning, ini dapat berupa permintaan pembayaran
                            Lightning (faktur BOLT11, penawaran BOLT12, LNURL)
                            atau Lightning Address: Didit menyimpan penerima
                            pembayaran yang disebutkan sebagai akun ("" jika
                            tidak menyebutkan siapa pun) dan apa yang tertera
                            pada permintaan di `chain_details.lightning`
                            transfer Travel Rule. Maksimal 255 karakter setelah
                            disimpan.
                        memo:
                          type: string
                          maxLength: 256
                          description: >-
                            Destination tag atau memo yang merupakan bagian dari
                            dompet di jaringan memo (XRP, XLM, EOS, ATOM, HBAR).
                            Pada satu alamat bursa bersama, setiap memo adalah
                            metode pembayarannya sendiri. XRP: destination tag,
                            bilangan bulat dari 0 hingga 4294967295 (angka JSON
                            diterima). XLM: memo teks hingga 28 byte, ID 64-bit,
                            atau hash 32-byte dalam heksadesimal. EOS: hingga
                            256 byte. ATOM: hingga 256 karakter. HBAR: hingga
                            100 byte. Dompet Bitcoin, EVM, Solana, Tron,
                            Litecoin, Bitcoin Cash, Dogecoin, dan Lightning
                            tidak memerlukan memo: keberadaan memo akan
                            menghasilkan `400`. Alias: `destinationTag` atau
                            `destination_tag`.
                        issuing_country:
                          type: string
                custom_properties:
                  type: object
                  description: >-
                    Pasangan kunci-nilai arbitrer yang dilampirkan ke transaksi.
                    Setiap kunci dapat dirujuk dalam kondisi aturan dengan jalur
                    kolom `custom_values.<key>`.
                  additionalProperties: true
                  example:
                    merchant_id: test
                    bank_name: test_2
                travel_rule_details:
                  type: object
                  description: >-
                    Data Travel Rule. Saat Travel Rule diaktifkan dan
                    transaction_category adalah travel_rule, Didit menjalankan
                    pertukaran itu sendiri: mengabaikan status, protocol,
                    required, dan obligations_count, serta menggunakan
                    originator_data, beneficiary_data, dan metadata. Jika tidak,
                    Didit menyimpan nilai-nilai ini sebagai catatan Travel Rule
                    pasif. Saat Travel Rule aktif, transfer keluar pada atau di
                    atas ambang batas Anda harus menyertakan apa yang diwajibkan
                    oleh rezimnya (EU TFR atau Rekomendasi FATF 16), yang
                    diperiksa pada sisi yang Anda kirim: kolom yang hilang
                    menghasilkan respons 400 di bawah
                    `travel_rule_details.originator_data` atau
                    `travel_rule_details.beneficiary_data`, misalnya "EU TFR
                    mewajibkan nama pengirim."
                  required:
                    - status
                  properties:
                    status:
                      type: string
                      description: >-
                        Wajib diisi setiap kali Anda mengirim
                        travel_rule_details. Salah satu status transfer Travel
                        Rule (misalnya AWAITING_COUNTERPARTY, COMPLETED,
                        NOT_APPLICABLE); penulisan huruf kecil dan camelCase
                        serta nilai lama UNKNOWN, COMPLIANT, PENDING_ACTION,
                        PENDING_COUNTERPARTY, FAILED, dan EXEMPT juga diterima
                        dan dipetakan. Nilai lain apa pun mengembalikan 400.
                    protocol:
                      type: string
                    required:
                      type: boolean
                    obligations_count:
                      type: integer
                    originator_data:
                      type: object
                      description: >-
                        Pihak pengirim, sebagai kolom datar atau satu individu
                        IVMS 101. Untuk pengguna Anda dengan verifikasi KYC yang
                        disetujui, Didit mengganti kolom yang tercakup dalam
                        verifikasi dengan nilai yang terverifikasi (lihat
                        `metadata.originator_provenance`). Harus berupa objek:
                        format lainnya menghasilkan `400`. Pada jaringan memo,
                        kunci `memo` menyebutkan memo atau tag dompet pengirim.
                    beneficiary_data:
                      type: object
                      description: >-
                        Pihak penerima, sebagai kolom datar atau satu individu
                        IVMS 101. Nilainya harus berupa objek: selain itu akan
                        menghasilkan `400`. Untuk merutekan transfer, Didit
                        membaca `wallet_address` (yang kosong diisi dari
                        `counterparty.payment_method.account_id`), `chain`
                        (diisi dari
                        `transaction_details.crypto_params.crypto_chain` atau
                        `currency` jika menyebutkan rantai yang didukung),
                        `name` (menggunakan cadangan `counterparty.full_name`),
                        `travel_address`, `counterparty_vasp_name`,
                        `counterparty_vasp_lei`, dan `counterparty_vasp_email`.
                        Pada jaringan memo, `memo` menentukan memo atau tag
                        dompet penerima; `wallet_address` dan `memo`
                        diprioritaskan di atas metode pembayaran pihak lawan.
                    metadata:
                      type: object
                    utxo:
                      allOf:
                        - $ref: '#/components/schemas/TravelRuleUtxo'
                      description: >-
                        Opsional, hanya rantai UTXO (BTC, LTC, BCH, DOGE). Input
                        dan output transaksi, yang darinya Didit menyimpulkan
                        dompet pengirim dan output penerima saat Anda tidak
                        mendeklarasikannya.
                    originator:
                      type: object
                      description: >-
                        Blok pengirim IVMS 101: `originatorPersons` (satu
                        `naturalPerson` atau `legalPerson`; badan hukum
                        menjadikan pihak tersebut sebuah perusahaan) dan
                        `accountNumber` (alamat). Digunakan untuk
                        `originator_data` saat objek tersebut kosong. Blok yang
                        salah format mengembalikan respons 400 dengan kunci
                        jalurnya, misalnya `originator.originatorPersons`.
                    beneficiary:
                      type: object
                      description: >-
                        Blok penerima IVMS 101: `beneficiaryPersons` (satu
                        `naturalPerson` atau `legalPerson`; badan hukum
                        menjadikan pihak tersebut sebuah perusahaan) dan
                        `accountNumber` (alamat). Digunakan untuk
                        `beneficiary_data` saat objek tersebut kosong. Blok yang
                        salah format mengembalikan respons 400 dengan kunci
                        jalurnya, misalnya `beneficiary.beneficiaryPersons`.
                    ivms101:
                      type: object
                      description: >-
                        Blok `originator` dan `beneficiary` yang dibungkus dalam
                        satu objek IVMS 101 (`IVMS101` juga diterima). Blok
                        tingkat atas lebih diutamakan daripada blok pembungkus.
                network_snapshot:
                  type: object
                  description: Snapshot graf jaringan yang dihitung sebelumnya.
                  properties:
                    nodes:
                      type: array
                      items:
                        type: object
                    edges:
                      type: array
                      items:
                        type: object
                    metrics:
                      type: object
                include_crypto_screening:
                  type: boolean
                  nullable: true
                  description: >-
                    Override per transaksi untuk skrining analitik blockchain
                    kripto. Jika bernilai `true`, skrining kripto dilakukan
                    terlepas dari default aplikasi. Jika bernilai `false`,
                    skrining kripto dilewati meskipun diaktifkan dalam
                    pengaturan aplikasi. Jika dihilangkan atau `null`, default
                    tingkat aplikasi yang dikonfigurasikan di Console akan
                    digunakan. Skrining kripto memerlukan
                    `transaction_details.direction`, `currency_kind: "crypto"`,
                    rantai/mata uang, dan alamat dompet yang dipilih berdasarkan
                    arah: skrining pra-transfer masuk menggunakan
                    `counterparty.payment_method.account_id`, skrining hash
                    transaksi masuk menggunakan
                    `subject.payment_method.account_id`, dan skrining keluar
                    menggunakan `counterparty.payment_method.account_id`. Jika
                    `transaction_details.payment_reference_id` berisi hash
                    transaksi blockchain, Didit melakukan skrining transaksi dan
                    mengembalikan pengayaan ringkasan transaksi jika tersedia.
              required:
                - transaction_id
                - transaction_category
                - transaction_details
                - subject
            examples:
              Minimal fiat withdrawal:
                summary: >-
                  Payload terkecil yang dapat diterima untuk transfer keluar
                  fiat
                value:
                  transaction_id: your-txn-2026-05-17-001
                  transaction_category: finance
                  transaction_details:
                    direction: outbound
                    amount: 1500
                    currency: EUR
                    action_type: withdrawal
                  subject:
                    entity_type: individual
                    vendor_data: user-12345
                    full_name: Maria Garcia
              Crypto outbound with screening:
                summary: >-
                  Penarikan kripto keluar ke dompet swakelola, skrining opsional
                  (opt-in)
                value:
                  transaction_id: your-txn-2026-05-17-002
                  transaction_category: finance
                  include_crypto_screening: true
                  transaction_details:
                    direction: outbound
                    amount: 0.5
                    currency: BTC
                    currency_kind: crypto
                    amount_in_default_currency: 32500
                    default_currency: USD
                    action_type: withdrawal
                  subject:
                    entity_type: individual
                    vendor_data: user-12345
                    full_name: Maria Garcia
                    payment_method:
                      method_type: crypto_wallet
                      account_id: bc1qexampleexchangewalletaddressxyz
                      issuing_country: ESP
                  counterparty:
                    entity_type: individual
                    payment_method:
                      method_type: unhosted_wallet
                      account_id: bc1qexampleexternalwalletaddressabc
              Travel Rule transfer:
                summary: >-
                  Transfer kripto keluar dengan data pengirim/penerima Travel
                  Rule
                value:
                  transaction_id: your-txn-2026-05-17-003
                  transaction_category: travel_rule
                  transaction_details:
                    direction: outbound
                    amount: 25000
                    currency: USDT
                    currency_kind: crypto
                    action_type: transfer
                  subject:
                    entity_type: individual
                    vendor_data: user-12345
                    full_name: Maria Garcia
                    date_of_birth: '1992-03-14'
                    address:
                      country: ESP
                      town: Madrid
                      street: Calle Mayor 1
                      post_code: '28013'
                  counterparty:
                    entity_type: individual
                    full_name: John Beneficiary
                    institution_details:
                      name: Beneficiary VASP, Inc.
                      code: BVASP-US
                  travel_rule_details:
                    status: AWAITING_COUNTERPARTY
                    protocol: IVMS101
                    required: true
                    originator_data:
                      name: Maria Garcia
                    beneficiary_data:
                      name: John Beneficiary
      responses:
        '201':
          description: >-
            Transaksi dikirimkan dan dipantau. Isi adalah detail transaksi
            lengkap (bentuk yang sama dengan `GET
            /v3/transactions/{transaction_id}/`), yang mencerminkan hasil aturan
            apa pun yang telah diterapkan.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionDetail'
              examples:
                Approved with no rule hits:
                  value:
                    uuid: abcdef12-3456-4890-abcd-ef1234567890
                    environment: live
                    transaction_number: 4123
                    txn_id: your-txn-2026-05-17-001
                    txn_date: '2026-05-17T08:42:00Z'
                    zone_id: Europe/Madrid
                    transaction_type: finance
                    action_type: withdrawal
                    direction: OUTBOUND
                    status: APPROVED
                    source: LIVE
                    amount: '1500'
                    currency: EUR
                    currency_type: fiat
                    amount_in_default_currency: '1620.45'
                    default_currency_code: USD
                    preferred_currency_amount: '1620.45'
                    preferred_currency_code: USD
                    payment_details: Withdrawal to crypto wallet
                    payment_txn_id: null
                    score: 0
                    severity: null
                    decision_reason_code: null
                    decision_reason_label: null
                    vendor_data: user-12345
                    metadata:
                      subject:
                        entity_type: individual
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        address: {}
                        institution_details: {}
                        device_context: {}
                      counterparty: {}
                    props: {}
                    tags: []
                    parties:
                      - uuid: b1111111-2222-4333-8444-555555555555
                        role: APPLICANT
                        entity_type: individual
                        kind: USER
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        first_name: null
                        last_name: null
                        country_code: null
                        dob: null
                        address: {}
                        institution_info: {}
                        device: {}
                        external_party_snapshot: null
                    payment_methods: []
                    documents: []
                    activities:
                      - uuid: d4e5f6a7-8901-4bcd-9ef0-123456789abc
                        activity_type: TRANSACTION_CREATED
                        source: TRANSACTION
                        status: APPROVED
                        title: withdrawal
                        description: Transaction recorded.
                        metadata: {}
                        occurred_at: '2026-05-17T08:42:11Z'
                    alerts: []
                    rule_runs: []
                    provider_results: []
                    travel_rule: null
                    network_snapshot: null
                    remediation: null
                    action_required: null
                    cost_breakdown: null
                Flagged for review:
                  value:
                    uuid: abcdef12-3456-4890-abcd-ef1234567891
                    environment: live
                    transaction_number: 4124
                    txn_id: your-txn-2026-05-17-002
                    txn_date: '2026-05-17T08:42:00Z'
                    zone_id: Europe/Madrid
                    transaction_type: finance
                    action_type: withdrawal
                    direction: OUTBOUND
                    status: IN_REVIEW
                    source: LIVE
                    amount: '0.5'
                    currency: BTC
                    currency_type: crypto
                    amount_in_default_currency: '32500'
                    default_currency_code: USD
                    preferred_currency_amount: '32500'
                    preferred_currency_code: USD
                    payment_details: Withdrawal to crypto wallet
                    payment_txn_id: null
                    score: 78
                    severity: HIGH
                    decision_reason_code: WALLET_HIGH_RISK
                    decision_reason_label: Destination wallet flagged as high risk
                    vendor_data: user-12345
                    metadata:
                      subject:
                        entity_type: individual
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        address: {}
                        institution_details: {}
                        device_context: {}
                      counterparty: {}
                    props:
                      order_id: ord-9988
                    tags: []
                    parties:
                      - uuid: b1111111-2222-4333-8444-555555555555
                        role: APPLICANT
                        entity_type: individual
                        kind: USER
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        first_name: null
                        last_name: null
                        country_code: null
                        dob: null
                        address: {}
                        institution_info: {}
                        device: {}
                        external_party_snapshot: null
                    payment_methods: []
                    documents: []
                    activities: []
                    alerts:
                      - uuid: a7b8c9d0-1234-4abc-9def-567890abcdef
                        title: Destination wallet flagged as high risk
                        description: Provider risk score exceeded the configured threshold.
                        severity: HIGH
                        status: OPEN
                        source: RULE
                        metadata: {}
                        created_at: '2026-05-17T08:42:12Z'
                        due_at: null
                    rule_runs:
                      - uuid: e5f6a7b8-9012-4cde-af01-23456789abcd
                        rule: f6a7b8c9-0123-4def-b012-3456789abcde
                        rule_title: High-risk wallet screening
                        rule_description: null
                        rule_category: crypto
                        matched: true
                        is_test: false
                        mode: ACTIVE
                        severity: HIGH
                        score_delta: 78
                        status_target: IN_REVIEW
                        action_summary: score +78; change_status:IN_REVIEW
                        metadata: {}
                        created_at: '2026-05-17T08:42:12Z'
                    provider_results: []
                    travel_rule: null
                    network_snapshot: null
                    remediation: null
                    action_required: null
                    cost_breakdown: null
        '400':
          description: >-
            Validasi gagal (kolom wajib tidak ada, duplikasi `transaction_id`,
            nilai enum tidak dikenal, mata uang tidak valid, dll.).
          content:
            application/json:
              examples:
                Missing required field:
                  value:
                    transaction_details:
                      amount:
                        - This field is required.
                Duplicate transaction_id:
                  value:
                    transaction_id:
                      - A transaction with this transaction_id already exists.
                Invalid category:
                  value:
                    non_field_errors:
                      - Unsupported transaction category.
                Missing subject identity:
                  value:
                    subject:
                      - subject.vendor_data and subject.full_name are required.
                Blocklisted participant:
                  value:
                    vendor_data:
                      - >-
                        The individual 'user-12345' is in the blocklist and
                        cannot participate in transactions.
        '403':
          description: >-
            Kunci API tidak ada, tidak valid, atau dicabut, atau kunci tersebut
            tidak dapat mengirimkan transaksi untuk aplikasi ini. Kunci yang
            tidak ada mengembalikan `403`; kunci yang salah, dicabut, atau
            kedaluwarsa mengembalikan `401`.
          content:
            application/json:
              examples:
                Forbidden:
                  value:
                    detail: You do not have permission to perform this action.
        '409':
          description: >-
            Permintaan lain dengan `transaction_id` yang sama membuat transaksi
            saat permintaan ini sedang diproses, sehingga hanya satu dari dua
            pengiriman simultan yang berhasil. Baca transaksi yang ada alih-alih
            mengirim ulang.
          content:
            application/json:
              examples:
                Concurrent duplicate:
                  value:
                    detail: A transaction with this transaction_id already exists.
        '429':
          description: >-
            Batas laju terlampaui: pembuatan transaksi dan penyerapan event
            (`POST /v3/transactions/`, `POST /v3/events/`, `POST
            /v3/events/batch/`) berbagi anggaran sebanyak 600 permintaan per
            menit per kunci API, terpisah dari anggaran 300 permintaan yang
            digunakan bersama oleh semua permintaan tulis lainnya. Tunggu
            `Retry-After` detik, lalu coba lagi.
          headers:
            Retry-After:
              description: >-
                Detik yang harus ditunggu sebelum mencoba lagi, dibulatkan ke
                atas agar percobaan berikutnya berada di jendela berikutnya.
              schema:
                type: integer
                minimum: 1
                example: 30
          content:
            application/json:
              examples:
                Throttled:
                  value:
                    detail: >-
                      Ingestion rate limit exceeded. You can make up to 600
                      requests per minute.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST 'https://verification.didit.me/v3/transactions/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "transaction_id": "your-txn-2026-05-17-001",
                "transaction_category": "finance",
                "transaction_details": {
                  "direction": "outbound",
                  "amount": 1500,
                  "currency": "EUR",
                  "action_type": "withdrawal"
                },
                "subject": {
                  "entity_type": "individual",
                  "vendor_data": "user-12345",
                  "full_name": "Maria Garcia"
                }
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.transactions.create(
                transaction_id="your-txn-2026-05-17-001",
                transaction_category="finance",
                transaction_details={
                    "direction": "outbound",
                    "amount": 1500.0,
                    "currency": "EUR",
                    "action_type": "withdrawal",
                },
                subject={
                    "entity_type": "individual",
                    "vendor_data": "user-12345",
                    "full_name": "Maria Garcia",
                },
            )
            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.transactions.create({
              transaction_id: "your-txn-2026-05-17-001",
              transaction_category: "finance",
              transaction_details: {
                direction: "outbound",
                amount: 1500.0,
                currency: "EUR",
                action_type: "withdrawal",
              },
              subject: {
                entity_type: "individual",
                vendor_data: "user-12345",
                full_name: "Maria Garcia",
              },
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Create(ctx, didit.TransactionsCreateParams{\n\tTransactionID:       \"your-txn-2026-05-17-001\",\n\tTransactionCategory: \"finance\",\n\tTransactionDetails: didit.TransactionsCreateParamsTransactionDetails{\n\t\tDirection:  \"outbound\",\n\t\tAmount:     1500.0,\n\t\tCurrency:   \"EUR\",\n\t\tActionType: didit.String(\"withdrawal\"),\n\t},\n\tSubject: didit.TransactionsCreateParamsSubject{\n\t\tEntityType: didit.String(\"individual\"),\n\t\tVendorData: \"user-12345\",\n\t\tFullName:   \"Maria Garcia\",\n\t},\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.TransactionsCreateParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.transactions().create(TransactionsCreateParams.builder()
                    .transactionId("your-txn-2026-05-17-001")
                    .transactionCategory(TransactionsCreateParams.TransactionCategory.of("finance"))
                    .transactionDetails(TransactionsCreateParams.TransactionDetails.builder()
                            .direction(TransactionsCreateParams.TransactionDetails.Direction.of("outbound"))
                            .amount(1500.0)
                            .currency("EUR")
                            .actionType("withdrawal")
                            .build())
                    .subject(TransactionsCreateParams.Subject.builder()
                            .entityType("individual")
                            .vendorData("user-12345")
                            .fullName("Maria Garcia")
                            .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->transactions->create([
                'transaction_id' => 'your-txn-2026-05-17-001',
                'transaction_category' => 'finance',
                'transaction_details' => [
                    'direction' => 'outbound',
                    'amount' => 1500.0,
                    'currency' => 'EUR',
                    'action_type' => 'withdrawal',
                ],
                'subject' => [
                    'entity_type' => 'individual',
                    'vendor_data' => 'user-12345',
                    'full_name' => 'Maria Garcia',
                ],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.transactions.create(
              transaction_id: "your-txn-2026-05-17-001",
              transaction_category: "finance",
              transaction_details: {
                direction: "outbound",
                amount: 1500.0,
                currency: "EUR",
                action_type: "withdrawal",
              },
              subject: {
                entity_type: "individual",
                vendor_data: "user-12345",
                full_name: "Maria Garcia",
              }
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.Transactions.CreateAsync(new
            TransactionsCreateParams

            {
                TransactionId = "your-txn-2026-05-17-001",
                TransactionCategory = "finance",
                TransactionDetails = new()
                {
                    Direction = "outbound",
                    Amount = 1500.0,
                    Currency = "EUR",
                    ActionType = "withdrawal",
                },
                Subject = new()
                {
                    EntityType = "individual",
                    VendorData = "user-12345",
                    FullName = "Maria Garcia",
                },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    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'
    TransactionDetail:
      type: object
      description: >-
        Catatan pemantauan lengkap untuk satu transaksi, sebagaimana
        dikembalikan oleh `GET /v3/transactions/{transaction_id}/` dan `POST
        /v3/transactions/`.
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            Pengenal transaksi yang stabil dari Didit. Gunakan sebagai
            `{transaction_id}` untuk panggilan tindak lanjut.
        environment:
          type: string
          enum:
            - live
            - sandbox
          description: >-
            Lingkungan aplikasi yang memiliki transaksi tersebut. Transaksi
            `sandbox` disimpan tetapi tidak pernah dievaluasi, diskrining,
            diberitahukan, atau ditagih, sehingga `rule_runs` yang kosong
            berarti "tidak dievaluasi".
        transaction_number:
          type: integer
          description: >-
            Nomor transaksi berurutan dalam cakupan aplikasi yang ditampilkan di
            Konsol (misalnya `4123`).
        txn_id:
          type: string
          description: >-
            `transaction_id` yang Anda berikan saat dibuat (maks 128 karakter).
            Unik per aplikasi.
        txn_date:
          type: string
          format: date-time
          description: >-
            Kapan transaksi terjadi (dari `transaction_at`; defaultnya adalah
            waktu pengiriman).
        zone_id:
          type: string
          nullable: true
          description: Pengenal zona waktu IANA yang diberikan saat dibuat.
        transaction_type:
          type: string
          description: >-
            Kategori tingkat atas sebagaimana disimpan: `finance`, `kyc`,
            `travelRule`, `userPlatformEvent`, `gamblingBet`,
            `gamblingLimitChange`, `gamblingBonusChange`, `auditTrailEvent`.
            Perhatikan bahwa nilai multi-kata dikembalikan dalam camelCase
            bahkan ketika dikirimkan dalam snake_case.
        action_type:
          type: string
          description: >-
            Subtipe dalam kategori tersebut (misalnya `deposit`, `withdrawal`,
            `transfer`). Default ke kategori jika tidak disediakan.
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: >-
            Arah relatif terhadap subjek. Disimpan dalam huruf besar terlepas
            dari format huruf yang dikirim (`in`/`out`/`inbound`/`outbound`
            diterima sebagai input).
        status:
          type: string
          enum:
            - APPROVED
            - IN_REVIEW
            - DECLINED
            - AWAITING_USER
          description: >-
            Keputusan pemantauan saat ini. Transaksi dibuat dengan status
            `APPROVED`; aturan dapat mengubahnya menjadi `IN_REVIEW`/`DECLINED`
            secara sinkron.
        source:
          type: string
          enum:
            - LIVE
            - IMPORTED
          description: >-
            Bagaimana catatan berasal: `LIVE` untuk transaksi yang dikirimkan
            melalui API atau SDK, `IMPORTED` untuk transaksi yang dimuat melalui
            impor konsol.
        amount:
          type: string
          description: >-
            Jumlah transaksi sebagai string desimal dengan nol di akhir yang
            dihilangkan (misalnya `"1500"`, `"0.5"`, `"0.123456789012345678"`).
            Hingga 18 tempat desimal.
        currency:
          type: string
          description: >-
            Kode mata uang untuk `amount`. Kode alfabet ISO 4217 apa pun
            diterima (misalnya `EUR`, `USD`, `NGN`), begitu pula simbol aset
            kripto (misalnya `BTC`). Sebaiknya gunakan kode yang saat ini
            beredar. Tidak semua kode yang diterima memiliki nilai tukar: jika
            tidak ada nilai tukar yang tersedia untuk kode tersebut (misalnya
            unit akuntansi ISO `XSU`, atau simbol kripto yang harganya tidak
            ditetapkan oleh Didit), konversi otomatis gagal dan
            `preferred_currency_amount` dikembalikan sebagai null kecuali
            permintaan menyertakan `amount_in_default_currency` yang telah
            dikonversi sebelumnya.
        currency_type:
          type: string
          nullable: true
          description: '`fiat` atau `crypto`, sebagaimana dikirimkan dalam `currency_kind`.'
        amount_in_default_currency:
          type: string
          nullable: true
          description: >-
            Jumlah yang Anda berikan setelah dikonversi sebelumnya, sebagai
            string desimal dengan angka nol di belakangnya dihapus.
        default_currency_code:
          type: string
          nullable: true
        preferred_currency_amount:
          type: string
          nullable: true
          description: '`amount` dikonversi ke mata uang pilihan aplikasi, jika tersedia.'
        preferred_currency_code:
          type: string
          nullable: true
        payment_details:
          type: string
          nullable: true
          description: Referensi atau memo pembayaran teks bebas dari pengiriman.
        payment_txn_id:
          type: string
          nullable: true
          description: >-
            Referensi sistem pembayaran eksternal (misalnya hash transaksi
            blockchain) dari `payment_reference_id`.
        score:
          type: integer
          description: >-
            Skor risiko yang diakumulasikan oleh aturan (biasanya 0–100). Lebih
            tinggi = lebih berisiko.
        severity:
          type: string
          nullable: true
          enum:
            - UNKNOWN
            - LOW
            - MEDIUM
            - HIGH
            - CRITICAL
          description: >-
            Tingkat keparahan risiko kategoris yang ditetapkan oleh
            aturan/penyedia (`UNKNOWN`, `LOW`, `MEDIUM`, `HIGH`, `CRITICAL`).
            Bernilai `null` hingga ada yang menetapkannya.
        decision_reason_code:
          type: string
          nullable: true
          description: Alasan yang dapat dibaca mesin untuk `status` saat ini.
        decision_reason_label:
          type: string
          nullable: true
          description: Label yang mudah dibaca manusia untuk `decision_reason_code`.
        vendor_data:
          type: string
          nullable: true
          description: Salinan praktis dari `vendor_data` pemohon.
        metadata:
          type: object
          description: >-
            Cuplikan dari payload `subject` dan `counterparty` seperti yang
            dikirimkan pada waktu pembuatan.
        props:
          type: object
          description: >-
            `custom_properties` yang Anda berikan saat pembuatan. Setiap kunci
            dapat direferensikan dalam kondisi aturan sebagai
            `custom_values.<key>`.
        tags:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              name:
                type: string
              color:
                type: string
              description:
                type: string
                nullable: true
              source:
                type: string
                enum:
                  - didit
                  - custom
                description: Apakah tag tersebut merupakan preset Didit atau tag kustom.
          description: >-
            Tag yang dilampirkan ke transaksi (secara manual atau berdasarkan
            aturan).
        parties:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              role:
                type: string
                enum:
                  - APPLICANT
                  - REMITTER
                  - BENEFICIARY
                  - COUNTERPARTY
                description: >-
                  Peran pihak. Endpoint pembuatan menetapkan `APPLICANT`
                  (subjek) dan `COUNTERPARTY`.
              entity_type:
                type: string
                enum:
                  - individual
                  - company
                  - external
                  - unhostedWallet
              kind:
                type: string
                enum:
                  - USER
                  - BUSINESS
                  - EXTERNAL
                description: >-
                  Pihak `USER`/`BUSINESS` menautkan kembali ke entitas milik
                  Didit melalui `vendor_data`. Pihak `EXTERNAL` tidak memiliki
                  entitas Didit di belakangnya.
              vendor_data:
                type: string
                nullable: true
                description: Pengenal pengguna/bisnis internal Anda.
              full_name:
                type: string
                nullable: true
              first_name:
                type: string
                nullable: true
              last_name:
                type: string
                nullable: true
              country_code:
                type: string
                nullable: true
                description: >-
                  Kode negara dari `address.country` yang dikirimkan (biasanya
                  ISO 3166-1 alpha-3).
              dob:
                type: string
                format: date
                nullable: true
                description: Tanggal lahir dari `date_of_birth` yang dikirimkan.
              address:
                type: object
                description: >-
                  Objek alamat seperti yang dikirimkan. `{}` jika tidak
                  disertakan.
              institution_info:
                type: object
                description: >-
                  Detail institusi sebagaimana dikirimkan. `{}` jika
                  dihilangkan.
              device:
                type: object
                description: >-
                  Konteks perangkat yang dinormalisasi, termasuk pengayaan IP
                  sisi server di bawah network_context (geolokasi, tanda
                  VPN/pusat data) saat IP diberikan.
                properties:
                  fingerprint:
                    type: string
                    description: Sidik jari perangkat yang unik.
                  persistent_device_id:
                    type: string
                    description: >-
                      Pengidentifikasi perangkat lintas-sesi yang stabil (skema
                      fingerprint v2).
                  user_agent:
                    type: string
                    description: String user agent browser atau aplikasi.
                  browser_family:
                    type: string
                    description: Famili browser (misalnya Chrome, Firefox, Safari).
                  browser_version:
                    type: string
                    description: String versi browser.
                  platform:
                    type: string
                    description: >-
                      Pengenal platform (web, ios, android, macos, windows,
                      linux).
                  os_family:
                    type: string
                    description: Keluarga sistem operasi (misalnya iOS, Android, Windows).
                  os_version:
                    type: string
                    description: String versi sistem operasi.
                  accept_language:
                    type: string
                    description: Nilai header Accept-Language.
                  session_id:
                    type: string
                    description: Pengenal sesi (disimpan dalam metadata).
                  session_age_ms:
                    type: number
                    description: Usia sesi dalam milidetik.
                  network_context:
                    type: object
                    description: Konteks jaringan dengan alamat IP dan geolokasi.
                    properties:
                      ip_address:
                        type: string
                        description: Alamat IP klien.
                      ip_country_code:
                        type: string
                        description: >-
                          Negara dari IP yang ditentukan secara geografis (ISO
                          3166-1 alpha-3).
                      latitude:
                        type: number
                        description: Garis lintang geografis IP.
                      longitude:
                        type: number
                        description: Garis bujur geografis IP.
              external_party_snapshot:
                type: object
                nullable: true
                description: >-
                  Salinan beku dari data pihak untuk pihak `EXTERNAL`. Bernilai
                  `null` selama pihak tersebut ditautkan ke pengguna atau bisnis
                  Didit.
          description: Pihak transaksi (pemohon, pihak lawan).
        payment_methods:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              payment_method_type:
                type: string
                enum:
                  - bank_card
                  - bank_account
                  - e_wallet
                  - crypto_wallet
                  - unhosted_wallet
                  - other
              label:
                type: string
                nullable: true
              fingerprint:
                type: string
                nullable: true
                description: >-
                  SHA-256 atas `type:account_id:issuing_country` —
                  pengidentifikasi stabil untuk menghubungkan penggunaan kembali
                  instrumen yang sama.
              account_id:
                type: string
                nullable: true
                description: Pengidentifikasi akun (IBAN, alamat dompet, token kartu, …).
              issuing_country:
                type: string
                nullable: true
              owner_kind:
                type: string
                enum:
                  - USER
                  - BUSINESS
                  - EXTERNAL
              vendor_data:
                type: string
                nullable: true
                description: Pengidentifikasi Anda untuk pengguna/bisnis pemilik.
              owner_name:
                type: string
                nullable: true
              institution_info:
                type: object
              details:
                type: object
                description: Objek `payment_method` mentah sebagaimana dikirimkan.
              external_owner_snapshot:
                type: object
                nullable: true
              role:
                type: string
                enum:
                  - SOURCE
                  - DESTINATION
                  - FUNDING
                  - BENEFICIARY
                description: >-
                  Bagaimana metode ini digunakan dalam transaksi. Endpoint
                  pembuatan menetapkan `SOURCE`/`DESTINATION` dari arah (keluar:
                  subjek = SOURCE; masuk: subjek = DESTINATION).
          description: Metode pembayaran yang ditautkan ke transaksi.
        documents:
          type: array
          description: File yang dilampirkan ke transaksi dari konsol. `[]` jika tidak ada.
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              label:
                type: string
                nullable: true
              note:
                type: string
                nullable: true
              uploaded_by:
                type: string
                nullable: true
              created_at:
                type: string
                format: date-time
              files:
                type: array
                items:
                  type: object
                  properties:
                    uuid:
                      type: string
                      format: uuid
                    file_url:
                      type: string
                      format: uri
                      nullable: true
                      description: >-
                        URL unduhan bertanda tangan berdurasi singkat; ambil
                        saat dibutuhkan alih-alih menyimpannya.
                    original_filename:
                      type: string
                      nullable: true
                    file_size:
                      type: integer
                      nullable: true
        activities:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              activity_type:
                type: string
                description: >-
                  Contoh: `TRANSACTION_CREATED`, `TRANSACTION_NOTE_ADDED`,
                  `TRANSACTION_STATUS_CHANGED`.
              source:
                type: string
              status:
                type: string
                nullable: true
              title:
                type: string
                nullable: true
              description:
                type: string
                nullable: true
              metadata:
                type: object
              occurred_at:
                type: string
                format: date-time
          description: >-
            Entri log aktivitas (pembuatan, catatan, peninjauan manual,
            perubahan status).
        alerts:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              title:
                type: string
              description:
                type: string
                nullable: true
              severity:
                type: string
                enum:
                  - UNKNOWN
                  - LOW
                  - MEDIUM
                  - HIGH
                  - CRITICAL
              status:
                type: string
                enum:
                  - OPEN
                  - INVESTIGATING
                  - AWAITING_USER
                  - PENDING_SAR
                  - SAR_FILED
                  - RESOLVED
                  - DISMISSED
              source:
                type: string
                enum:
                  - RULE
                  - PROVIDER
                  - MANUAL
              metadata:
                type: object
              created_at:
                type: string
                format: date-time
              due_at:
                type: string
                format: date-time
                nullable: true
          description: >-
            Selalu kosong saat ini. Alert terbuka adalah transaksi dengan status
            `IN_REVIEW` atau `AWAITING_USER`.
        rule_runs:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              rule:
                type: string
                format: uuid
                description: UUID aturan yang dijalankan.
              rule_title:
                type: string
              rule_description:
                type: string
                nullable: true
              rule_category:
                type: string
              matched:
                type: boolean
                description: >-
                  Apakah kondisi aturan cocok dengan transaksi ini. Eksekusi
                  hanya dicatat untuk aturan yang cocok, sehingga evaluasi live
                  selalu bernilai `true`.
              is_test:
                type: boolean
                description: >-
                  True saat aturan berjalan dalam mode TEST (tidak berpengaruh
                  pada status/skor).
              mode:
                type: string
                enum:
                  - ACTIVE
                  - DISABLED
                  - TEST
              severity:
                type: string
                nullable: true
              score_delta:
                type: integer
                description: Skor yang ditambahkan oleh tindakan `add_score` aturan ini.
              status_target:
                type: string
                nullable: true
                description: >-
                  Status yang ditetapkan oleh tindakan `change_status`, jika
                  ada.
              action_summary:
                type: string
                nullable: true
                description: >-
                  Ringkasan tindakan yang dijalankan aturan, digabungkan dengan
                  `; ` (misalnya `score +30; change_status:IN_REVIEW;
                  add_tag:high_risk_country`). Bagian-bagian: `score +N`,
                  `change_status:<STATUS>`, `add_tag:<name>`, `add_note`,
                  `add_to_list`, `open_case`. `null` jika aturan tidak
                  menjalankan tindakan apa pun.
              metadata:
                type: object
                description: >-
                  Detail evaluasi: `scope_match`, `conditions[]`, dan
                  `aggregations[]`. Setiap entri kondisi memuat `field`,
                  `operator`, `expected_value`, `current_value` yang dibaca dari
                  transaksi, `matched`, `group_index`, dan `group_logic`. Setiap
                  entri agregasi (velocity / count / sum) memuat `metric`,
                  `field`, `operator`, `expected_value`, `computed_value` dari
                  hasil evaluasi agregat, `window`, `filters`, `matched`, dan
                  `sample_references`; agregasi asinkron yang ditangguhkan
                  memiliki `computed_value: null` dan `deferred: true`. Grup
                  kondisi bertingkat adalah satu entri `conditions[]` dengan
                  `operator` `any_of` atau `all_of`, `field` bernilai null, dan
                  hasil anggotanya berada di bawah `conditions` miliknya
                  sendiri.
              created_at:
                type: string
                format: date-time
          description: >-
            Hasil eksekusi per aturan — aturan mana yang terpicu, beserta
            dampaknya terhadap skor.
        provider_results:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              provider:
                type: string
              result_type:
                type: string
                enum:
                  - FIAT_MONITORING
                  - WALLET_SCREENING
                  - TRANSACTION_SCREENING
                  - TRAVEL_RULE
                  - NETWORK_GRAPH
                  - CUSTOM
              status:
                type: string
              severity:
                type: string
                nullable: true
              score:
                type: integer
              summary:
                type: string
                nullable: true
              payload:
                type: object
                description: Payload respons penyedia mentah.
              created_at:
                type: string
                format: date-time
          description: Payload penyedia mentah (skrining AML, analitik blockchain, dll.).
        travel_rule:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TransactionTravelRule'
          description: >-
            Transfer atau pemeriksaan Travel Rule. Diisi saat
            `travel_rule_details` dikirimkan, dan juga saat Travel Rule
            diaktifkan dan transaksi dibuat dengan `transaction_category:
            travelRule` (Didit menginisiasi pertukaran itu sendiri, bahkan tanpa
            `travel_rule_details`). `null` saat tidak ada transfer atau
            pemeriksaan. Pada transfer masuk, `originator_data` dan
            `beneficiary_data` pihak lawan tetap disamarkan (`data_masked:
            true`) hingga kepemilikan dompet dikonfirmasi.
        network_snapshot:
          type: object
          nullable: true
          description: >-
            Snapshot graf dari transaksi/pihak terkait yang digunakan oleh mesin
            aturan. Berupa `network_snapshot` yang dikirimkan bersama transaksi
            atau graf yang dibangun Didit dari skrining dompet AML yang berhasil
            (yang menggantikan graf yang dikirimkan). `null` jika keduanya tidak
            ada.
          properties:
            uuid:
              type: string
              format: uuid
            nodes:
              type: array
              items:
                type: object
            edges:
              type: array
              items:
                type: object
            metrics:
              type: object
        remediation:
          type: object
          nullable: true
          description: >-
            Sesi remediasi yang ditawarkan kepada pengguna ketika verifikasi
            ulang diperlukan. Digantikan oleh `action_required`, yang merupakan
            blok kanonikal; dipertahankan untuk kompatibilitas mundur.
          properties:
            session_id:
              type: string
            session_token:
              type: string
            url:
              type: string
              format: uri
            status:
              type: string
        action_required:
          type: object
          nullable: true
          description: >-
            Tindakan pengguna akhir yang tertunda yang diperlukan untuk
            menyelesaikan transaksi ini, atau null jika tidak ada. SDK Didit
            meluncurkan tindakan secara otomatis secara default dan menyegarkan
            transaksi saat selesai. Dua varian, dibedakan berdasarkan `type`:
            `verification_session` (sesi verifikasi yang di-hosting yang dibuat
            oleh tindakan aturan) dan `wallet_ownership` (sesi widget
            kepemilikan dompet yang dibuat secara otomatis untuk transfer Travel
            Rule yang memerlukan bukti kendali dompet, diatur oleh pengaturan
            Travel Rule `auto_wallet_verification`). Ketika keduanya berlaku,
            `wallet_ownership` diprioritaskan karena memblokir pertukaran Travel
            Rule.
          oneOf:
            - $ref: '#/components/schemas/TransactionVerificationSessionAction'
            - $ref: '#/components/schemas/TransactionWalletOwnershipAction'
          discriminator:
            propertyName: type
            mapping:
              verification_session: '#/components/schemas/TransactionVerificationSessionAction'
              wallet_ownership: '#/components/schemas/TransactionWalletOwnershipAction'
        cost_breakdown:
          type: object
          nullable: true
          description: >-
            Biaya transaksi ini: `total_price` dan `items`, satu untuk setiap
            biaya, masing-masing dengan `usage_type`, `price`, `details`, dan
            `created_at`. Skrining ulang transaksi yang sama merupakan item
            baru.
    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.
    TransactionTravelRule:
      type: object
      description: >-
        Transfer Travel Rule dari transaksi, sebagaimana dikembalikan oleh `GET
        /v3/transactions/{transaction_id}/`, `201` dari `POST
        /v3/transactions/`, dan setiap baris dari `GET /v3/transactions/`.
        `direction`, `rail`, `counterparty_vasp`, `delivery`, `discovery`,
        `reason`, dan `next_actions` memiliki struktur yang sama seperti pada
        `PATCH /v3/transactions/{transaction_id}/travel-rule/`, sehingga satu
        kali pembacaan transaksi dapat menjelaskan alasan transfer tertahan dan
        tindakan apa yang dapat melanjutkannya.
      properties:
        uuid:
          type: string
          format: uuid
        status:
          type: string
        protocol:
          type: string
          nullable: true
        required:
          type: boolean
        obligations_count:
          type: integer
        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:
          type: object
          nullable: true
          description: >-
            Perbandingan nama yang menentukan transfer (skor dan tingkat
            ketatnya). Null hingga perbandingan dijalankan. Nama-nama yang
            dibandingkan disamarkan bersama dengan para pihak.
        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.
        metadata:
          type: object
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: Sisi pertukaran mana transfer ini berada.
        rail:
          type: string
          nullable: true
          description: >-
            Jalur yang dilalui transfer: `INTERNAL`, `TRP`, `GTR`, `TRUST`,
            `VERIFYVASP`, `SYGNA`, atau `EMAIL` (`TEST_VASP` pada aplikasi
            sandbox, saat Test VASP Didit merespons), atau `null` hingga sebuah
            jalur dipilih.
        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.
          description: >-
            Entri direktori pihak lawan, atau `null` jika transfer tidak
            menautkan apa pun.
        delivery:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TravelRuleDelivery'
          description: >-
            Pesan terbaru yang menjadi kewajiban transfer kepada pihak lain.
            `null` jika tidak ada kewajiban, misalnya di bawah
            `threshold_amount` atau untuk dompet swakelola yang dideklarasikan.
        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'
    TransactionVerificationSessionAction:
      title: Verification session
      type: object
      properties:
        type:
          type: string
          enum:
            - verification_session
        url:
          type: string
          format: uri
          description: URL verifikasi yang di-hosting untuk dibuka bagi pengguna akhir.
        session_id:
          type: string
          format: uuid
          description: ID sesi verifikasi.
        session_token:
          type: string
          description: >-
            Token sesi, digunakan oleh SDK seluler untuk meluncurkan alur secara
            native.
        status:
          type: string
          description: Status sesi verifikasi.
      required:
        - type
        - url
    TransactionWalletOwnershipAction:
      title: Wallet ownership
      type: object
      properties:
        type:
          type: string
          enum:
            - wallet_ownership
        url:
          type: string
          format: uri
          description: >-
            URL widget kepemilikan dompet yang di-hosting. Buka di lingkungan
            browser nyata - di ponsel gunakan SFSafariViewController atau Chrome
            Custom Tab, jangan pernah gunakan webview tersemat.
        widget_session_id:
          type: string
          format: uuid
          description: ID sesi widget kepemilikan dompet.
        expires_at:
          type: string
          format: date-time
          description: Kapan sesi widget kedaluwarsa.
      required:
        - type
        - url
    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.