> ## Documentation Index
> Fetch the complete documentation index at: https://docs.iron.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Register a self-hosted wallet address

> Register a wallet that the customer controls directly (i.e. they hold the private key). This is required by the **Travel Rule** before the wallet can be used in **any** flow — onramp, offramp, or swap.

Submit a proof of address ownership. **The message must be in the format**:

> I am verifying ownership of the wallet address [Wallet Address] as customer [CustomerId]. This message was signed on [DD/MM/YYYY] to confirm my control over this wallet.

The signature must be generated using the private key of the wallet address and is just the standard string format of standard ethereum / solana signatures:
## Example message
```ignore
I am verifying ownership of the wallet address GEhVdAGrGFvbAyj9ieZQt43mRAZZu4hRQ5MaKGgvpJMq as customer 7feaf33d-8551-4144-bfcb-01c86bcff857. This message was signed on 20/01/2024 to confirm my control over this wallet.
```
## Example signature
solana signature: 3Z3TWYMhq9vrA6K9ajQMQmVi1aXTmyASGLEvMpzNdS3BdWhNKeQGHtvF6cFNzR96tsnPPocJPjxfVsjtay9iWgTG
evm signature: 0x1234567890abcdef1234567890abcdef12345678900xa5f1751b75a28c12694f02590d29b8cdd68b4f5c783273a75823fc6cfeaa702f1a65fa7c1838ae799fe755c92443cb51631d000922329cdd2ce799eee75f42531babcdef1234567890abcdef




## OpenAPI

````yaml /spec.yaml post /addresses/crypto/selfhosted
openapi: 3.1.0
info:
  description: The Stablecoin Payment Network
  title: Iron API - Sandbox
  version: 1.0-17078
servers:
  - url: https://api.sandbox.iron.xyz/api
security: []
tags:
  - description: >-
      Wallet and bank account registration


      Every wallet address that interacts with Iron must be registered (linked)
      to a customer **before** it can be used in any flow — onramp, offramp, or
      swap. This is a regulatory requirement under the **Travel Rule**, which
      obliges Virtual Asset Service Providers to exchange originator and
      beneficiary information for crypto transfers.


      Iron supports two wallet types:


      - **Self-hosted wallets** — the customer controls the private key.
      Registration requires a signed proof-of-ownership message.

      - **Hosted wallets** — the wallet is custodied by another VASP (e.g.
      Coinbase, Kraken). Registration requires the VASP's DID so Iron can
      exchange travel-rule data with the custodian.


      Similarly, fiat bank accounts must be registered before they can receive
      offramp payouts.
    name: Addresses
  - description: Operations on Autoramp
    name: Autoramp
  - description: Operations on Chronicle collateral
    name: ChronicleCollateral
  - description: Operations on Currencies
    name: Currencies
  - description: Operations on Customers
    name: Customer
  - description: Operations on Exchange Rate
    name: ExchangeRate
  - description: Operations on Fee Profiles
    name: FeeProfiles
  - description: Operations for Sandbox Testing
    name: Sandbox
  - description: Operations on SSE
    name: Sse
  - description: Operations on Terms and Conditions
    name: TermsAndConditions
  - description: Operations on Webhooks
    name: Webhooks
