> ## 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 de widget de propiedad de wallet: prueba de control

> Crea con Didit una sesión de widget para probar el control de una wallet cripto: firma de mensaje, test de Satoshi, captura o autodeclaración.



Prompt para la API de creación de sesiones del widget de propiedad de wallet
        Copiar el prompt al portapapeles



      
      

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



      
      

Pegar en



## OpenAPI

````yaml es/openapi-25.json POST /v3/travel-rule/widget-session/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificación de identidad. Autentícate con el encabezado x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/travel-rule/widget-session/:
    post:
      tags:
        - Travel Rule
      summary: Emitir una sesión del widget de propiedad de wallet
      description: >-
        Genera una URL/token del widget alojado de propiedad de wallet. Envía al
        cliente a la url devuelta para que demuestre el control de una wallet
        (firma de mensaje, prueba Satoshi, captura de pantalla o
        autodeclaración). En esta versión, el widget solo funciona en web: abre
        la url en el navegador del sistema o en una pestaña personalizada, nunca
        dentro de un webview de un SDK móvil.
      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: La sesión de widget emitida.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetSessionResponse'
        '400':
          description: >-
            Cuerpo no válido: `callback_url` no es una URL http(s) absoluta,
            `expires_in_minutes` está fuera del rango de 5 a 10080,
            `transaction_id` no es un UUID o un campo supera su límite de
            longitud.
          content:
            application/json:
              examples:
                Invalid callback_url:
                  value:
                    callback_url:
                      - callback_url must be an absolute http(s) URL.
        '404':
          description: >-
            `transaction_id` no corresponde a ninguna transferencia de Travel
            Rule en esta aplicación.
      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: >-
            La dirección de la wallet que se va a verificar. Opcional; si está
            vacía, la dirección debe proporcionarse al iniciar una prueba.
          maxLength: 128
        chain:
          type: string
          description: >-
            Token de cadena de la dirección, por ejemplo `ETH`, `BTC` o `SOL`.
            Usa el mismo token que en tu libreta de direcciones de wallets. La
            firma de mensajes y la prueba de Satoshi solo se ofrecen para una
            cadena compatible. La entrada de la libreta de direcciones que
            verifica la prueba lo almacena con su identificador canónico (ETH,
            BTC, SOL, TRX).
          maxLength: 32
        holder_name:
          type: string
          description: >-
            Nombre del titular de la wallet, que se usa para la coincidencia del
            nombre del beneficiario.
          maxLength: 255
        vendor_data:
          type: string
          description: >-
            Tu identificador interno del titular, que se traslada a la entrada
            de la libreta de direcciones creada.
          maxLength: 255
        transaction_id:
          type: string
          format: uuid
          description: >-
            Opcional. UUID de transacción de Didit de una transferencia de
            Travel Rule que se hace avanzar cuando se verifica la prueba.
          nullable: true
        satoshi_deposit_address:
          type: string
          description: >-
            Opcional. Una dirección de depósito que controlas; al proporcionarla
            se habilita el método de prueba SATOSHI_TEST.
          maxLength: 128
        callback_url:
          type: string
          description: >-
            Opcional. URL absoluta http(s) a la que el widget devuelve al
            cliente después de completar el proceso.
          maxLength: 512
        expires_in_minutes:
          type: integer
          description: >-
            Opcional. Vigencia del enlace generado, en minutos. Se amplía
            automáticamente para cubrir la ventana de la prueba Satoshi cuando
            se ofrece SATOSHI_TEST.
          default: 60
          minimum: 5
          maximum: 10080
    TravelRuleWidgetSessionResponse:
      type: object
      properties:
        widget_session_id:
          type: string
          format: uuid
        token:
          type: string
          description: Token de sesión opaco incrustado en la URL del widget.
        url:
          type: string
          description: >-
            La URL del widget alojado de propiedad de la wallet. Ábrela tal cual
            en el navegador del sistema (nunca dentro de un webview de un SDK
            móvil).
        expires_at:
          type: string
          format: date-time
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clave de API de tu aplicación, que encontrarás en Developers -> API
        keys en la Business Console. La clave principal tiene acceso completo.
        Una clave con nombre puede tener un alcance limitado: ninguno, lectura o
        escritura por recurso, limitada a algunos flujos o a sesiones aprobadas,
        a una lista de direcciones IP y a una fecha de caducidad. 401 significa
        que la clave es incorrecta, se revocó o expiró; 403 significa que no se
        envió ninguna clave, que la clave no tiene acceso a este recurso o
        acción, o que la solicitud provino de una dirección fuera de su lista de
        IP; 404 en una ruta de sesión significa que la sesión está fuera de los
        flujos o estados de la clave. Una clave sin acceso a contenido
        multimedia recibe las URL de imágenes, videos y PDF como null, y una
        clave sin permiso de escritura en sesiones recibe los enlaces y tokens
        de sesión como null. Consulta https://docs.didit.me/console/api-keys.

````

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