Surf Token API

Analyze individual tokens on-chain. Look up top holders and their share of supply, track ERC-20/SPL token transfers, browse DEX swap history, and view upcoming token unlock schedules with allocation breakdowns.

Operations 6

GET /gateway/v1/token/dex-trades Token DEX Trade History #
GET /gateway/v1/token/holders Token Holders #
GET /gateway/v1/token/tokenomics Token Unlock Schedule #
GET /gateway/v1/token/transfer-counterparties Top Transfer Counterparties #
GET /gateway/v1/token/transfer-stats Token Transfer Activity Summary #
GET /gateway/v1/token/transfers Token Transfer History #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/surf-token-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

surf-token-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  contact:
    email: backend@cybertinolab.com
    name: Cyber team
  description: Surf data API gateway providing typed endpoints for crypto market data, project analytics, social signals, on-chain queries, and more.
  title: Hermod Token API
  version: sha-80d3407
servers:
- url: /
tags:
- description: Analyze individual tokens on-chain. Look up top holders and their share of supply, track ERC-20/SPL token transfers, browse DEX swap history, and view upcoming token unlock schedules with allocation breakdowns.
  name: Token
paths:
  /gateway/v1/token/dex-trades:
    get:
      description: 'Returns recent DEX swap events for a token contract address.


        **Covered DEXes:** `uniswap`, `sushiswap`, `curve`, `balancer`, `pancakeswap` (and other major DEXes per chain).


        **Included fields:** trading pair, amounts, USD value, taker address.


        **Data refresh:** ~24 hours · **Chains:** Ethereum, Base, BSC, Arbitrum, Tron'
      operationId: token-dex-trades
      parameters:
      - description: Token CONTRACT ADDRESS — 0x-prefixed hex (EVM chains only; Tron also accepts base58 `T...`). This is NOT a ticker symbol (e.g. do NOT pass `USDC` or `BTC`). To resolve a ticker symbol to a contract address, call GET /v1/search/token?q={symbol}&chain={chain} and use the `address` whose `chain` is supported by this endpoint. This endpoint has no `symbol` parameter.
        explode: false
        in: query
        name: address
        required: true
        schema:
          description: Token CONTRACT ADDRESS — 0x-prefixed hex (EVM chains only; Tron also accepts base58 `T...`). This is NOT a ticker symbol (e.g. do NOT pass `USDC` or `BTC`). To resolve a ticker symbol to a contract address, call GET /v1/search/token?q={symbol}&chain={chain} and use the `address` whose `chain` is supported by this endpoint. This endpoint has no `symbol` parameter.
          examples:
          - '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'
          type: string
      - description: Chain. Can be `ethereum`, `base`, `bsc`, `arbitrum`, or `tron`.
        explode: false
        in: query
        name: chain
        schema:
          default: ethereum
          description: Chain. Can be `ethereum`, `base`, `bsc`, `arbitrum`, or `tron`.
          enum:
          - ethereum
          - base
          - bsc
          - arbitrum
          - tron
          examples:
          - ethereum
          type: string
      - description: Results per page
        explode: false
        in: query
        name: limit
        schema:
          default: 20
          description: Results per page
          examples:
          - 20
          format: int64
          maximum: 100
          minimum: 1
          type: integer
      - description: Pagination offset
        explode: false
        in: query
        name: offset
        schema:
          default: 0
          description: Pagination offset
          examples:
          - 0
          format: int64
          minimum: 0
          type: integer
      - description: 'Comma-separated enrichments to attach to each trade. Currently valid: `labels` — adds a `taker_label` field with entity information for the taker address.'
        explode: false
        in: query
        name: include
        schema:
          description: 'Comma-separated enrichments to attach to each trade. Currently valid: `labels` — adds a `taker_label` field with entity information for the taker address.'
          examples:
          - labels
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataResponseDexTradeItem'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Token DEX Trade History
      tags:
      - Token
  /gateway/v1/token/holders:
    get:
      description: 'Returns top token holders for a contract address.


        **Included fields:** wallet address, balance, and percentage.


        **Lookup:** by `address` and `chain`. Supports EVM chains and Solana.'
      operationId: token-holders
      parameters:
      - description: Token CONTRACT ADDRESS — 0x-prefixed hex for EVM chains, base58 for Solana. This is NOT a ticker symbol (e.g. do NOT pass `USDC` or `BTC`). To resolve a ticker symbol to a contract address, call GET /v1/search/token?q={symbol}&chain={chain} and use the `address` whose `chain` is supported by this endpoint. This endpoint has no `symbol` parameter.
        explode: false
        in: query
        name: address
        required: true
        schema:
          description: Token CONTRACT ADDRESS — 0x-prefixed hex for EVM chains, base58 for Solana. This is NOT a ticker symbol (e.g. do NOT pass `USDC` or `BTC`). To resolve a ticker symbol to a contract address, call GET /v1/search/token?q={symbol}&chain={chain} and use the `address` whose `chain` is supported by this endpoint. This endpoint has no `symbol` parameter.
          examples:
          - '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'
          type: string
      - description: Chain. Can be `ethereum`, `polygon`, `bsc`, `solana`, `avalanche`, `arbitrum`, `optimism`, or `base`.
        explode: false
        in: query
        name: chain
        required: true
        schema:
          description: Chain. Can be `ethereum`, `polygon`, `bsc`, `solana`, `avalanche`, `arbitrum`, `optimism`, or `base`.
          enum:
          - ethereum
          - polygon
          - bsc
          - solana
          - avalanche
          - arbitrum
          - optimism
          - base
          examples:
          - ethereum
          type: string
      - description: Results per page
        explode: false
        in: query
        name: limit
        schema:
          default: 20
          description: Results per page
          examples:
          - 20
          format: int64
          maximum: 100
          minimum: 1
          type: integer
      - description: Pagination offset
        explode: false
        in: query
        name: offset
        schema:
          default: 0
          description: Pagination offset
          examples:
          - 0
          format: int64
          minimum: 0
          type: integer
      - description: 'Comma-separated enrichments to attach to each holder. Currently valid: `labels` — adds a full `label` record alongside the flat `entity_name` / `entity_type` fields.'
        explode: false
        in: query
        name: include
        schema:
          description: 'Comma-separated enrichments to attach to each holder. Currently valid: `labels` — adds a full `label` record alongside the flat `entity_name` / `entity_type` fields.'
          examples:
          - labels
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataResponseTokenHolderItem'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Token Holders
      tags:
      - Token
  /gateway/v1/token/tokenomics:
    get:
      description: 'Returns token unlock time-series with cumulative amounts, allocation breakdowns, total supply denominator, and unlocked-supply percentage.


        **Lookup:** by project UUID (`id`) or token `symbol`. Filter by date range with `from`/`to` — defaults to the current calendar month when omitted.


        **Important:** `unlock_amount` is a legacy alias for `cumulative_unlocked_amount`; it is already cumulative at each timestamp and must not be summed across rows. Use `unlocked_percentage_of_total_supply` for the unlock ratio.


        Returns 404 if no token found.'
      operationId: token-tokenomics
      parameters:
      - description: Surf project UUID. PREFERRED — always use this when available from a previous response. Takes priority over symbol.
        explode: false
        in: query
        name: id
        schema:
          description: Surf project UUID. PREFERRED — always use this when available from a previous response. Takes priority over symbol.
          examples:
          - 25c6612a-395c-4974-94eb-3b5f9f4b2ed7
          type: string
      - description: Token symbol like `ARB`, `OP`, or `APT`
        explode: false
        in: query
        name: symbol
        schema:
          description: Token symbol like `ARB`, `OP`, or `APT`
          examples:
          - ARB
          type: string
      - description: Start of time range. Accepts Unix seconds (`1704067200`) or date string (`2024-01-01`)
        explode: false
        in: query
        name: from
        schema:
          description: Start of time range. Accepts Unix seconds (`1704067200`) or date string (`2024-01-01`)
          examples:
          - '2024-01-01'
          type: string
      - description: End of time range. Accepts Unix seconds (`1735689600`) or date string (`2025-01-01`)
        explode: false
        in: query
        name: to
        schema:
          description: End of time range. Accepts Unix seconds (`1735689600`) or date string (`2025-01-01`)
          examples:
          - '2025-01-01'
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataResponseTokenUnlockPoint'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Token Unlock Schedule
      tags:
      - Token
  /gateway/v1/token/transfer-counterparties:
    get:
      description: 'Ranked top counterparties (receivers or senders) of a token over a window — answers "who are the top receivers/senders?".


        **Lookup:** `address` (token contract) + `chain` + `direction` (`to` = top receivers, `from` = top senders). Rank by `metric` (`count`, `amount`, `amount_usd`).


        **Related:** raw rows → `/v1/token/transfers`; aggregate summary → `/v1/token/transfer-stats`.


        **Chains:** Ethereum, Base, BSC, Arbitrum, Tron · **Refresh:** ~24h'
      operationId: token-transfer-counterparties
      parameters:
      - description: Token CONTRACT ADDRESS (0x-hex for EVM; Tron accepts base58 `T...` or 0x-hex). Not a ticker — resolve a symbol via GET /v1/search/token?q={symbol}&chain={chain} and use a returned address whose chain is supported by this endpoint.
        explode: false
        in: query
        name: address
        required: true
        schema:
          description: Token CONTRACT ADDRESS (0x-hex for EVM; Tron accepts base58 `T...` or 0x-hex). Not a ticker — resolve a symbol via GET /v1/search/token?q={symbol}&chain={chain} and use a returned address whose chain is supported by this endpoint.
          examples:
          - '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'
          type: string
      - description: Chain the token contract is deployed on.
        explode: false
        in: query
        name: chain
        required: true
        schema:
          description: Chain the token contract is deployed on.
          enum:
          - ethereum
          - base
          - bsc
          - arbitrum
          - tron
          examples:
          - ethereum
          type: string
      - description: 'Ranking direction: `to` = top receivers, `from` = top senders.'
        explode: false
        in: query
        name: direction
        required: true
        schema:
          description: 'Ranking direction: `to` = top receivers, `from` = top senders.'
          enum:
          - to
          - from
          examples:
          - to
          type: string
      - description: 'Ranking key: `count` = transfer frequency, `amount` = decimal-adjusted token sum, `amount_usd` = USD value sum (USD lags ~3 days; unreliable for recent windows).'
        explode: false
        in: query
        name: metric
        schema:
          default: count
          description: 'Ranking key: `count` = transfer frequency, `amount` = decimal-adjusted token sum, `amount_usd` = USD value sum (USD lags ~3 days; unreliable for recent windows).'
          enum:
          - count
          - amount
          - amount_usd
          type: string
      - description: Look-back window (hard 90d cap).
        explode: false
        in: query
        name: time_range
        schema:
          default: 7d
          description: Look-back window (hard 90d cap).
          enum:
          - 1d
          - 7d
          - 30d
          - 90d
          type: string
      - description: Results per page.
        explode: false
        in: query
        name: limit
        schema:
          default: 20
          description: Results per page.
          format: int64
          maximum: 100
          minimum: 1
          type: integer
      - description: Pagination offset.
        explode: false
        in: query
        name: offset
        schema:
          default: 0
          description: Pagination offset.
          format: int64
          minimum: 0
          type: integer
      - description: Comma-separated enrichments. `labels` attaches an entity label per counterparty.
        explode: false
        in: query
        name: include
        schema:
          description: Comma-separated enrichments. `labels` attaches an entity label per counterparty.
          examples:
          - labels
          type: string
      - description: 'Comma-separated entity categories to drop (best-effort): `cex`, `router`, `amm`, `bridge`. Results may be fewer than `limit` when top counterparties are infrastructure.'
        explode: false
        in: query
        name: exclude_labels
        schema:
          description: 'Comma-separated entity categories to drop (best-effort): `cex`, `router`, `amm`, `bridge`. Results may be fewer than `limit` when top counterparties are infrastructure.'
          examples:
          - cex,router
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataResponseTransferCounterpartyItem'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Top Transfer Counterparties
      tags:
      - Token
  /gateway/v1/token/transfer-stats:
    get:
      description: 'Aggregate transfer-activity summary for a token over a window — total transfers, unique senders/receivers, total amount, first/last activity, and an optional daily series (`include=series`).


        **Lookup:** `address` (token contract) + `chain`.


        **Related:** per-counterparty ranking → `/v1/token/transfer-counterparties`; raw rows → `/v1/token/transfers`.


        **Chains:** Ethereum, Base, BSC, Arbitrum, Tron · **Refresh:** ~24h · USD value lags ~3 days (see `enriched_ratio`).'
      operationId: token-transfer-stats
      parameters:
      - description: Token CONTRACT ADDRESS (0x-hex for EVM; Tron accepts base58 `T...` or 0x-hex). Not a ticker — resolve a symbol via GET /v1/search/token?q={symbol}&chain={chain} and use a returned address whose chain is supported by this endpoint.
        explode: false
        in: query
        name: address
        required: true
        schema:
          description: Token CONTRACT ADDRESS (0x-hex for EVM; Tron accepts base58 `T...` or 0x-hex). Not a ticker — resolve a symbol via GET /v1/search/token?q={symbol}&chain={chain} and use a returned address whose chain is supported by this endpoint.
          examples:
          - '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'
          type: string
      - description: Chain the token contract is deployed on.
        explode: false
        in: query
        name: chain
        required: true
        schema:
          description: Chain the token contract is deployed on.
          enum:
          - ethereum
          - base
          - bsc
          - arbitrum
          - tron
          examples:
          - ethereum
          type: string
      - description: Look-back window (hard 90d cap).
        explode: false
        in: query
        name: time_range
        schema:
          default: 7d
          description: Look-back window (hard 90d cap).
          enum:
          - 1d
          - 7d
          - 30d
          - 90d
          type: string
      - description: Comma-separated extras. `series` adds a daily trend breakdown (volume only).
        explode: false
        in: query
        name: include
        schema:
          description: Comma-separated extras. `series` adds a daily trend breakdown (volume only).
          examples:
          - series
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransferStatsResponse'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Token Transfer Activity Summary
      tags:
      - Token
  /gateway/v1/token/transfers:
    get:
      description: 'Returns recent transfer events **for a specific token** (ERC-20/TRC-20 contract).


        Pass the **token contract address** in `address` — returns every on-chain transfer of that token regardless of sender/receiver.


        **Included fields:** sender, receiver, raw amount, block timestamp.


        Use this to analyze a token''s on-chain activity (e.g. large movements, distribution patterns).


        **Lookup:** `address` (token contract) + `chain`. Sort by `asc` or `desc`.


        **Data refresh:** ~24 hours · **Chains:** Ethereum, Base, BSC, Arbitrum, Tron (Solana uses a different source with no delay)'
      operationId: token-transfers
      parameters:
      - description: Token CONTRACT ADDRESS — 0x-prefixed hex for EVM chains, base58 for Solana. This is NOT a ticker symbol (e.g. do NOT pass `USDC` or `BTC`). To resolve a ticker symbol to a contract address, call GET /v1/search/token?q={symbol}&chain={chain} and use the `address` whose `chain` is supported by this endpoint. This endpoint has no `symbol` parameter.
        explode: false
        in: query
        name: address
        required: true
        schema:
          description: Token CONTRACT ADDRESS — 0x-prefixed hex for EVM chains, base58 for Solana. This is NOT a ticker symbol (e.g. do NOT pass `USDC` or `BTC`). To resolve a ticker symbol to a contract address, call GET /v1/search/token?q={symbol}&chain={chain} and use the `address` whose `chain` is supported by this endpoint. This endpoint has no `symbol` parameter.
          examples:
          - '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'
          type: string
      - description: Chain. Can be `ethereum`, `base`, `solana`, `tron`, `bsc`, or `arbitrum`.
        explode: false
        in: query
        name: chain
        required: true
        schema:
          description: Chain. Can be `ethereum`, `base`, `solana`, `tron`, `bsc`, or `arbitrum`.
          enum:
          - ethereum
          - base
          - solana
          - tron
          - bsc
          - arbitrum
          examples:
          - ethereum
          type: string
      - description: Start of date range. Accepts Unix seconds or YYYY-MM-DD. Defaults to 30 days ago.
        explode: false
        in: query
        name: from
        schema:
          description: Start of date range. Accepts Unix seconds or YYYY-MM-DD. Defaults to 30 days ago.
          examples:
          - '2025-01-01'
          type: string
      - description: End of date range. Accepts Unix seconds or YYYY-MM-DD. Defaults to today.
        explode: false
        in: query
        name: to
        schema:
          description: End of date range. Accepts Unix seconds or YYYY-MM-DD. Defaults to today.
          examples:
          - '2025-03-01'
          type: string
      - description: Results per page
        explode: false
        in: query
        name: limit
        schema:
          default: 20
          description: Results per page
          examples:
          - 20
          format: int64
          maximum: 100
          minimum: 1
          type: integer
      - description: Pagination offset
        explode: false
        in: query
        name: offset
        schema:
          default: 0
          description: Pagination offset
          examples:
          - 0
          format: int64
          minimum: 0
          type: integer
      - description: 'Comma-separated enrichments to attach to each transfer. Currently valid: `labels` — adds `from_label` and `to_label` fields.'
        explode: false
        in: query
        name: include
        schema:
          description: 'Comma-separated enrichments to attach to each transfer. Currently valid: `labels` — adds `from_label` and `to_label` fields.'
          examples:
          - labels
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataResponseTokenTransferItem'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Token Transfer History
      tags:
      - Token
