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

# Get token by ID

> Returns a single token by its `id`. Use this to refresh one token you already know, rather than re-fetching the whole list.



## OpenAPI

````yaml https://api-partner.houdiniswap.com/v2/openapi.json get /tokens/{id}
openapi: 3.0.0
info:
  title: Houdini Swap Partner API
  version: 2.1.2
  description: >-
    Quote and execute private, standard, and DEX swaps — one at a time or
    batched.
  license:
    name: ISC
  contact: {}
servers:
  - url: https://api-partner.houdiniswap.com/v2
security: []
tags:
  - name: Private and Standard Swaps
    description: >-
      CEX swaps in two modes, sharing the same endpoints — pick one with the
      `types` parameter.


      - `types=standard` — direct single-leg swap. Fastest, no privacy hop.

      - `types=private` — two legs through a privacy bridge, so deposit and
      payout are not linkable on-chain. Adds `anonymous`, `useXmr`,
      `rotatePayoutWallets` and the `inLeg*` / `outLeg*` filters.


      Flow: [Get tokens](/api-reference/private-and-standard-swaps/get-tokens)
      with `hasCex=true` → [Get
      quotes](/api-reference/private-and-standard-swaps/get-quotes) → [Create
      exchange](/api-reference/private-and-standard-swaps/create-exchange) →
      [track the
      order](/api-reference/private-and-standard-swaps/get-order-details).
      `markup` works in both modes.
  - name: Private Send
    description: >-
      Send a token to another wallet privately — same token in and out, with no
      on-chain link between the two addresses.


      - find eligible tokens with [Get
      tokens](/api-reference/private-send/get-tokens) and `hasSelfPrivate=true`

      - quote with Get private send quote, then create with Create private send
      order

      - you can also stay on the main endpoints with a private same-token
      `quoteId`


      See the [Private send](/docs/v2/private-send) guide.
  - name: Multi-Exchange
    description: >-
      Create and track a group of swaps sharing one `multiId`.


      - post the orders straight to Create multi exchange — there is no quote
      step and no `quoteId`

      - Get multi quotes is optional, for showing rates first

      - each order gets its own deposit address; poll [Get batch
      status](/api-reference/multi-exchange/get-batch-status) for every leg

      - CEX standard and private only — no DEX in a batch


      To fund the whole group in one transaction, see Bundler SOL or Bundler
      EVM. See the [multi-swap
      flow](https://docs.houdiniswap.com/developer-hub/swap-flows/multi-swap)
      for the full sequence.
  - name: Bundler SOL
    description: >-
      Fund a whole multi-exchange group with one Solana batch transfer.


      - one call — Get batch transaction returns the transaction to sign and
      broadcast

      - up to 10 deposits per batch; every order must send the same token

      - find batchable tokens with [Get
      tokens](/api-reference/multi-exchange/get-tokens) and `hasBundler=true`

      - nothing to submit back afterwards — retry and recovery are EVM-only


      See the [multi-swap
      flow](https://docs.houdiniswap.com/developer-hub/swap-flows/multi-swap)
      for the full sequence.
  - name: Bundler EVM
    description: >-
      Fund a whole multi-exchange group with one ERC-4337 UserOperation,
      submitted through the bundler.


      - Ethereum, Base and BNB Smart Chain only; other EVM chains are rejected

      - up to 20 legs per batch; every order must send the same source token

      - find batchable tokens with [Get
      tokens](/api-reference/multi-exchange/get-tokens) and `hasBundler=true`

      - build the UserOp, then submit the signed result

      - if a bundle fails: retry within 30 minutes, or recover stuck assets


      See the [multi-swap
      flow](https://docs.houdiniswap.com/developer-hub/swap-flows/multi-swap)
      for the full sequence.
  - name: On-chain DEX or Bridge
    description: >-
      On-chain swaps signed and funded from the user's own wallet.


      Flow: [Get tokens](/api-reference/on-chain-dex-or-bridge/get-tokens) with
      `hasDex=true` → [Get
      quotes](/api-reference/on-chain-dex-or-bridge/get-quotes) with `types=dex`
      → [Get token approval
      data](/api-reference/on-chain-dex-or-bridge/get-token-approval-data) →
      send it and poll [Check token
      allowance](/api-reference/on-chain-dex-or-bridge/check-token-allowance) →
      [Get next chain
      signature](/api-reference/on-chain-dex-or-bridge/get-next-chain-signature)
      → [Create exchange](/api-reference/on-chain-dex-or-bridge/create-exchange)
      → [Confirm DEX
      transaction](/api-reference/on-chain-dex-or-bridge/confirm-dex-transaction)
      → [track the
      order](/api-reference/on-chain-dex-or-bridge/get-order-details).


      - `slippage` applies to DEX only

      - `markup` is not supported
  - name: Reference Data
    description: >-
      Optional lookups: supported chains, liquidity providers, and per-pair
      min/max swap amounts. Responses are cached and change rarely — safe to
      fetch once and reuse. Token ids come from `/tokens`, listed in each swap
      section above.
  - name: Partner Account
    description: >-
      Your orders, profile, earned commissions, withdrawals, volume analytics,
      and the rate-limit budget attached to your API key. Every endpoint is
      scoped to the partner that owns the key making the request.
  - name: System
    description: >-
      Service health. [Get system
      health](/api-reference/system/get-system-health) is unauthenticated and
      exempt from x402 payment — use it for uptime monitoring.
paths:
  /tokens/{id}:
    get:
      tags:
        - Reference Data
      summary: Get token by ID
      description: >-
        Returns a single token by its `id`. Use this to refresh one token you
        already know, rather than re-fetching the whole list.
      operationId: GetTokenById
      parameters:
        - description: >-
            The token id returned by [Get
            tokens](/api-reference/private-and-standard-swaps/get-tokens)
          in: path
          name: id
          required: true
          schema:
            type: string
            pattern: ^[a-fA-F0-9]{24}$
          example: 6689b73ec90e45f3b3e51558
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Token'
              examples:
                Example 1:
                  value:
                    address: null
                    chain: solana
                    decimals: 9
                    symbol: SOL
                    name: Solana
                    created: '2024-07-06T21:29:34.822Z'
                    modified: '2026-09-16T07:17:14.429Z'
                    chainData:
                      created: '2024-07-06T21:02:11.673Z'
                      modified: '2026-09-14T10:01:00.292Z'
                      name: Solana
                      shortName: solana
                      addressValidation: ^[1-9A-HJ-NP-Za-km-z]{32,44}$
                      tokenAddressValidation: ^[1-9A-HJ-NP-Za-km-z]{32,44}$
                      memoNeeded: false
                      explorerUrl: https://solscan.io/tx/{txHash}
                      addressUrl: https://solscan.io/account/{address}
                      priority: 1
                      kind: sol
                      enabled: true
                      shortNameV1: SOL
                      id: 6689b0d3c52f263938c4484e
                      icon: >-
                        https://api.houdiniswap.com/assets/chains/solana-n1gfe3.png
                    description: >-
                      Solana is a highly functional open source project that
                      banks on blockchain technology’s permissionless nature to
                      provide decentralized finance (DeFi) solutions. It is a
                      layer 1 network that offers fast speeds and affordable
                      costs. While the idea and initial work on the project
                      began in 2017, Solana was officially launched in March
                      2020 by the Solana Foundation with headquarters in Geneva,
                      Switzerland.
                    mainnet: true
                    enabled: true
                    unverified: false
                    hasDex: true
                    hasCex: true
                    hasBundler: true
                    hasSelfPrivate: true
                    cexTokenId: SOL
                    rank: 7
                    cgId: solana
                    marketCapChange24h: -3.76076
                    circulatingSupply: 587064779.4352292
                    price: 97.3
                    marketCap: 56980421616
                    volume: 3952383111
                    fdv: 61546706124
                    change: -3.61639
                    securityScan:
                      provider: blockaid
                      resultType: Unscanned
                      features: []
                      unscannedReason: NATIVE_TOKEN
                      unscannedDetail: SOL has no contract address to scan
                      scannedAt: '2026-09-15T08:23:22.968Z'
                      expiresAt: '2026-09-16T08:23:22.968Z'
                    id: 6689b73ec90e45f3b3e51558
                    icon: https://api.houdiniswap.com/assets/tokens/sol-solana.png
        '401':
          description: >-
            Credentials missing, malformed, or rejected — all return
            `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns
            `PARTNER_ID_NOT_SUPPORTED`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '402':
          description: >-
            Payment required — x402 protocol. The body is empty; what to pay is
            in the `payment-required` header. Not returned when you send an
            `Authorization` header.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/X402PaymentRequired'
          headers:
            payment-required:
              schema:
                type: string
              required: true
        '404':
          description: Token not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '422':
          description: Validation Failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
        '429':
          description: Rate limit exceeded — back off and retry
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - apiKey: []
components:
  schemas:
    Token:
      properties:
        icon:
          type: string
          description: Token icon URL.
        id:
          type: string
          description: The token id. Pass this as `from` / `to` when quoting.
        address:
          type: string
          nullable: true
          description: Contract address. Null for a chain's native coin — see `mainnet`.
        chain:
          type: string
          description: >-
            Chain short name, e.g. `ethereum`. Matches `shortName` on
            `chainData`.
        decimals:
          type: number
          format: double
          description: >-
            On-chain decimals. Amounts in this API are decimals in the token's
            own units, so you only need this for on-chain work.
          default: 0
        symbol:
          type: string
          default: ''
        name:
          type: string
          default: ''
        created:
          type: string
          format: date-time
        modified:
          type: string
          format: date-time
        chainData:
          $ref: '#/components/schemas/Chain'
          description: The chain this token lives on.
        description:
          type: string
          nullable: true
          description: Token description from CoinGecko.
        mainnet:
          type: boolean
          description: >-
            True for the chain's native coin (e.g. ETH on Ethereum), false for
            an issued token (e.g. USDT). Not related to mainnet vs testnet.
        enabled:
          type: boolean
          description: False when the token is temporarily not swappable.
        unverified:
          type: boolean
          description: >-
            True when we have not reviewed this token yet — check `securityScan`
            before using it.
        hasDex:
          type: boolean
          description: True when the token can be swapped on DEX routes.
        hasCex:
          type: boolean
          description: True when the token can be swapped on private and standard routes.
        hasBundler:
          type: boolean
          description: >-
            True when the bundler can fund this token — paying for a whole
            multi-exchange group with one transaction instead of a deposit per
            order. Available on Solana, and on supported EVM chains.
        hasSelfPrivate:
          type: boolean
          description: >-
            True when the token supports self-to-self private swaps — send it
            and receive the same token at another address, with no on-chain
            link.
        cexTokenId:
          type: string
          description: The token's identifier on centralized exchanges.
          default: ''
        rank:
          type: number
          format: double
          nullable: true
          description: CoinGecko market-cap rank. Null when unranked.
        cgId:
          type: string
          nullable: true
          description: CoinGecko id for this token.
        marketCapChange24h:
          type: number
          format: double
          description: 24h market cap change percentage from CoinGecko.
        circulatingSupply:
          type: number
          format: double
          description: Token circulating supply from CoinGecko.
        price:
          type: number
          format: double
          nullable: true
          description: Current price in USD, from CoinGecko.
        marketCap:
          type: number
          format: double
          nullable: true
          description: Market cap in USD, from CoinGecko.
        volume:
          type: number
          format: double
          nullable: true
          description: 24h trading volume in USD, from CoinGecko.
        fdv:
          type: number
          format: double
          nullable: true
          description: Fully diluted valuation in USD, from CoinGecko.
        change:
          type: number
          format: double
          nullable: true
          description: 24h price change, as a percentage.
        priority:
          type: number
          format: double
          nullable: true
          description: Display order — lower sorts first. Unrelated to `rank`.
        warningMessage:
          type: string
          description: Warning to show the user before swapping this token.
        securityScan:
          $ref: '#/components/schemas/TokenSecurityScan'
          description: >-
            Latest security verdict for this token. Absent until the token has
            been used in a swap at least once.
      required:
        - icon
        - id
        - chain
        - created
        - chainData
      type: object
      additionalProperties: false
    ErrorResponse:
      properties:
        message:
          type: string
        code:
          type: string
          description: >-
            Machine-readable reason for the failure. Branch on this, not on
            `message` — messages are free to change.


            The value depends on the HTTP status. The common ones:


            - `400` — `BAD_REQUEST`

            - `401` — `INVALID_API_CREDENTIALS`, `PARTNER_ID_NOT_SUPPORTED`

            - `403` — `ACCESS_DENIED`, `FIXED_RATE_NOT_ALLOWED`

            - `404` — `NOT_FOUND`, `TOKEN_NOT_FOUND`, `TOKEN_DISABLED`

            - `409` — `ALREADY_SUBMITTED`, `STATIC_DEPOSIT_IN_USE`

            - `422` — `VALIDATION_ERROR`, `AMOUNT_TOO_LOW`, `INVALID_SWAP`,
            `FIXED_RATE_QUOTE_EXPIRED`, and most other request problems

            - `429` — `RATE_LIMIT_EXCEEDED`

            - `5xx` — `INTERNAL_SERVER_ERROR`, `PROVIDER_EXCHANGE_FAILED`,
            `SERVICE_UNAVAILABLE`


            New codes are added over time, so treat this as an open set: match
            the ones you handle and fall back to the HTTP status for the rest.
        requestId:
          type: string
          description: >-
            Unique id for this request. Quote it when contacting support — it is
            how we find the failure in our logs.
      required:
        - message
        - code
      type: object
      additionalProperties: false
    X402PaymentRequired:
      description: >-
        Body of a `402 Payment required`. Empty — `{}` — for API clients; a
        request that looks like a browser gets an HTML paywall page instead.


        This is the x402 payment protocol, not the normal error format, so there
        is no `code` or `message` to branch on. What to pay is always in the
        `payment-required` response header, in both cases: base64-encoded JSON
        whose `accepts[]` entries each carry the `network`, the `asset` to pay
        in, the `amount`, and the `payTo` address, alongside `maxTimeoutSeconds`
        and the x402 `scheme`.


        Sending `Authorization` skips the payment flow, so a 402 only reaches
        callers paying per request. An `apiKey` query param also skips it but is
        not a credential — those requests fail with `401
        INVALID_API_CREDENTIALS`.
      properties: {}
      type: object
      additionalProperties: false
    ValidationError:
      properties:
        message:
          type: string
        code:
          type: string
          description: >-
            Machine-readable reason for the failure. Branch on this, not on
            `message` — messages are free to change.


            The value depends on the HTTP status. The common ones:


            - `400` — `BAD_REQUEST`

            - `401` — `INVALID_API_CREDENTIALS`, `PARTNER_ID_NOT_SUPPORTED`

            - `403` — `ACCESS_DENIED`, `FIXED_RATE_NOT_ALLOWED`

            - `404` — `NOT_FOUND`, `TOKEN_NOT_FOUND`, `TOKEN_DISABLED`

            - `409` — `ALREADY_SUBMITTED`, `STATIC_DEPOSIT_IN_USE`

            - `422` — `VALIDATION_ERROR`, `AMOUNT_TOO_LOW`, `INVALID_SWAP`,
            `FIXED_RATE_QUOTE_EXPIRED`, and most other request problems

            - `429` — `RATE_LIMIT_EXCEEDED`

            - `5xx` — `INTERNAL_SERVER_ERROR`, `PROVIDER_EXCHANGE_FAILED`,
            `SERVICE_UNAVAILABLE`


            New codes are added over time, so treat this as an open set: match
            the ones you handle and fall back to the HTTP status for the rest.
        requestId:
          type: string
          description: >-
            Unique id for this request. Quote it when contacting support — it is
            how we find the failure in our logs.
        fields:
          $ref: '#/components/schemas/FieldErrors'
      required:
        - message
        - code
        - fields
      type: object
      additionalProperties: false
    Chain:
      properties:
        icon:
          type: string
          description: Chain icon URL.
        addressValidation:
          type: string
          description: >-
            Regex a wallet address on this chain must match. Use it to validate
            `addressTo` before creating an exchange.
        tokenAddressValidation:
          type: string
          description: Regex a token contract address on this chain must match.
        id:
          type: string
        created:
          type: string
          format: date-time
        modified:
          type: string
          format: date-time
        name:
          type: string
          description: Readable chain name, e.g. `Bitcoin`.
        shortName:
          type: string
          description: >-
            The chain's identifier. Pass this wherever an endpoint takes a
            chain, e.g. `ethereum`.
        memoNeeded:
          type: boolean
          nullable: true
          description: >-
            True when an address on this chain needs a memo or destination tag,
            e.g. XRP or TON. Send it as `destinationTag` for the payout address,
            or `refundExtraId` for the refund address.
        hashUrl:
          type: string
          description: >-
            Explorer link for a transaction hash, when it differs from
            `explorerUrl`.
        explorerUrl:
          type: string
          description: >-
            Template for a transaction link — substitute `{txHash}`, e.g.
            `https://blockchair.com/bitcoin/transaction/{txHash}`.
        addressUrl:
          type: string
          description: >-
            Template for an address link — substitute `{address}`, e.g.
            `https://blockchair.com/bitcoin/address/{address}`.
        priority:
          type: number
          format: double
          description: Display order — lower sorts first.
        kind:
          type: string
          description: >-
            Chain family, e.g. `evm`, `sol`, `bitcoin`, `xmr`, `ltc`. Determines
            the address format and which on-chain steps a DEX swap needs.
        chainId:
          type: number
          format: double
          nullable: true
          description: EVM chain id, e.g. `1` for Ethereum. Null on non-EVM chains.
        enabled:
          type: boolean
          description: False when the chain is temporarily not routing swaps.
        shortNameV1:
          type: string
          description: The chain's name in the v1 API. Use `shortName` instead.
      required:
        - icon
        - addressValidation
        - tokenAddressValidation
        - id
        - created
        - name
        - shortName
        - explorerUrl
        - addressUrl
        - kind
        - enabled
        - shortNameV1
      type: object
      additionalProperties: false
    TokenSecurityScan:
      properties:
        provider:
          type: string
          description: Screening provider that produced this verdict.
        resultType:
          $ref: '#/components/schemas/TokenScanResult'
        providerResultType:
          type: string
          description: >-
            The provider's own `result_type` string, kept unmapped so a verdict
            we don't model yet is still visible to support instead of being
            erased.
        maliciousScore:
          type: number
          format: double
          description: >-
            Provider `malicious_score`, 0..1. Arrives as a string; stored as a
            number.
        features:
          items:
            $ref: '#/components/schemas/TokenScanFeature'
          type: array
          default: []
        unscannedReason:
          $ref: '#/components/schemas/TokenScanUnscannedReason'
        unscannedDetail:
          type: string
          description: >-
            Free-text detail behind `unscannedReason` (provider message,
            status…).
        scannedAt:
          type: string
          format: date-time
        expiresAt:
          type: string
          format: date-time
          description: When this verdict goes stale and the token should be re-scanned.
      required:
        - scannedAt
        - expiresAt
      type: object
      additionalProperties: false
    FieldErrors:
      properties: {}
      type: object
      additionalProperties:
        properties:
          value: {}
          message:
            type: string
        required:
          - message
        type: object
    TokenScanResult:
      description: >-
        Security verdict for a token. Branch on this rather than on `features`.


        - `Benign` — no issues found

        - `Warning` — show a warning before swapping

        - `Malicious` — do not swap

        - `Unscanned` — could not be screened. Screening is fail-open, so this
        never blocks a swap on its own.
      enum:
        - Benign
        - Warning
        - Malicious
        - Unscanned
      type: string
    TokenScanFeature:
      description: >-
        One finding from the security scan, for display only. The list of
        possible findings changes over time, so branch on `resultType` instead.
      properties:
        featureId:
          type: string
        type:
          type: string
          description: >-
            Provider severity for this feature: Malicious | Warning | Benign |
            Info.
        description:
          type: string
      type: object
      additionalProperties: false
    TokenScanUnscannedReason:
      description: >-
        Why a token ended up `UNSCANNED`. Diagnostic only — never a branching
        input.
      enum:
        - NOT_CONFIGURED
        - UNSUPPORTED_CHAIN
        - NATIVE_TOKEN
        - RATE_LIMITED
        - TIMEOUT
        - PROVIDER_ERROR
        - NO_RESULT
        - SCAN_PENDING
        - NOT_A_TOKEN
        - UNKNOWN_RESULT_TYPE
      type: string
  securitySchemes:
    apiKey:
      type: apiKey
      name: Authorization
      in: header
      description: >-
        Send `Authorization: <ApiKey>:<ApiSecret>` — joined by a colon, raw. No
        `Bearer` prefix, no base64.


        [Get your
        credentials](https://docs.houdiniswap.com/developer-hub/getting-started/authentication)

````

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