> ## 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 Kirim Bukti Kepemilikan Dompet - Travel Rule

> Kirim bukti kepemilikan dompet di Didit: tanda tangan, ID transaksi uji, atau tangkapan layar. Percobaan gagal memberi kode; deposit salah ditolak.



Prompt API untuk Mengirimkan Bukti Widget
        Salin prompt ke papan klip



      
      

\<pre>

\`Submit the evidence for a wallet-ownership proof started from a widget session. The hosted widget makes this call; use it only if I build my own widget UI.

Endpoint:
POST https://verification.didit.me/v3/travel-rule/widget/{token}/proofs/{proof_id}/verify/

Authentication:
None - the widget token in the URL path is the credential. Treat the token as a secret.

Body, by method:
\- MESSAGE_SIGNING - JSON {"signature": "..."}: the wallet's signature over the proof's challenge.
\- SATOSHI_TEST - JSON {"txid": "..."}: the test deposit's transaction id.
\- SCREENSHOT - multipart form with a file field.

Behavior:
\- 200 with status VERIFIED, is_ownership_verified and transfer_status once ownership is proven.
\- 200 with status PENDING for a screenshot (it waits for the customer's review) or a deposit not indexed or confirmed yet, with code DEPOSIT_NOT_FOUND or DEPOSIT_UNCONFIRMED (Didit rechecks it until the window closes; no resubmission needed).
\- Every submission counts in attempts.

Failure modes (errors carry a code to translate):
\- 400 - SIGNATURE_INVALID, SIGNATURE_UNSUPPORTED_SCHEME or DEPOSIT_LOOKUP_FAILED. The proof stays PENDING: let the end user try again.
\- 400 - DEPOSIT_MISMATCH, DEPOSIT_STALE or TXID_REUSED with status REJECTED: the deposit is genuinely wrong (another sender, not the expected amount to the deposit address, older than the challenge, or already used to prove another wallet). The proof is closed and uses one of the session's attempts; the body carries max_attempts, attempts_used and attempts_remaining. Pick a method again to start a new proof.
\- 409 - code OWNERSHIP_CHANGED, or a closed proof (REJECTED or EXPIRED; the body carries status, the code it closed with and the attempt counts): start a new proof.
\- 410 - the session expired, or code WINDOW_EXPIRED when the Satoshi test window closed.
\- 404 - unknown token or proof.

Full guide: /transaction-monitoring/wallet-ownership-widget#satoshi-test-verify-contract.`

\</pre>



      
      

Tempel ke



## OpenAPI

