> ## 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-Verifizierung per API: Widget-Sitzung erstellen

> Didit: Widget-Sitzung erstellen, in der Kunden Wallet-Kontrolle per Nachrichtensignatur, Satoshi-Test, Screenshot oder Selbstauskunft nachweisen.



Mint-Prompt für die API für Widget-Sitzungen zur Wallet-Eigentümerstruktur
        Prompt in die Zwischenablage kopieren



      
      

\<pre>

\`Mint a hosted wallet-ownership widget session so a customer can prove control of a crypto wallet - to advance a Travel Rule transfer out of UNCONFIRMED_OWNERSHIP, or to pre-verify a wallet before any transfer exists.

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

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

You rarely need this call: with auto_wallet_verification on (the default), Didit auto-mints a widget session at transaction creation whenever a transfer needs end-user proof, and returns it in the transaction's action_required block. Mint manually for pre-verification or when auto_wallet_verification is off.

Request body (application/json):
\{
"wallet_address": "0x8ba1f109551bD432803012645Ac136ddd64DBA72",   // the wallet to verify
"chain": "ETH",                               // chain identifier (ETH, BTC, SOL, TRX, ...); use the same token your transfers carry
"holder_name": "Ana Diaz",                    // used for the beneficiary name match
"vendor_data": "user-042",                    // your internal id, carried onto the address-book entry
"transaction_id": "<didit-transaction-uuid>", // optional: transfer to advance when the proof verifies
"satoshi_deposit_address": "",                // optional: a deposit address you control - enables the SATOSHI_TEST method
"callback_url": "https://yourapp.example/wallet-verified",  // optional: where the widget returns the customer
"expires_in_minutes": 60                      // optional; auto-extended to cover the Satoshi test window
}

When the customer starts a proof, Didit saves the wallet to your address book with this chain (or reuses the entry with the same address and chain).
Address-book matching is chain-scoped and does not translate names ("ethereum" does not match "ETH"), so pass the same chain token your transfers carry.

What to read from the response:
\- url - send your customer there, verbatim (never construct it yourself). Open it in a real browser or the SDK modal - NEVER an embedded mobile webview (wallet deep links cannot escape a webview).
\- widget_session_id, token, expires_at.

Proof methods offered (depending on settings and mint parameters):
\- MESSAGE_SIGNING - when chain is an EVM, Solana, Bitcoin or Tron chain.
Signing works with wallets installed in the customer's browser, discovered in the page (EIP-6963 / Wallet Standard).
Pairing a mobile wallet app (for example by scanning a QR code) is not available in production today.
\- SATOSHI_TEST - a micro-deposit, offered when you pass satoshi_deposit_address and chain is an EVM, Solana or Bitcoin chain.
\- SCREENSHOT - if allow_screenshot_proof.
\- SELF_DECLARATION - if allow_self_declaration.

Detect completion:
\- Poll GET /v3/travel-rule/widget/{token}/ (completed_at becomes non-null), or
\- Subscribe to travel_rule.status.updated webhooks when the session is linked to a transfer.

Failure modes:
\- 400 - callback_url is not an absolute http(s) URL ({"callback_url": ["callback_url must be an absolute http(s) URL."]}), expires_in_minutes is outside 5 to 10080, transaction_id is not a UUID, or a field is longer than its limit.
\- 404 - transaction_id does not name a Travel Rule transfer in this application.
\- Minting does not check wallet_address against the linked transfer, but every proof on a linked session must use the transfer's counterparty wallet, otherwise starting the proof returns 400.

Full guide: /transaction-monitoring/wallet-ownership-widget.`

\</pre>



      
      

Einfügen in



## OpenAPI

