> ## 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 order details

> Returns order details for a given Houdini order ID created in the last 48 hours.

Past that window the order drops out of the API and returns 404, the same as an id that never existed — store whatever you need to keep before then.



## OpenAPI

````yaml https://api-partner.houdiniswap.com/v2/openapi.json get /orders/{houdiniId}
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:
  /orders/{houdiniId}:
    get:
      tags:
        - Private and Standard Swaps
        - Private Send
        - On-chain DEX or Bridge
      summary: Get order details
      description: >-
        Returns order details for a given Houdini order ID created in the last
        48 hours.


        Past that window the order drops out of the API and returns 404, the
        same as an id that never existed — store whatever you need to keep
        before then.
      operationId: GetOrder
      parameters:
        - in: path
          name: houdiniId
          required: true
          schema:
            type: string
            maxLength: 64
          example: hxK7mQp2
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrderV2PublicResponse'
              examples:
                Example 1:
                  value:
                    created: '2026-09-28T02:44:44.178Z'
                    houdiniId: ao5tBEaAxkjJJdZnZeuXo6
                    receiverAddress: 8jZnXYnZB1MJQG6zBXyouzcycsaPTrZtPXPHDNifjYaC
                    status: 0
                    anonymous: false
                    expires: '2026-09-28T03:14:44.178Z'
                    in: se
                    inAmount: 0.05
                    inSymbol: ETH
                    inStatus: 0
                    inCreated: '2026-09-28T02:44:44.178Z'
                    outAmount: 1.09202632
                    outSymbol: SOL
                    eta: 8
                    inAmountUsd: 132.6355
                    isDex: false
                    swapName: StealthEx
                    depositAddress: '0x0000000000000000000000000000000000000000'
                    id: 6ab9d49ca4f8db2c6ce6dfb2
                    hashUrl: ''
                    statusLabel: WAITING
                    inStatusLabel: NEW
                    displayStatus: WAITING_FOR_DEPOSIT
        '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: Order 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:
    OrderV2PublicResponse:
      properties:
        fixed:
          type: boolean
          description: True when the order settled at a locked rate.
        refundAddress:
          type: string
          description: Refund address recorded for this order.
        houdiniId:
          type: string
          description: Public order id. Use it with Get order details.
        depositTag:
          type: string
          description: >-
            Memo/tag that must be sent with the deposit, on chains that use one
            (XRP, TON, Stellar, …).


            Show it to your user next to `depositAddress` — a deposit sent
            without it may not be credited.
        expires:
          type: string
          format: date-time
          description: >-
            Deposit deadline — send the funds by this time or the order expires.
            Not a rate lock.
        displayStatus:
          $ref: '#/components/schemas/DisplayStatus'
          description: >-
            Human-readable state for your UI, derived from `status` and the leg
            statuses. Prefer this over `status`.
        status:
          $ref: '#/components/schemas/OrderStatus'
          description: >-
            Numeric order state. For anything user-facing prefer
            `displayStatus`.


            - `-2` initializing

            - `-1` created

            - `0` waiting for your deposit

            - `1` confirming your deposit

            - `2` exchanging

            - `3` anonymizing — private swaps only

            - `4` finished

            - `5` expired

            - `6` failed

            - `7` refunded

            - `8` deleted
        eta:
          type: number
          format: double
          description: ETA time, depending on swap
        inAmount:
          type: number
          format: double
          description: Amount to deposit, in the input token.
        inSymbol:
          type: string
          description: Symbol of the input token, e.g. `BTC`.
        outAmount:
          type: number
          format: double
          description: Amount you receive, in the output token.
        outSymbol:
          type: string
          description: Symbol of the output token, e.g. `ETH`.
        inAmountUsd:
          type: number
          format: double
          description: USD value of the input amount at order creation time.
        outAmountUsd:
          type: number
          format: double
          description: '`outAmount` valued in USD.'
        inToken:
          $ref: '#/components/schemas/Token'
          description: Token you sent.
        outToken:
          $ref: '#/components/schemas/Token'
          description: Token you received.
        receiverAddress:
          type: string
          description: Wallet the payout is sent to.
        anonymous:
          type: boolean
          description: True when this order took the private two-leg route.
        isDex:
          type: boolean
          description: True when the order executed on a DEX route.
        nonRefundable:
          type: boolean
          description: True when the deposit can no longer be refunded.
        actionRequired:
          type: boolean
          description: >-
            True when the order failed but your deposit had already arrived —
            contact support to recover the funds.
        rerouted:
          type: boolean
          description: >-
            True when the route that executed is not the one that was quoted,
            because the quoted route failed and a fallback was used. The amounts
            may differ from the quote — compare `inAmount` against
            `quotedInAmount` and `outAmount` against `quotedOutAmount`.
        quotedInAmount:
          type: number
          format: double
          description: >-
            The deposit amount originally quoted, present only when the order
            was rerouted. `inAmount` is what the fallback route actually asks
            for; on an exact-out order this is the side that moves.
        quotedOutAmount:
          type: number
          format: double
          description: >-
            The payout originally quoted, present only when the order was
            rerouted. `outAmount` is what the fallback route will actually pay;
            on an exact-in order this is the side that moves.
        refundHash:
          type: string
          description: >-
            Hash of the transaction that returned your funds. Absent unless the
            order refunded.
        refundChain:
          type: string
          description: >-
            Chain the refund was returned on, e.g. "bsc". Refunds are returned
            on the input chain.
        refundAmount:
          type: number
          format: double
          description: >-
            Amount returned to you, after the provider's refund fee. Absent when
            the exchange did not report one.
        inStatus:
          $ref: '#/components/schemas/Status'
          description: >-
            Progress of the incoming leg — your deposit reaching the provider.
            For reference and debugging; drive your UI from `displayStatus`
            instead.


            - `0` created

            - `1` waiting for the deposit

            - `2` deposit seen, waiting for confirmations

            - `3` exchanging

            - `4` sending funds on

            - `5` finished

            - `6` failed

            - `7` refunded

            - `8` on hold for a compliance check

            - `9` expired — no deposit arrived in time

            - `10` finished through a fallback payout
        created:
          type: string
          format: date-time
        modified:
          type: string
          format: date-time
        inCreated:
          type: string
          format: date-time
          description: When the incoming leg was created.
        notified:
          type: boolean
        id:
          type: string
        metadata:
          description: Extra data from the provider. The shape depends on the route.
        receiverTag:
          type: string
          nullable: true
          description: Memo/tag required when receiving funds for assets that use one
        swapName:
          type: string
          description: >-
            Name of the exchange handling the deposit leg. Omitted on private
            orders, which withhold the provider, and on multiswap orders that
            have not yet been assigned one.
        multiId:
          type: string
          description: Multi ID. Present only on orders created as part of a batch.
        outStatus:
          $ref: '#/components/schemas/Status'
          description: >-
            Status of the payout leg. Present only on private orders — public
            orders settle in a single leg and never carry one. For reference and
            debugging; drive your UI from `displayStatus` instead.


            - `0` created

            - `1` waiting for the deposit

            - `2` deposit seen, waiting for confirmations

            - `3` exchanging

            - `4` sending funds on

            - `5` finished

            - `6` failed

            - `7` refunded

            - `8` on hold for a compliance check

            - `9` expired — no deposit arrived in time

            - `10` finished through a fallback payout
        outTransactionOutHash:
          type: string
          description: >-
            Payout transaction hash of the second leg. Present only on private
            orders, and only once that leg has paid out. Public orders report
            their payout hash on `inTransactionOutHash` instead.
        orderFinishedReceived:
          type: string
          format: date-time
          description: >-
            When the order reached a final state. Stamped only when an order
            finishes — orders that expire, fail or refund never receive one.
        depositAddress:
          type: string
          description: >-
            The deposit address where the user must send funds. Omitted on
            multiswap orders whose per-order setup did not complete.
      required:
        - houdiniId
        - expires
        - displayStatus
        - status
        - eta
        - inAmount
        - inSymbol
        - outAmount
        - outSymbol
        - inAmountUsd
        - outAmountUsd
        - inToken
        - outToken
        - receiverAddress
        - anonymous
        - isDex
        - actionRequired
        - inStatus
        - created
        - inCreated
        - notified
        - id
      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
    DisplayStatus:
      description: >-
        Human-readable order state, derived from `status` and the per-leg
        statuses. Use this to drive your UI.


        - `WAITING_FOR_DEPOSIT` — waiting for your deposit to arrive

        - `DEPOSIT_DETECTED` — deposit seen, waiting for confirmations

        - `EXCHANGE_IN_PROGRESS` — the swap is running

        - `SENDING_TO_INTERMEDIARY` — private only: first leg on its way to the
        bridge token

        - `REACHED_INTERMEDIARY` — private only: first leg done

        - `INITIATING_SECOND_EXCHANGE` — private only: second leg starting

        - `SECOND_EXCHANGE_IN_PROGRESS` — private only: second leg running

        - `SENDING_TO_RECEIVER` — payout on its way to `receiverAddress`

        - `SWAP_COMPLETED` — finished

        - `EXPIRED` — no deposit arrived before `expires`

        - `FAILED` — the swap could not complete; check `actionRequired`

        - `REFUNDED` — funds returned to `refundAddress`

        - `DELETED` — order removed
      enum:
        - WAITING_FOR_DEPOSIT
        - DEPOSIT_DETECTED
        - EXCHANGE_IN_PROGRESS
        - SENDING_TO_INTERMEDIARY
        - REACHED_INTERMEDIARY
        - INITIATING_SECOND_EXCHANGE
        - SECOND_EXCHANGE_IN_PROGRESS
        - SENDING_TO_RECEIVER
        - SWAP_COMPLETED
        - EXPIRED
        - FAILED
        - REFUNDED
        - DELETED
      type: string
    OrderStatus:
      description: |-
        - **-2** Order is being initialized (label: INITIALIZING)
        - **-1** Order initialized (label: NEW)
        - **0** Waiting for deposit confirmation (label: WAITING)
        - **1** Deposit is being confirmed (label: CONFIRMING)
        - **2** Exchange is in progress (label: EXCHANGING)
        - **3** Order is going through anonymization (label: ANONYMIZING)
        - **4** Order completed successfully (label: FINISHED)
        - **5** Order has expired (label: EXPIRED)
        - **6** Order failed (label: FAILED)
        - **7** Order was refunded (label: REFUNDED)
        - **8** Order was deleted (label: DELETED)
      enum:
        - -2
        - -1
        - 0
        - 1
        - 2
        - 3
        - 4
        - 5
        - 6
        - 7
        - 8
      type: number
    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
    Status:
      description: |-
        - **0** New swap
        - **1** Waiting for confirmation
        - **2** Being confirmed
        - **3** Exchange in progress
        - **4** Sending to destination
        - **5** Swap completed
        - **6** Swap failed
        - **7** Swap refunded
        - **8** Verifying swap
        - **9** Swap expired
        - **10** Fallback mode
      enum:
        - 0
        - 1
        - 2
        - 3
        - 4
        - 5
        - 6
        - 7
        - 8
        - 9
        - 10
      type: number
    FieldErrors:
      properties: {}
      type: object
      additionalProperties:
        properties:
          value: {}
          message:
            type: string
        required:
          - message
        type: object
    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
    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.