````yaml id/openapi-25.json POST /v3/travel-rule/widget/{token}/proofs/{proof_id}/verify/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API Verifikasi Identitas. Lakukan autentikasi dengan header x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/travel-rule/widget/{token}/proofs/{proof_id}/verify/:
    post:
      tags:
        - Travel Rule
      summary: Kirim bukti kepemilikan dompet
      description: >-
        Endpoint publik yang diidentifikasi dengan token sesi widget, tidak
        memerlukan kunci API. Kirim bukti yang dibutuhkan metode bukti: tanda
        tangan untuk MESSAGE_SIGNING, txid untuk SATOSHI_TEST (JSON), atau file
        untuk SCREENSHOT (multipart). Setiap pengiriman dihitung sebagai
        percobaan. Tanda tangan yang tidak terverifikasi, atau deposit yang
        tidak cocok, merespons 400 dengan kode dan membiarkan bukti tetap
        PENDING agar pengguna akhir dapat mencoba lagi. Deposit yang terlihat
        tetapi belum dikonfirmasi merespons 200 dengan status PENDING dan
        diperiksa ulang secara otomatis hingga jendela waktu ditutup. Screenshot
        merespons 200 dengan status PENDING dan menunggu di antrean peninjauan
        Anda (GET /v3/travel-rule/wallet-proofs/). Bukti EXPIRED atau REJECTED
        tidak akan pernah diverifikasi kemudian: mulai yang baru. Format tanda
        tangan yang diverifikasi per rumpun rantai: rantai EVM menerima tanda
        tangan personal_sign (EIP-191), dienkode hex; Bitcoin menerima tanda
        tangan signmessage BIP-137 (alamat P2PKH, P2SH-P2WPKH, dan P2WPKH) atau
        tanda tangan sederhana BIP-322 (alamat P2WPKH dan P2TR), dienkode
        base64; Solana menerima tanda tangan Ed25519 atas challenge, dienkode
        base58; Tron menerima tanda tangan signMessageV2 (TIP-191), dienkode
        hex. Tanda tangan BIP-322 penuh atau bukti dana, atau alamat multisig,
        gagal dengan SIGNATURE_UNSUPPORTED_SCHEME.
      operationId: verifyTravelRuleWidgetProof
      parameters:
        - name: token
          in: path
          required: true
          description: >-
            Token sesi yang tidak transparan yang dikembalikan saat sesi widget
            dibuat.
          schema:
            type: string
        - name: proof_id
          in: path
          required: true
          description: proof_id dikembalikan saat bukti dimulai.
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                signature:
                  type: string
                  description: 'MESSAGE_SIGNING: tanda tangan dompet atas tantangan bukti.'
                txid:
                  type: string
                  description: 'SATOSHI_TEST: id transaksi dari deposit uji coba.'
          multipart/form-data:
            schema:
              type: object
              required:
                - file
              properties:
                file:
                  type: string
                  format: binary
                  description: >-
                    SCREENSHOT: gambar yang menunjukkan dompet di aplikasi
                    dompet milik pengguna akhir.
      responses:
        '200':
          description: >-
            VERIFIED, atau masih PENDING (tangkapan layar yang menunggu
            peninjauan, deposit yang belum terindeks atau belum dikonfirmasi,
            dengan kode DEPOSIT_NOT_FOUND atau DEPOSIT_UNCONFIRMED).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofVerifyResult'
        '400':
          description: >-
            Bukti tidak ada; upaya gagal yang membuat bukti berstatus PENDING
            agar pengguna akhir dapat mencoba lagi (kode SIGNATURE_INVALID,
            SIGNATURE_UNSUPPORTED_SCHEME, atau DEPOSIT_LOOKUP_FAILED); atau
            deposit uji yang menolak bukti (kode DEPOSIT_MISMATCH,
            DEPOSIT_STALE, atau TXID_REUSED, status REJECTED, beserta jumlah
            percobaan sesi): memilih metode lagi akan memulai bukti baru selama
            attempts_remaining di atas 0.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '404':
          description: Token tidak dikenal, atau tidak ada bukti tersebut pada sesi ini.
        '409':
          description: >-
            kode OWNERSHIP_CHANGED (bukti ditutup dengannya); bukti yang ditutup
            (REJECTED atau EXPIRED), dengan statusnya, kode penutupannya, dan
            jumlah percobaan sesi: pilih metode lagi untuk memulai bukti baru;
            atau bukti SELF_DECLARATION, yang diverifikasi saat dimulai.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '410':
          description: >-
            Sesi kedaluwarsa, atau kode WINDOW_EXPIRED saat jendela pengujian
            satoshi ditutup.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
      security:
        - {}
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            https://verification.didit.me/v3/travel-rule/widget/{token}/proofs/{proof_id}/verify/
            \
              -H 'Content-Type: application/json' \
              -d '{"signature": "0x..."}'