````yaml de/openapi-25.json POST /v3/travel-rule/widget-session/
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-session/:
    post:
      tags:
        - Travel Rule
      summary: Widget-Sitzung zum Nachweis der Wallet-Inhaberschaft erstellen
      description: >-
        Erstellen Sie eine gehostete Widget-URL/einen Token für den
        Wallet-Eigentumsnachweis. Leiten Sie den Kunden an die zurückgegebene
        URL weiter, um die Kontrolle über eine Wallet nachzuweisen (Signieren
        von Nachrichten, Satoshi-Test, Screenshot oder Eigenerklärung). Das
        Widget ist in diesem Release rein webbasiert - öffnen Sie die URL im
        Systembrowser oder einem Custom Tab, niemals innerhalb einer Webview
        eines mobilen SDKs.
      operationId: createTravelRuleWidgetSession
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleWidgetSessionCreate'
            example:
              wallet_address: '0xd3b62acb76fb27a7f8961ec40fa11746b113aca9'
              chain: ETH
              holder_name: Jane Doe
              vendor_data: user-042
              transaction_id: 99999999-aaaa-bbbb-cccc-dddddddddddd
              expires_in_minutes: 60
      responses:
        '201':
          description: Die erstellte Widget-Sitzung.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetSessionResponse'
        '400':
          description: >-
            Ungültiger Body: `callback_url` ist keine absolute http(s)-URL,
            `expires_in_minutes` liegt außerhalb von 5 bis 10080,
            `transaction_id` ist keine UUID oder ein Feld überschreitet sein
            Limit.
          content:
            application/json:
              examples:
                Invalid callback_url:
                  value:
                    callback_url:
                      - callback_url must be an absolute http(s) URL.
        '404':
          description: >-
            `transaction_id` bezeichnet keinen Travel-Rule-Transfer in dieser
            Anwendung.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            https://verification.didit.me/v3/travel-rule/widget-session/ \
              -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \
              -d '{"wallet_address":"0xd3b62acb76fb27a7f8961ec40fa11746b113aca9","chain":"ETH","holder_name":"Jane Doe","transaction_id":"99999999-aaaa-bbbb-cccc-dddddddddddd"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.travel_rule.create_widget_session(
                wallet_address="0xd3b62acb76fb27a7f8961ec40fa11746b113aca9",
                chain="ETH",
                holder_name="Jane Doe",
                vendor_data="user-042",
                transaction_id="99999999-aaaa-bbbb-cccc-dddddddddddd",
                expires_in_minutes=60,
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.travelRule.createWidgetSession({
              wallet_address: "0xd3b62acb76fb27a7f8961ec40fa11746b113aca9",
              chain: "ETH",
              holder_name: "Jane Doe",
              vendor_data: "user-042",
              transaction_id: "99999999-aaaa-bbbb-cccc-dddddddddddd",
              expires_in_minutes: 60,
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.CreateWidgetSession(ctx, didit.TravelRuleWidgetSessionCreate{\n\tWalletAddress:    didit.String(\"0xd3b62acb76fb27a7f8961ec40fa11746b113aca9\"),\n\tChain:            didit.String(\"ETH\"),\n\tHolderName:       didit.String(\"Jane Doe\"),\n\tVendorData:       didit.String(\"user-042\"),\n\tTransactionID:    didit.String(\"99999999-aaaa-bbbb-cccc-dddddddddddd\"),\n\tExpiresInMinutes: didit.Int(60),\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.TravelRuleWidgetSessionCreate;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.travelRule().createWidgetSession(TravelRuleWidgetSessionCreate.builder()
                    .walletAddress("0xd3b62acb76fb27a7f8961ec40fa11746b113aca9")
                    .chain("ETH")
                    .holderName("Jane Doe")
                    .vendorData("user-042")
                    .transactionId("99999999-aaaa-bbbb-cccc-dddddddddddd")
                    .expiresInMinutes(60L)
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->travelRule->createWidgetSession([
                'wallet_address' => '0xd3b62acb76fb27a7f8961ec40fa11746b113aca9',
                'chain' => 'ETH',
                'holder_name' => 'Jane Doe',
                'vendor_data' => 'user-042',
                'transaction_id' => '99999999-aaaa-bbbb-cccc-dddddddddddd',
                'expires_in_minutes' => 60,
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.travel_rule.create_widget_session(
              wallet_address: "0xd3b62acb76fb27a7f8961ec40fa11746b113aca9",
              chain: "ETH",
              holder_name: "Jane Doe",
              vendor_data: "user-042",
              transaction_id: "99999999-aaaa-bbbb-cccc-dddddddddddd",
              expires_in_minutes: 60
            )
            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.TravelRule.CreateWidgetSessionAsync(new
            TravelRuleWidgetSessionCreate

            {
                WalletAddress = "0xd3b62acb76fb27a7f8961ec40fa11746b113aca9",
                Chain = "ETH",
                HolderName = "Jane Doe",
                VendorData = "user-042",
                TransactionId = "99999999-aaaa-bbbb-cccc-dddddddddddd",
                ExpiresInMinutes = 60,
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleWidgetSessionCreate:
      type: object
      properties:
        wallet_address:
          type: string
          description: >-
            Die zu verifizierende Adresse. Optional; wenn leer, muss die Adresse
            angegeben werden, sobald ein Nachweis gestartet wird.
          maxLength: 128
        chain:
          type: string
          description: >-
            Chain-Token für die Adresse, zum Beispiel `ETH`, `BTC` oder `SOL`.
            Verwenden Sie dasselbe Token wie in Ihrem Wallet-Adressbuch. Das
            Signieren von Nachrichten und der Satoshi-Test werden nur für eine
            unterstützte Chain angeboten. Der Adressbucheintrag, den der
            Nachweis verifiziert, speichert diesen unter seiner kanonischen
            Kennung (ETH, BTC, SOL, TRX).
          maxLength: 32
        holder_name:
          type: string
          description: >-
            Name des Wallet-Inhabers, der für den Abgleich des
            Begünstigtennamens verwendet wird.
          maxLength: 255
        vendor_data:
          type: string
          description: >-
            Ihre interne Kennung für den Inhaber, die in den erstellten
            Adressbucheintrag übernommen wird.
          maxLength: 255
        transaction_id:
          type: string
          format: uuid
          description: >-
            Optional. Didit-Transaktions-UUID eines Travel-Rule-Transfers, der
            fortgeführt werden soll, wenn der Nachweis verifiziert wird.
          nullable: true
        satoshi_deposit_address:
          type: string
          description: >-
            Optional. Eine von Ihnen kontrollierte Einzahlungsadresse; ihre
            Angabe aktiviert die Nachweismethode SATOSHI_TEST.
          maxLength: 128
        callback_url:
          type: string
          description: >-
            Optional. Absolute http(s)-URL, zu der das Widget den Kunden nach
            Abschluss zurückleitet.
          maxLength: 512
        expires_in_minutes:
          type: integer
          description: >-
            Optional. Gültigkeitsdauer des erstellten Links in Minuten. Wird
            automatisch verlängert, um das Zeitfenster für den Satoshi-Test
            abzudecken, wenn SATOSHI_TEST angeboten wird.
          default: 60
          minimum: 5
          maximum: 10080
    TravelRuleWidgetSessionResponse:
      type: object
      properties:
        widget_session_id:
          type: string
          format: uuid
        token:
          type: string
          description: Opakes Sitzungs-Token, das in die Widget-URL eingebettet ist.
        url:
          type: string
          description: >-
            Die gehostete URL des Wallet-Eigentums-Widgets. Öffnen Sie sie
            unverändert im System-Browser (niemals innerhalb einer mobilen
            SDK-Webview).
        expires_at:
          type: string
          format: date-time
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Der API-Schlüssel Ihrer Anwendung, aus Entwickler -> API-Schlüssel in
        der Business Console. Der Primärschlüssel hat Vollzugriff. Ein benannter
        Schlüssel kann im Geltungsbereich eingeschränkt werden: keine, Lese-
        oder Schreibberechtigung pro Ressource, beschränkt auf bestimmte
        Workflows oder genehmigte Sitzungen, auf eine Liste von IP-Adressen und
        auf ein Ablaufdatum. 401 bedeutet, dass der Schlüssel falsch, widerrufen
        oder abgelaufen ist; 403 bedeutet, dass kein Schlüssel gesendet wurde,
        der Schlüssel keinen Zugriff auf diese Ressource oder Aktion hat oder
        die Anfrage von einer Adresse außerhalb seiner IP-Liste stammte; 404 bei
        einer Sitzungsroute bedeutet, dass die Sitzung außerhalb der Workflows
        oder Status des Schlüssels liegt. Ein Schlüssel ohne Medienzugriff
        erhält Bild-, Video- und PDF-URLs als null, und ein Schlüssel ohne
        Schreibberechtigung für Sitzungen erhält Sitzungslinks und Token als
        null. Siehe https://docs.didit.me/console/api-keys.

````

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