> ## 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 starten: Travel Rule Widget API

> Starten Sie einen Wallet-Eigentumsnachweis mit Didit per Widget-Sitzungstoken: Nachrichtensignatur, Satoshi-Test, Screenshot oder Selbsterklärung.

Prompt zum Starten der Widget-Proof-API
Prompt in die Zwischenablage kopieren

<pre>
  \`Start a wallet-ownership proof for a widget session. This is the call the hosted widget makes when the end user picks a proof method; use it only if I build my own widget UI.

  Endpoint:
  POST [https://verification.didit.me/v3/travel-rule/widget/\{token}/proofs/](https://verification.didit.me/v3/travel-rule/widget/\{token}/proofs/)

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

  Body:

  * method - one of the context's allowed\_methods: MESSAGE\_SIGNING, SATOSHI\_TEST, SCREENSHOT or SELF\_DECLARATION.
  * wallet\_address, chain - optional, default to the session's.

  Behavior:

  * 201 with a new PENDING proof. MESSAGE\_SIGNING returns the challenge to sign; SATOSHI\_TEST returns deposit\_address, expected\_amount and expires\_at; SELF\_DECLARATION is verified at once.
  * 200 with the proof already open when the same method is picked again (same challenge or amount): resume it, do not treat it as an error.
  * Picking another method closes the unfinished proof as METHOD\_SWITCHED, except a submitted screenshot or a test deposit still being checked.
  * After a REJECTED proof, picking a method starts a new one (201). A session takes a limited number of rejected proofs: the context reports max\_attempts, attempts\_used and attempts\_remaining.
  * Message signing works on EVM chains (Ethereum, BNB Chain, Polygon, Arbitrum, Base, Optimism, Avalanche, Linea and others), Bitcoin (BIP-137 and BIP-322 simple), Solana and Tron.

  Failure modes (errors carry a code to translate):

  * 400 - code CHAIN\_UNSUPPORTED when the method is not available on the chain; also an invalid body or a wallet that does not match the transfer.
  * 403 - SELF\_DECLARATION not allowed for the application.
  * 409 - code OWNERSHIP\_CHANGED: mint a new session for the current holder.
  * 409 - no attempts left (no code; the body carries attempts\_remaining 0): mint a new session.
  * 404 - unknown token. 410 - the session expired.

  Full guide: /transaction-monitoring/wallet-ownership-widget#what-it-proves.\`
</pre>

Einfügen in


## OpenAPI

````yaml de/openapi-25.json POST /v3/travel-rule/widget/{token}/proofs/
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/:
    post:
      tags:
        - Travel Rule
      summary: Einen Wallet-Eigentumsnachweis starten
      description: >-
        Öffentlicher Endpoint, über das Widget-Sitzungs-Token adressiert, kein
        API-Schlüssel erforderlich: Das gehostete Widget ruft ihn auf, wenn der
        Endbenutzer eine Nachweismethode auswählt. Ein Proof existiert und zählt
        erst ab diesem Aufruf in Ihrem Proof-Funnel. Die erneute Auswahl
        derselben Methode gibt den bereits offenen Proof zurück (200, gleiche
        Challenge oder gleicher Einzahlungsbetrag), anstatt einen zweiten zu
        starten; die Auswahl einer anderen Methode schließt den unvollendeten
        als METHOD_SWITCHED, mit Ausnahme eines eingereichten Screenshots oder
        einer noch in Prüfung befindlichen Testeinzahlung. MESSAGE_SIGNING gibt
        die zu signierende Challenge zurück; SATOSHI_TEST die
        Einzahlungsadresse, den genauen Betrag und das Zeitfenster;
        SELF_DECLARATION wird sofort verifiziert (Status VERIFIED). 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: createTravelRuleWidgetProof
      parameters:
        - name: token
          in: path
          required: true
          description: >-
            Opakes Sitzungs-Token, das zurückgegeben wird, wenn die
            Widget-Sitzung erstellt wurde.
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleWidgetProofCreate'
      responses:
        '200':
          description: Der für diese Methode bereits offene Nachweis, wiederaufgenommen.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofSummary'
        '201':
          description: >-
            Ein neuer Nachweis mit Status PENDING (VERIFIED für
            SELF_DECLARATION).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofSummary'
        '400':
          description: >-
            Ungültiger Body, eine Wallet, die nicht zur Übertragung passt,
            SCREENSHOT nicht zulässig oder Code CHAIN_UNSUPPORTED, wenn die
            Methode auf der Chain nicht verfügbar ist.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '403':
          description: SELF_DECLARATION ist für diese Anwendung nicht zulässig.
        '404':
          description: Unbekanntes Token.
        '409':
          description: >-
            Code OWNERSHIP_CHANGED: Der Inhaber der Wallet hat sich geändert
            oder die Wallet wurde gelöscht, nachdem die Sitzung erstellt wurde;
            erstellen Sie eine neue Sitzung für den aktuellen Inhaber. Wird auch
            für SATOSHI_TEST zurückgegeben, wenn die Sitzung keine
            satoshi_deposit_address hat und wenn die Sitzung keine Versuche mehr
            übrig hat (kein Code; der Body enthält max_attempts, attempts_used
            und attempts_remaining 0): erstellen Sie eine neue Sitzung.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '410':
          description: Die Sitzung ist abgelaufen.
      security:
        - {}
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            https://verification.didit.me/v3/travel-rule/widget/{token}/proofs/
            \
              -H 'Content-Type: application/json' \
              -d '{"method": "MESSAGE_SIGNING"}'
components:
  schemas:
    TravelRuleWidgetProofCreate:
      type: object
      required:
        - method
      properties:
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
          description: >-
            Die vom Endbenutzer gewählte Nachweismethode. Sie muss eine der
            allowed_methods des Kontexts sein.
        wallet_address:
          type: string
          maxLength: 128
          description: >-
            Standardmäßig die wallet_address der Sitzung. Muss mit der Wallet
            des Transfers übereinstimmen, wenn die Sitzung mit einem Transfer
            verknüpft ist.
        chain:
          type: string
          maxLength: 32
          description: Standardmäßig die Blockchain der Sitzung.
    TravelRuleWidgetProofSummary:
      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
          description: >-
            PENDING: Der Endbenutzer hat diese Methode ausgewählt und der
            Nachweis ist noch nicht entschieden. Eine fehlgeschlagene Signatur
            oder eine Testeinzahlung, die noch nicht lesbar oder bestätigt ist,
            hält den Nachweis auf PENDING mit einem failure_reason, sodass der
            Endbenutzer es erneut versuchen kann; eine übermittelte
            SATOSHI_TEST-Einzahlung wird automatisch erneut geprüft, bis ihr
            Zeitfenster schließt, und ein übermittelter SCREENSHOT wartet auf
            Ihre Prüfung. VERIFIED: Die Eigentümerschaft ist nachgewiesen.
            REJECTED: Die Testeinzahlung ist definitiv falsch (anderer Absender,
            nicht der erwartete Betrag an die Einzahlungsadresse, älter als die
            Challenge oder eine Transaktion, die bereits eine andere Wallet
            nachgewiesen hat) oder Ihr Prüfer hat den Screenshot abgelehnt;
            failure_reason gibt den Grund an. Ein abgelehnter Nachweis ist
            endgültig und verbraucht einen der Versuche der Sitzung. EXPIRED:
            Über den Nachweis kann nicht mehr entschieden werden (Zeitfenster
            abgelaufen, Endbenutzer hat die Methode gewechselt, Widget-Sitzung
            abgelaufen oder Inhaber der Wallet hat sich geändert);
            failure_reason gibt den Grund an.
        wallet_address:
          type: string
        chain:
          type: string
          description: >-
            Kanonischer Chain-Identifikator des Adressbucheintrags, für den der
            Nachweis bestimmt ist, z. B. ETH, BTC, SOL, TRX.
        deposit_address:
          type: string
          nullable: true
          description: >-
            Einzahlungsadresse, an die der Kunde den Satoshi-Testbetrag senden
            muss. Nur bei einem SATOSHI_TEST-Nachweis vorhanden.
        expected_amount:
          type: string
          nullable: true
          description: >-
            Exakter On-Chain-Betrag in der nativen Währung der Einzahlung, mit
            dem die Satoshi-Test-Einzahlung übereinstimmen muss. Nur bei einem
            SATOSHI_TEST-Nachweis vorhanden.
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Frist für das eigene Satoshi-Testfenster dieses Nachweises. Nur bei
            einem SATOSHI_TEST-Nachweis vorhanden; das eigene expires_at der
            Widget-Sitzung wird verlängert, um dieses abzudecken, wenn
            SATOSHI_TEST angeboten wird.
        challenge:
          type: string
          nullable: true
          description: >-
            Von Didit ausgestellte Nachricht, die der Kunde mit seiner Wallet
            signiert. Nur bei einem MESSAGE_SIGNING-Nachweis vorhanden.
        rejection_reason:
          type: string
          description: >-
            Warum der Nachweis abgelehnt wurde, als englischer Satz für den
            Endbenutzer. Nur vorhanden, wenn `status` REJECTED ist; leer, wenn
            Ihr Prüfer einen Screenshot abgelehnt hat (Ihre Notiz verbleibt bei
            Ihnen).
        created_at:
          type: string
          format: date-time
        attempts:
          type: integer
          description: >-
            Wie oft Nachweise für diesen Beleg übermittelt wurden (Signaturen,
            Transaktions-IDs, Uploads).
        failure_reason:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Warum der letzte Versuch fehlgeschlagen ist oder warum der Nachweis
            geschlossen wurde. Leer, wenn nichts fehlgeschlagen 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.