paths:
  /addresses/crypto/selfhosted:
    post:
      tags:
        - Addresses
      summary: Register a self-hosted wallet address
      description: >
        Register a wallet that the customer controls directly (i.e. they hold
        the private key). This is required by the **Travel Rule** before the
        wallet can be used in **any** flow — onramp, offramp, or swap.


        Submit a proof of address ownership. **The message must be in the
        format**:


        > I am verifying ownership of the wallet address [Wallet Address] as
        customer [CustomerId]. This message was signed on [DD/MM/YYYY] to
        confirm my control over this wallet.


        The signature must be generated using the private key of the wallet
        address and is just the standard string format of standard ethereum /
        solana signatures:

        ## Example message

        ```ignore

        I am verifying ownership of the wallet address
        GEhVdAGrGFvbAyj9ieZQt43mRAZZu4hRQ5MaKGgvpJMq as customer
        7feaf33d-8551-4144-bfcb-01c86bcff857. This message was signed on
        20/01/2024 to confirm my control over this wallet.

        ```

        ## Example signature

        solana signature:
        3Z3TWYMhq9vrA6K9ajQMQmVi1aXTmyASGLEvMpzNdS3BdWhNKeQGHtvF6cFNzR96tsnPPocJPjxfVsjtay9iWgTG

        evm signature:
        0x1234567890abcdef1234567890abcdef12345678900xa5f1751b75a28c12694f02590d29b8cdd68b4f5c783273a75823fc6cfeaa702f1a65fa7c1838ae799fe755c92443cb51631d000922329cdd2ce799eee75f42531babcdef1234567890abcdef
      operationId: registerSelfHostedWalletAddress
      parameters:
        - deprecated: false
          description: a UUID ensuring a signature is only processed once
          explode: true
          in: header
          name: IDEMPOTENCY-KEY
          required: true
          schema:
            type: string
        - deprecated: false
          description: >-
            Optional sub-partner UUID, if provided, the wallet address will be
            registered for the sub-partner
          explode: true
          in: header
          name: X-SUB-PARTNER-ID
          required: false
          schema:
            type: string
        - $ref: '#/components/parameters/XApiVersion'
      requestBody:
        content:
          application/json; charset=utf-8:
            schema:
              $ref: '#/components/schemas/RegisterSelfHostedWalletRequest'
        description: The self-hosted wallet registration request
        required: true
      responses:
        '200':
          content:
            application/json; charset=utf-8:
              schema:
                $ref: '#/components/schemas/SelfHostedWalletResponse'
          description: POST Self-Hosted Wallet Succeeded
        '400':
          content:
            application/json; charset=utf-8:
              schema:
                type: string
          description: POST Self-Hosted Wallet Failed (Bad Request)
        '401':
          content:
            application/json; charset=utf-8:
              schema:
                type: string
          description: POST Self-Hosted Wallet Failed (Unauthorized)
        '403':
          content:
            application/json; charset=utf-8:
              schema:
                type: string
          description: >-
            POST Self-Hosted Wallet Failed (Forbidden - e.g. customer is
            suspended)
        '404':
          content:
            application/json; charset=utf-8:
              schema:
                type: string
          description: POST Self-Hosted Wallet Failed (Not Found)
        '409':
          content:
            application/json; charset=utf-8:
              schema:
                type: string
          description: POST Self-Hosted Wallet Failed (Conflict - Address Already Exists)
        '500':
          content:
            application/json; charset=utf-8:
              schema:
                type: string
          description: POST Self-Hosted Wallet Failed (Internal Error)
      security:
        - ApiKeyAuth: []
components:
  parameters:
    XApiVersion:
      description: >-
        Selects the API version for this request, as an ISO date (`YYYY-MM-DD`).
        Omit to use the default version (`2025-03-13`). Supported versions:
        2025-03-13, 2026-07-01.
      in: header
      name: X-API-Version
      required: false
      schema:
        type: string
  schemas:
    RegisterSelfHostedWalletRequest:
      description: >
        Self-hosted wallet registration request


        Proof of wallet ownership to register a self-hosted wallet for Travel
        Rule compliance
      properties:
        address:
          description: The address of the wallet
          type: string
        blockchain:
          $ref: '#/components/schemas/Blockchain'
        customer_id:
          description: The customer ID
          format: uuid
          type: string
        message:
          description: The message that was signed
          type: string
        name:
          description: Optional display name for this wallet address
          type: string
        signature:
          description: The signature of the message
          type: string
      required:
        - blockchain
        - customer_id
        - address
        - signature
        - message
      title: RegisterSelfHostedWalletRequest
      type: object
    SelfHostedWalletResponse:
      description: |
        Self-Hosted Wallet Response

        Response containing self-hosted wallet details
      properties:
        address:
          description: The address that was proven
          type: string
        created_at:
          description: When the wallet was registered
          format: date-time
          type: string
        customer_id:
          description: The customer ID
          type: string
        disabled:
          description: Whether the address is disabled
          type: boolean
        id:
          description: The ID of the self-hosted wallet
          type: string
        name:
          description: Optional display name for this wallet address
          type: string
        signature:
          description: The signature that was submitted
          type: string
      required:
        - id
        - address
        - signature
        - created_at
        - customer_id
        - disabled
      title: SelfHostedWalletResponse
      type: object
    Blockchain:
      description: |
        Blockchain

        A type of blockchain
      enum:
        - Solana
        - Ethereum
        - Polygon
        - Arbitrum
        - Base
        - Stellar
        - Citrea
        - Plasma
        - Avalanche
        - Moca
        - Tempo
        - Tron
        - Bsc
      type: string
  securitySchemes:
    ApiKeyAuth:
      description: API Key
      in: header
      name: X-API-Key
      type: apiKey

````