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

# Mint Wallet-Ownership Widget Session

> Mint a hosted wallet-ownership widget URL/token. Send the customer to the returned url to prove control of a wallet (message signing, Satoshi test, screenshot, or self-declaration). The widget is web-only in this release - open the url in the system browser or a custom tab, never inside a mobile SDK webview.

export const AgentPromptAccordion = ({prompt, title = "AI Agent Integration Prompt"}) => {
  const [copied, setCopied] = React.useState(false);
  const handleCopy = e => {
    e.stopPropagation();
    if (!prompt) return;
    navigator.clipboard.writeText(prompt.trim()).then(() => {
      setCopied(true);
      setTimeout(() => setCopied(false), 2000);
    });
  };
  const agents = ["Claude Code", "Codex", "Cursor", "Devin", "Windsurf", "GitHub Copilot"];
  return <div className="didit-agent-card">
      {}
      <div className="didit-agent-titlebar">
        <div className="didit-agent-dots" aria-hidden="true">
          <span className="didit-agent-dot didit-agent-dot-red"></span>
          <span className="didit-agent-dot didit-agent-dot-yellow"></span>
          <span className="didit-agent-dot didit-agent-dot-green"></span>
        </div>
        <span className="didit-agent-filename">{title}</span>
        <button type="button" className={`didit-agent-copy ${copied ? "didit-agent-copy-copied" : ""}`} onClick={handleCopy} title="Copy prompt to clipboard" aria-label={copied ? "Copied!" : "Copy prompt to clipboard"}>
          {copied ? <>
              <svg width="13" height="13" viewBox="0 0 16 16" fill="none">
                <path d="M3 8.5l3.5 3.5L13 4" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
              </svg>
              <span>Copied</span>
            </> : <>
              <svg width="13" height="13" viewBox="0 0 16 16" fill="none">
                <rect x="5" y="5" width="9" height="9" rx="1.5" stroke="currentColor" strokeWidth="1.5" />
                <path d="M11 5V3.5A1.5 1.5 0 0 0 9.5 2h-6A1.5 1.5 0 0 0 2 3.5v6A1.5 1.5 0 0 0 3.5 11H5" stroke="currentColor" strokeWidth="1.5" />
              </svg>
              <span>Copy</span>
            </>}
        </button>
      </div>

      {}
      <pre className="didit-agent-body"><code>{prompt.trim()}</code></pre>

      {}
      <div className="didit-agent-footer">
        <span className="didit-agent-footer-label">Paste into</span>
        <div className="didit-agent-chips">
          {agents.map(name => <span key={name} className="didit-agent-chip">{name}</span>)}
        </div>
      </div>
    </div>;
};

<AgentPromptAccordion
  title="Mint Wallet-Ownership Widget Session API Prompt"
  prompt={`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": "0xBeneficiaryWallet01",   // the wallet to verify
"chain": "ethereum",                          // chain identifier (ethereum, bitcoin, solana, tron, ...)
"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
}

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 (EVM, Solana, Bitcoin, Tron - browser extension wallets and WalletConnect), SATOSHI_TEST (micro-deposit), 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.

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


## OpenAPI

````yaml POST /v3/travel-rule/widget-session/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: Identity verification API. Authenticate with x-api-key header.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/travel-rule/widget-session/:
    post:
      tags:
        - Travel Rule
      summary: Mint a wallet-ownership widget session
      description: >-
        Mint a hosted wallet-ownership widget URL/token. Send the customer to
        the returned url to prove control of a wallet (message signing, Satoshi
        test, screenshot, or self-declaration). The widget is web-only in this
        release - open the url in the system browser or a custom tab, never
        inside a mobile SDK webview.
      operationId: createTravelRuleWidgetSession
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleWidgetSessionCreate'
            example:
              wallet_address: 0xBeneficiaryWallet01
              chain: ethereum
              holder_name: Ana Diaz
              vendor_data: user-042
              transaction_id: 22222222-3333-4444-5555-666666666666
              expires_in_minutes: 60
      responses:
        '201':
          description: The minted widget session.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetSessionResponse'
      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":"0xBeneficiaryWallet01","chain":"ethereum","holder_name":"Ana Diaz"}'
components:
  schemas:
    TravelRuleWidgetSessionCreate:
      type: object
      required:
        - wallet_address
        - chain
      properties:
        wallet_address:
          type: string
          description: The wallet address to verify.
        chain:
          type: string
          description: >-
            Chain identifier for the address, e.g. "ethereum", "bitcoin",
            "solana".
        holder_name:
          type: string
          description: Name of the wallet holder, used for the beneficiary name match.
        vendor_data:
          type: string
          description: >-
            Your internal identifier for the holder, carried onto the created
            address-book entry.
        transaction_id:
          type: string
          format: uuid
          description: >-
            Optional. Didit transaction UUID of a Travel Rule transfer to
            advance when the proof verifies.
        satoshi_deposit_address:
          type: string
          description: >-
            Optional. A deposit address you control; supplying it enables the
            SATOSHI_TEST proof method.
        callback_url:
          type: string
          description: Optional. Where the widget returns the customer after completion.
        expires_in_minutes:
          type: integer
          description: >-
            Optional. Lifetime of the minted link, in minutes. Automatically
            extended to cover the Satoshi test window when SATOSHI_TEST is
            offered.
    TravelRuleWidgetSessionResponse:
      type: object
      properties:
        widget_session_id:
          type: string
          format: uuid
        token:
          type: string
          description: Opaque session token embedded in the widget URL.
        url:
          type: string
          description: >-
            The hosted wallet-ownership widget URL. Open it verbatim in the
            system browser (never inside a mobile SDK webview).
        expires_at:
          type: string
          format: date-time
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key

````