> ## 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.

# Wallet-Eigentumsnachweis einreichen – Travel Rule API

> Wallet-Nachweis bei Didit einreichen: Signatur, Test-TXID oder Screenshot. Fehlversuch liefert Code; falsche Einzahlung wird abgelehnt.



Prompt für die API zur Übermittlung von Widget-Nachweisen
        Prompt in die Zwischenablage kopieren



      
      

\<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>



      
      

Einfügen in



## OpenAPI

````yaml de/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 für Ausweisverifizierung. Authentifizierung über den x-api-key-Header.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/travel-rule/widget/{token}/proofs/{proof_id}/verify/:
    post:
      tags:
        - Travel Rule
      summary: Nachweis zum Wallet-Eigentum übermitteln
      description: >-
        Öffentlicher Endpoint, über das Widget-Sitzungs-Token adressiert, kein
        API-Schlüssel erforderlich. Senden Sie die Nachweise, die die Methode
        des Proofs erfordert: Signatur für MESSAGE_SIGNING, txid für
        SATOSHI_TEST (JSON) oder eine Datei für SCREENSHOT (multipart). Jede
        Übermittlung zählt als Versuch. Eine Anfrage mit einer nicht
        verifizierbaren Signatur oder einer nicht übereinstimmenden Einzahlung
        wird mit 400 und einem Code beantwortet und belässt den Proof auf
        PENDING, damit der Endbenutzer es erneut versuchen kann. Bei einer
        erkannten, aber noch nicht bestätigten Einzahlung wird die Anfrage mit
        200 und dem Status PENDING beantwortet und automatisch erneut geprüft,
        bis das Zeitfenster abläuft. Bei einem Screenshot wird die Anfrage mit
        200 und dem Status PENDING beantwortet und wartet in Ihrer
        Prüf-Warteschlange (GET /v3/travel-rule/wallet-proofs/). Ein EXPIRED
        oder REJECTED Proof wird später niemals verifiziert: Starten Sie einen
        neuen. Verifizierte Signaturformate pro Chain-Familie: EVM-Chains
        akzeptieren eine personal_sign-Signatur (EIP-191), hex-codiert; Bitcoin
        akzeptiert eine BIP-137-signmessage-Signatur (P2PKH-, P2SH-P2WPKH- und
        P2WPKH-Adressen) oder eine einfache BIP-322-Signatur (P2WPKH- und
        P2TR-Adressen), base64-codiert; Solana akzeptiert eine Ed25519-Signatur
        über die Challenge, base58-codiert; Tron akzeptiert eine
        signMessageV2-Signatur (TIP-191), hex-codiert. Eine vollständige
        BIP-322- oder Kapitalnachweis-Signatur oder eine Multisig-Adresse
        schlägt mit SIGNATURE_UNSUPPORTED_SCHEME fehl.
      operationId: verifyTravelRuleWidgetProof
      parameters:
        - name: token
          in: path
          required: true
          description: >-
            Opakes Sitzungs-Token, das zurückgegeben wird, wenn die
            Widget-Sitzung erstellt wurde.
          schema:
            type: string
        - name: proof_id
          in: path
          required: true
          description: proof_id, die beim Starten des Nachweises zurückgegeben wurde.
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                signature:
                  type: string
                  description: >-
                    MESSAGE_SIGNING: die Signatur der Wallet über die Challenge
                    des Nachweises.
                txid:
                  type: string
                  description: 'SATOSHI_TEST: Die Transaktions-ID der Testeinzahlung.'
          multipart/form-data:
            schema:
              type: object
              required:
                - file
              properties:
                file:
                  type: string
                  format: binary
                  description: >-
                    SCREENSHOT: Ein Bild, das die Wallet in der Wallet-App des
                    Endbenutzers zeigt.
      responses:
        '200':
          description: >-
            VERIFIED oder noch PENDING (ein Screenshot, der auf eine Prüfung
            wartet, eine Einzahlung, die noch nicht indexiert oder noch nicht
            bestätigt ist, mit dem Code DEPOSIT_NOT_FOUND oder
            DEPOSIT_UNCONFIRMED).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofVerifyResult'
        '400':
          description: >-
            Fehlender Nachweis; ein fehlgeschlagener Versuch, der den Nachweis
            auf PENDING belässt, damit der Endbenutzer es erneut versuchen kann
            (Code SIGNATURE_INVALID, SIGNATURE_UNSUPPORTED_SCHEME oder
            DEPOSIT_LOOKUP_FAILED); oder eine Testeinzahlung, die den Nachweis
            ablehnt (Code DEPOSIT_MISMATCH, DEPOSIT_STALE oder TXID_REUSED,
            Status REJECTED, mit den Versuchszählern der Sitzung): Die erneute
            Auswahl einer Methode startet einen neuen Nachweis, solange
            attempts_remaining größer als 0 ist.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '404':
          description: >-
            Unbekanntes Token oder kein solcher Nachweis in dieser Sitzung
            vorhanden.
        '409':
          description: >-
            Code OWNERSHIP_CHANGED (der Nachweis wird damit geschlossen); ein
            geschlossener Nachweis (REJECTED oder EXPIRED) mit seinem Status,
            dem Code, mit dem er geschlossen wurde, und den Versuchszahlen der
            Sitzung: Wählen Sie erneut eine Methode, um einen neuen Nachweis zu
            starten; oder ein SELF_DECLARATION-Nachweis, der beim Start
            verifiziert wird.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '410':
          description: >-
            Die Sitzung ist abgelaufen, oder Code WINDOW_EXPIRED, wenn das
            Zeitfenster für den Satoshi-Test geschlossen wurde.
          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: >-
            Vorhanden, wenn der Nachweis VERIFIED ist: Die Eigentümerschaft des
            Adressbucheintrags ist nun verifiziert.
        transfer_status:
          type: string
          nullable: true
          description: >-
            Vorhanden, wenn der Nachweis VERIFIED ist: Status des verknüpften
            Transfers, null ohne Verknüpfung.
        detail:
          type: string
          description: >-
            Vorhanden, solange der Nachweis PENDING bleibt: ein übermittelter
            Screenshot, der auf Prüfung wartet, oder eine Testeinzahlung, die
            noch nicht bestätigt ist.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Vorhanden bei einer ausstehenden Testeinzahlung: Grund, warum sie
            noch nicht bestätigt ist.
    TravelRuleWidgetProofError:
      type: object
      properties:
        detail:
          type: string
          description: Lesbare Nachricht auf Englisch.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Maschinenlesbarer Grund, damit ein Client seine eigene übersetzte
            Nachricht anzeigen kann.
        status:
          type: string
          enum:
            - PENDING
            - VERIFIED
            - REJECTED
            - EXPIRED
          description: >-
            Vorhanden, wenn der Nachweis abgeschlossen ist: REJECTED durch die
            gerade übermittelte Einzahlung (400), oder REJECTED bzw. EXPIRED,
            wenn Nachweise an einen bereits geschlossenen Nachweis gesendet
            werden (409).
        proof_id:
          type: string
          format: uuid
          description: 'Vorhanden bei Status: der geschlossene Nachweis.'
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
          description: 'Vorhanden bei Status: Methode des geschlossenen Nachweises.'
        max_attempts:
          type: integer
          description: >-
            Vorhanden bei Status: abgelehnte Wallet-Nachweise, die diese Sitzung
            zulässt.
        attempts_used:
          type: integer
          description: 'Vorhanden bei Status: bisher abgelehnte Nachweise.'
        attempts_remaining:
          type: integer
          description: >-
            Vorhanden bei Status: Wenn der Wert 0 ist, führt das Starten eines
            weiteren Nachweises zu einer 409-Antwort und Sie erstellen eine neue
            Widget-Sitzung.
    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: >-
        Warum ein Wallet-Eigentumsnachweis oder dessen letzter Versuch VERIFIED
        verfehlt hat. Leer, wenn kein Fehler aufgetreten ist. Ein
        PENDING-Nachweis kann einen Grund enthalten: Der letzte Versuch ist
        fehlgeschlagen und der Endbenutzer kann es erneut versuchen.
        DEPOSIT_MISMATCH, DEPOSIT_STALE, TXID_REUSED und REVIEW_REJECTED
        schließen den Nachweis als REJECTED ab. SIGNATURE_INVALID: Die Signatur
        stimmt nicht mit der Wallet und der Challenge überein.
        SIGNATURE_UNSUPPORTED_SCHEME: Die Wallet hat in einem Format signiert,
        das Didit nicht verifiziert. DEPOSIT_NOT_FOUND, DEPOSIT_UNCONFIRMED,
        DEPOSIT_LOOKUP_FAILED: Die Testeinzahlung ist noch nicht lesbar oder
        noch nicht bestätigt; Didit prüft dies weiter, bis das Testfenster
        schließt. DEPOSIT_MISMATCH: Die Transaktion sendet nicht den erwarteten
        Betrag von der Wallet an die Einzahlungsadresse. DEPOSIT_STALE: Die
        Transaktion liegt zeitlich vor der Challenge. TXID_REUSED: Die
        Transaktion hat bereits eine andere Wallet nachgewiesen.
        CHAIN_UNSUPPORTED: Die Methode ist auf dieser Chain nicht verfügbar.
        WINDOW_EXPIRED: Das Testfenster ist abgelaufen. OWNERSHIP_CHANGED: Der
        Inhaber der Wallet hat sich geändert oder die Wallet wurde nach dem
        Erstellen der Widget-Sitzung aus Ihrem Adressbuch gelöscht.
        METHOD_SWITCHED: Der Endbenutzer hat eine andere Methode gewählt, bevor
        diese abgeschlossen war. REVIEW_REJECTED: Ihr Prüfer hat den Screenshot
        abgelehnt. ABANDONED: Die Widget-Sitzung ist abgelaufen, bevor der
        Endbenutzer fertig war.

````

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