components:
  schemas:
    TravelRuleWidgetProofVerifyResult:
      type: object
      properties:
        proof_id:
          type: string
          format: uuid
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
        status:
          type: string
          enum:
            - PENDING
            - VERIFIED
            - REJECTED
            - EXPIRED
        is_ownership_verified:
          type: boolean
          description: >-
            Hadir ketika bukti berstatus VERIFIED: entri buku alamat kini telah
            terverifikasi kepemilikannya.
        transfer_status:
          type: string
          nullable: true
          description: >-
            Hadir ketika bukti berstatus VERIFIED: status transfer tertaut, null
            jika tidak ada.
        detail:
          type: string
          description: >-
            Hadir selama bukti tetap PENDING: tangkapan layar yang dikirimkan
            menunggu peninjauan, atau deposit uji yang belum dikonfirmasi.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Hadir pada deposit uji yang tertunda: alasan mengapa belum
            dikonfirmasi.
    TravelRuleWidgetProofError:
      type: object
      properties:
        detail:
          type: string
          description: Pesan dalam bahasa Inggris yang mudah dibaca manusia.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Alasan yang dapat dibaca mesin, agar klien dapat menampilkan pesan
            terjemahannya sendiri.
        status:
          type: string
          enum:
            - PENDING
            - VERIFIED
            - REJECTED
            - EXPIRED
          description: >-
            Hadir ketika bukti ditutup: REJECTED oleh deposit yang baru saja
            dikirimkan (400), atau REJECTED atau EXPIRED ketika bukti pendukung
            dikirimkan ke bukti yang sudah ditutup (409).
        proof_id:
          type: string
          format: uuid
          description: 'Hadir dengan status: bukti yang ditutup.'
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
          description: 'Hadir dengan status: metode bukti yang ditutup.'
        max_attempts:
          type: integer
          description: >-
            Hadir dengan status: bukti dompet yang ditolak yang diizinkan sesi
            ini.
        attempts_used:
          type: integer
          description: 'Hadir dengan status: bukti yang ditolak sejauh ini.'
        attempts_remaining:
          type: integer
          description: >-
            Hadir dengan status: jika 0, memulai bukti lain akan menghasilkan
            409 dan Anda perlu membuat sesi widget baru.
    TravelRuleWalletProofFailureReason:
      type: string
      enum:
        - ''
        - SIGNATURE_INVALID
        - SIGNATURE_UNSUPPORTED_SCHEME
        - DEPOSIT_NOT_FOUND
        - DEPOSIT_UNCONFIRMED
        - DEPOSIT_LOOKUP_FAILED
        - DEPOSIT_MISMATCH
        - DEPOSIT_STALE
        - TXID_REUSED
        - CHAIN_UNSUPPORTED
        - WINDOW_EXPIRED
        - OWNERSHIP_CHANGED
        - METHOD_SWITCHED
        - REVIEW_REJECTED
        - ABANDONED
      description: >-
        Alasan mengapa bukti kepemilikan dompet, atau upaya terakhirnya, tidak
        mencapai VERIFIED. Kosong jika tidak ada yang gagal. Bukti PENDING dapat
        memuat alasan ini: upaya terakhir gagal dan pengguna akhir dapat mencoba
        lagi. DEPOSIT_MISMATCH, DEPOSIT_STALE, TXID_REUSED, dan REVIEW_REJECTED
        menutup bukti sebagai REJECTED. SIGNATURE_INVALID: tanda tangan tidak
        cocok dengan dompet dan tantangan. SIGNATURE_UNSUPPORTED_SCHEME: dompet
        menandatangani dalam format yang tidak diverifikasi Didit.
        DEPOSIT_NOT_FOUND, DEPOSIT_UNCONFIRMED, DEPOSIT_LOOKUP_FAILED: setoran
        uji tidak terbaca atau belum dikonfirmasi; Didit terus memeriksanya
        hingga jendela pengujian ditutup. DEPOSIT_MISMATCH: transaksi tidak
        mengirim jumlah yang diharapkan dari dompet ke alamat setoran.
        DEPOSIT_STALE: transaksi terjadi sebelum waktu tantangan. TXID_REUSED:
        transaksi telah membuktikan dompet lain. CHAIN_UNSUPPORTED: metode ini
        tidak tersedia pada rantai ini. WINDOW_EXPIRED: jendela pengujian telah
        ditutup. OWNERSHIP_CHANGED: pemegang dompet berubah, atau dompet dihapus
        dari buku alamat Anda, setelah sesi widget dibuat. METHOD_SWITCHED:
        pengguna akhir memilih metode lain sebelum menyelesaikan metode ini.
        REVIEW_REJECTED: peninjau Anda menolak tangkapan layar. ABANDONED: sesi
        widget berakhir sebelum pengguna akhir menyelesaikannya.

````

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