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

> Returns a paginated list of orders created in the last 48 hours.

Older orders drop out of the API entirely — a `from` date earlier than that is clamped to the window, so keep your own record of anything you need long-term.



## OpenAPI

````yaml https://api-partner.houdiniswap.com/v2/openapi.json get /orders
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:
    get:
      tags:
        - Partner Account
      summary: Get orders
      description: >-
        Returns a paginated list of orders created in the last 48 hours.


        Older orders drop out of the API entirely — a `from` date earlier than
        that is clamped to the window, so keep your own record of anything you
        need long-term.
      operationId: GetOrders
      parameters:
        - description: Page number
          in: query
          name: page
          required: false
          schema:
            default: 1
            format: int32
            type: integer
            minimum: 1
            maximum: 10000
          example: 20
        - description: Page size
          in: query
          name: pageSize
          required: false
          schema:
            default: 100
            format: int32
            type: integer
            minimum: 1
            maximum: 100
          example: 20
        - description: Get all orders from a multi swap
          in: query
          name: multiId
          required: false
          schema:
            type: string
            maxLength: 64
        - description: Order status
          in: query
          name: status
          required: false
          schema:
            type: array
            items:
              $ref: '#/components/schemas/OrderStatus'
        - description: Created from date ISO 8601 format
          in: query
          name: from
          required: false
          schema:
            type: string
            format: date-time
          example: '2026-09-15T00:00:00.000Z'
        - description: Created until date ISO 8601 format
          in: query
          name: to
          required: false
          schema:
            type: string
            format: date-time
          example: '2026-09-16T00:00:00.000Z'
        - description: Sort by field
          in: query
          name: sortBy
          required: false
          schema:
            $ref: '#/components/schemas/OrderSortField'
        - description: Sort order direction
          in: query
          name: sortOrder
          required: false
          schema:
            $ref: '#/components/schemas/SortDirection'
        - description: >-
            Filter by order privacy: true for private (anonymous) orders, false
            for standard orders
          in: query
          name: anonymous
          required: false
          schema:
            type: boolean
          example: true
        - description: >-
            Filter by the token being sent, using an id from [Get
            tokens](/api-reference/private-and-standard-swaps/get-tokens)
          in: query
          name: inTokenId
          required: false
          schema:
            type: string
            pattern: ^[a-fA-F0-9]{24}$
        - description: >-
            Filter by the token being received, using an id from [Get
            tokens](/api-reference/private-and-standard-swaps/get-tokens)
          in: query
          name: outTokenId
          required: false
          schema:
            type: string
            pattern: ^[a-fA-F0-9]{24}$
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedOrdersV2Response'
              examples:
                Example 1:
                  value:
                    orders:
                      - 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
                    total: 1
                    totalPages: 1
        '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
        '403':
          description: Access Denied
          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:
    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
    OrderSortField:
      enum:
        - created
        - updated
        - amount
      type: string
    SortDirection:
      enum:
        - asc
        - desc
      type: string
    PaginatedOrdersV2Response:
      properties:
        orders:
          items:
            $ref: '#/components/schemas/OrderV2PublicResponse'
          type: array
        totalPages:
          type: number
          format: double
        total:
          type: number
          format: double
      required:
        - orders
        - totalPages
        - total
      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
    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
    FieldErrors:
      properties: {}
      type: object
      additionalProperties:
        properties:
          value: {}
          message:
            type: string
        required:
          - message
        type: object
    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
    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
    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.