components:
  schemas:
    TransferStatsMeta:
      additionalProperties: false
      properties:
        cached:
          description: Whether this response was served from cache
          type: boolean
        credits_used:
          description: Credits deducted for this request
          format: int64
          type: integer
        empty_reason:
          description: Hint explaining why the data object is empty, when applicable
          type: string
        enriched_ratio:
          description: Fraction of transfers with a USD price (0..1). Low/zero means USD-value fields are partial.
          format: double
          type: number
      required:
      - credits_used
      - cached
      type: object
    DexTradeItem:
      additionalProperties: false
      properties:
        amount_usd:
          description: Trade value in USD at execution time
          format: double
          type: number
        block_time:
          description: Unix timestamp in seconds when the trade was executed
          format: int64
          type: integer
        project:
          description: DEX project name like `uniswap`, `sushiswap`, or `curve`
          type: string
        taker:
          description: Wallet address that initiated the swap
          type: string
        taker_label:
          $ref: '#/components/schemas/WalletLabelItem'
          description: Entity labels for the taker address. Only present when the request sets `include=labels`.
        token_bought_address:
          description: Contract address of the token bought
          type: string
        token_bought_amount:
          description: Amount of tokens bought (decimal-adjusted)
          format: double
          type: number
        token_bought_symbol:
          description: Symbol of the token bought in this trade
          type: string
        token_pair:
          description: Trading pair symbol like `WETH-USDC`
          type: string
        token_sold_address:
          description: Contract address of the token sold
          type: string
        token_sold_amount:
          description: Amount of tokens sold (decimal-adjusted)
          format: double
          type: number
        token_sold_symbol:
          description: Symbol of the token sold in this trade
          type: string
        tx_hash:
          description: Transaction hash
          type: string
        version:
          description: DEX version like `v2` or `v3`
          type: string
      required:
      - block_time
      - project
      - version
      - token_pair
      - token_bought_symbol
      - token_sold_symbol
      - token_bought_amount
      - token_sold_amount
      - amount_usd
      - taker
      - tx_hash
      type: object
    DataAPIErrorDetail:
      additionalProperties: false
      properties:
        code:
          type: string
        message:
          type: string
      required:
      - code
      - message
      type: object
    DataResponseTransferCounterpartyItem:
      additionalProperties: false
      properties:
        $schema:
          description: A URL to the JSON Schema for this object.
          examples:
          - https://example.com/schemas/DataResponseTransferCounterpartyItem.json
          format: uri
          readOnly: true
          type: string
        data:
          items:
            $ref: '#/components/schemas/TransferCounterpartyItem'
          type:
          - array
          - 'null'
        meta:
          $ref: '#/components/schemas/OffsetMeta'
      required:
      - data
      - meta
      type: object
    WalletLabelInfo:
      additionalProperties: false
      properties:
        confidence:
          description: Confidence score 0.0-1.0
          format: double
          type: number
        label:
          description: Human-readable label for this address like `Binance Hot Wallet`
          type: string
      required:
      - label
      type: object
    TokenUnlockPoint:
      additionalProperties: false
      properties:
        allocations:
          description: Breakdown by allocation
          items:
            $ref: '#/components/schemas/TokenUnlockAllocationItem'
          type:
          - array
          - 'null'
        cumulative_unlocked_amount:
          description: Cumulative total tokens unlocked up to this timestamp (decimal-adjusted). Use this for unlocked-supply ratios.
          format: double
          type: number
        timestamp:
          description: Unix timestamp in seconds
          format: int64
          type: integer
        total_supply:
          description: Token total supply used as the denominator for unlocked_percentage_of_total_supply
          format: double
          type: number
        unlock_amount:
          description: Legacy alias for cumulative_unlocked_amount. This is cumulative and must not be summed across rows.
          format: double
          type: number
        unlocked_percentage_of_total_supply:
          description: Cumulative unlocked amount divided by total_supply, expressed as a percentage from 0 to 100
          format: double
          type: number
      required:
      - timestamp
      - unlock_amount
      - cumulative_unlocked_amount
      type: object
    DataAPIError:
      additionalProperties: false
      properties:
        $schema:
          description: A URL to the JSON Schema for this object.
          examples:
          - https://example.com/schemas/DataAPIError.json
          format: uri
          readOnly: true
          type: string
        error:
          $ref: '#/components/schemas/DataAPIErrorDetail'
      required:
      - error
      type: object
    DataResponseTokenHolderItem:
      additionalProperties: false
      properties:
        $schema:
          description: A URL to the JSON Schema for this object.
          examples:
          - https://example.com/schemas/DataResponseTokenHolderItem.json
          format: uri
          readOnly: true
          type: string
        data:
          items:
            $ref: '#/components/schemas/TokenHolderItem'
          type:
          - array
          - 'null'
        meta:
          $ref: '#/components/schemas/OffsetMeta'
      required:
      - data
      - meta
      type: object
    DataResponseTokenTransferItem:
      additionalProperties: false
      properties:
        $schema:
          description: A URL to the JSON Schema for this object.
          examples:
          - https://example.com/schemas/DataResponseTokenTransferItem.json
          format: uri
          readOnly: true
          type: string
        data:
          items:
            $ref: '#/components/schemas/TokenTransferItem'
          type:
          - array
          - 'null'
        meta:
          $ref: '#/components/schemas/OffsetMeta'
      required:
      - data
      - meta
      type: object
    DataResponseTokenUnlockPoint:
      additionalProperties: false
      properties:
        $schema:
          description: A URL to the JSON Schema for this object.
          examples:
          - https://example.com/schemas/DataResponseTokenUnlockPoint.json
          format: uri
          readOnly: true
          type: string
        data:
          items:
            $ref: '#/components/schemas/TokenUnlockPoint'
          type:
          - array
          - 'null'
        meta:
          $ref: '#/components/schemas/OffsetMeta'
      required:
      - data
      - meta
      type: object
    TokenUnlockAllocationItem:
      additionalProperties: false
      properties:
        amount:
          description: Decimal-adjusted allocation amount
          format: double
          type: number
        name:
          description: Allocation name
          type: string
      required:
      - name
      - amount
      type: object
    TransferStatsResponse:
      additionalProperties: false
      properties:
        $schema:
          description: A URL to the JSON Schema for this object.
          examples:
          - https://example.com/schemas/TransferStatsResponse.json
          format: uri
          readOnly: true
          type: string
        data:
          $ref: '#/components/schemas/TransferStatsBody'
        meta:
          $ref: '#/components/schemas/TransferStatsMeta'
      required:
      - data
      - meta
      type: object
    DataResponseDexTradeItem:
      additionalProperties: false
      properties:
        $schema:
          description: A URL to the JSON Schema for this object.
          examples:
          - https://example.com/schemas/DataResponseDexTradeItem.json
          format: uri
          readOnly: true
          type: string
        data:
          items:
            $ref: '#/components/schemas/DexTradeItem'
          type:
          - array
          - 'null'
        meta:
          $ref: '#/components/schemas/OffsetMeta'
      required:
      - data
      - meta
      type: object
    TransferSeriesPoint:
      additionalProperties: false
      properties:
        amount:
          description: Decimal-adjusted token amount transferred on this day.
          type: string
        amount_usd:
          description: Summed USD value for the day. Absent when the day is not yet USD-priced.
          format: double
          type: number
        date:
          description: Start-of-day Unix seconds (UTC).
          format: int64
          type: integer
        enriched_ratio:
          description: Fraction of the day's transfers with a USD price (0..1).
          format: double
          type: number
        transfer_count:
          description: Transfers on this day.
          format: int64
          type: integer
      required:
      - date
      - transfer_count
      - amount
      type: object
    WalletLabelItem:
      additionalProperties: false
      properties:
        address:
          description: Wallet address
          type: string
        entity_name:
          description: Name of the associated entity like `Binance` or `Aave`
          type: string
        entity_type:
          description: Type of entity like `exchange`, `fund`, or `whale`
          type: string
        labels:
          description: List of labels assigned to this address
          items:
            $ref: '#/components/schemas/WalletLabelInfo'
          type:
          - array
          - 'null'
      required:
      - address
      - labels
      type: object
    OffsetMeta:
      additionalProperties: false
      properties:
        cached:
          description: Whether this response was served from c

# --- truncated at 32 KB (38 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/surf/refs/heads/main/openapi/surf-token-api-openapi.yml