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

# Search tokens



## OpenAPI

````yaml https://api-partner.houdiniswap.com/v2/openapi.json get /tokens
openapi: 3.0.0
info:
  title: houdiniswap-backend
  version: 2.1.2
  description: Houdiniswap Backend
  license:
    name: ISC
  contact: {}
servers:
  - url: https://api-partner.houdiniswap.com/v2
security: []
paths:
  /tokens:
    get:
      tags:
        - Tokens
      summary: Search tokens
      operationId: GetTokens
      parameters:
        - description: Number of results to return per page
          in: query
          name: pageSize
          required: false
          schema:
            default: 1000
            format: int32
            type: integer
            maximum: 1000
            minimum: 1
        - in: query
          name: page
          required: false
          schema:
            default: 1
            format: int32
            type: integer
            minimum: 1
            maximum: 10000
        - description: >-
            Search term that matches against name, symbol, address, keyword,
            cexTokenId fields
          in: query
          name: term
          required: false
          schema:
            type: string
            maxLength: 100
        - description: >-
            Filter by chain. Matches against token.chainData.shortName, e.g.
            "ethereum"
          in: query
          name: chain
          required: false
          schema:
            type: string
        - description: Filter native/non-native tokens
          in: query
          name: mainnet
          required: false
          schema:
            type: boolean
        - description: Filter tokens that support/don't support CEX swaps
          in: query
          name: hasCex
          required: false
          schema:
            type: boolean
        - description: Filter tokens that support/don't support DEX swaps
          in: query
          name: hasDex
          required: false
          schema:
            type: boolean
        - description: Filter tokens by contract address
          in: query
          name: address
          required: false
          schema:
            type: string
            maxLength: 200
        - description: Filter tokens by symbol, matches against token.symbol field
          in: query
          name: symbol
          required: false
          schema:
            type: string
            maxLength: 20
        - description: >-
            Include tokens that are auto-created from addresses and pending
            manual verification. Excluded by default.
          in: query
          name: unverified
          required: false
          schema:
            type: boolean
            default: false
        - description: Filter tokens that support/don't support private self-to-self swaps
          in: query
          name: hasSelfPrivate
          required: false
          schema:
            type: boolean
        - description: Filter tokens that support/don't support EVM bundle (ERC-4337) swaps
          in: query
          name: hasBundler
          required: false
          schema:
            type: boolean
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TokenSearchResult'
        '422':
          description: Validation Failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - apiKey: []
components:
  schemas:
    TokenSearchResult:
      properties:
        tokens:
          items:
            $ref: '#/components/schemas/Token'
          type: array
        total:
          type: number
          format: double
        totalPages:
          type: number
          format: double
      required:
        - tokens
        - total
        - totalPages
      type: object
      additionalProperties: false
    ValidationError:
      properties:
        message:
          type: string
        code:
          type: string
        requestId:
          type: string
        fields:
          $ref: '#/components/schemas/FieldErrors'
      required:
        - message
        - code
        - fields
      type: object
      additionalProperties: false
    ErrorResponse:
      properties:
        message:
          type: string
        code:
          type: string
        requestId:
          type: string
      required:
        - message
        - code
      type: object
      additionalProperties: false
    Token:
      properties:
        icon:
          type: string
        id:
          type: string
        address:
          type: string
          nullable: true
        chain:
          type: string
        decimals:
          type: number
          format: double
          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:
          type: string
          nullable: true
        mainnet:
          type: boolean
        enabled:
          type: boolean
        unverified:
          type: boolean
        hasDex:
          type: boolean
        hasCex:
          type: boolean
        hasBundler:
          type: boolean
          description: >-
            Indicates whether the token can be used in a bundle (multiswap)
            swap.

            True for CEX-routable Solana tokens, and for EVM native assets plus

            Pimlico-listed ERC-20s on Pimlico-supported chains.
        hasSelfPrivate:
          type: boolean
          description: >-
            Indicates if token supports private (self-to-self) swaps.

            Stored field computed when token is saved.

            True when token has CEX support AND at least 2 enabled CEX swap
            provider mappings.
        cexTokenId:
          type: string
          default: ''
        rank:
          type: number
          format: double
          nullable: true
        cgId:
          type: string
          nullable: true
        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
        marketCap:
          type: number
          format: double
          nullable: true
        volume:
          type: number
          format: double
          nullable: true
        fdv:
          type: number
          format: double
          nullable: true
        change:
          type: number
          format: double
          nullable: true
        priority:
          type: number
          format: double
          nullable: true
        warningMessage:
          type: string
        securityScan:
          $ref: '#/components/schemas/TokenSecurityScan'
          description: >-
            HS-1835: last security verdict for this token, with the provider's
            full

            response and an `expiresAt` driving re-scan. Absent until the token
            has

            been selected as a swap source or destination at least once.
      required:
        - icon
        - id
        - chain
        - created
        - chainData
      type: object
      additionalProperties: false
    FieldErrors:
      properties: {}
      type: object
      additionalProperties:
        properties:
          value: {}
          message:
            type: string
        required:
          - message
        type: object
    Chain:
      properties:
        icon:
          type: string
        addressValidation:
          type: string
        tokenAddressValidation:
          type: string
        id:
          type: string
        created:
          type: string
          format: date-time
        modified:
          type: string
          format: date-time
        name:
          type: string
        shortName:
          type: string
        memoNeeded:
          type: boolean
          nullable: true
        hashUrl:
          type: string
        explorerUrl:
          type: string
        addressUrl:
          type: string
        priority:
          type: number
          format: double
        kind:
          type: string
        chainId:
          type: number
          format: double
          nullable: true
        enabled:
          type: boolean
        shortNameV1:
          type: string
      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: >-
        HS-1835 — normalized verdict for a swap-token security scan.


        Branch on this, never on individual `features` — the provider (Blockaid)

        already aggregates its features into the verdict, and the feature
        catalogue

        changes underneath us (ids get added, renamed and deprecated).


        `UNSCANNED` is the explicit fourth state the ticket calls for: provider

        outage, rate limit, timeout, unsupported chain, missing credentials or a

        verdict string we don't recognise. It always means *fail open* — an
        external

        scanner being unavailable must never block a swap.
      enum:
        - Benign
        - Warning
        - Malicious
        - Unscanned
      type: string
    TokenScanFeature:
      description: >-
        One provider feature. Stored verbatim, with **no allowlist** — Blockaid
        adds,

        renames and deprecates feature ids (INORGANIC_VOLUME is already
        deprecated),

        so hardcoding a subset goes stale. Reference/context for FE copy and
        admin

        visibility only.
      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

````