Surf Wallet API

Inspect any wallet on Ethereum, Base, Solana, and other chains. View token balances, NFT holdings, entity labels, transfer history, full transaction logs, DeFi protocol positions (lending, staking, LP), and net worth trends over time.

OpenAPI Specification

surf-wallet-api-openapi.yml Raw ↑
openapi: 3.1.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. All endpoints use credit-based billing with per-request rate limiting.\n\n## Parameter Naming Conventions\n\nAll endpoints follow a standardized naming scheme. Use these canonical names when calling the API.\n\n### Asset Identification\n\n| Param | Type | Description | Example |\n|-------|------|-------------|---------|\n| `symbol` | string | Uppercase ticker symbol(s), comma-separated | `BTC`, `ETH,SOL` |\n| `q` | string | Free-text search keyword | `bitcoin` |\n| `id` | string | Surf entity UUID for direct lookup | `550e8400-...` |\n| `address` | string | On-chain contract or wallet address. Also accepts ENS names (e.g. `vitalik.eth`) which resolve automatically. | `0xdead...`, `vitalik.eth` |\n\n### Time & Aggregation\n\n| Param | Type | Description | Example |\n|-------|------|-------------|---------|\n| `time_range` | string or int | Lookback window | `7d`, `30d`, `365d`, `max` |\n| `interval` | string | Candlestick / indicator interval | `1h`, `1d`, `1w` |\n| `granularity` | string | Data aggregation granularity | `day`, `block`, `hour` |\n\n### Filtering & Sorting\n\n| Param | Type | Description | Example |\n|-------|------|-------------|---------|\n| `chain` | string | Blockchain name (canonical long-form only) | `ethereum`, `solana`, `base` |\n| `currency` | string | Quote currency | `usd`, `eur`, `btc` |\n| `metric` | string | Metric name (endpoint-specific enum) | `nupl`, `tvl` |\n| `type` | string | Category selector (endpoint-specific enum) | `us-btc-spot` |\n| `sort` | string | Sort direction | `asc`, `desc` |\n\n### Pagination\n\nAll list endpoints support:\n- `limit` (int, default: 20, max: 100) — results per page\n- `offset` (int, default: 0) — pagination offset\n\n### Supported Chains\n\nUse canonical long-form names only. Short aliases (eth, sol, matic, etc.) are **not accepted**.\n\n| Chain | Value |\n|-------|-------|\n| Ethereum | `ethereum` |\n| Polygon | `polygon` |\n| BNB Chain | `bsc` |\n| Solana | `solana` |\n| Avalanche | `avalanche` |\n| Arbitrum | `arbitrum` |\n| Optimism | `optimism` |\n| Fantom | `fantom` |\n| Base | `base` |\n| Linea | `linea` |\n| Cyber | `cyber` |\n\nNot all chains are available on every endpoint. Check each endpoint's `chain` enum for supported values.\n\n## Authentication\n\nAll data endpoints require a Bearer token in the `Authorization` header:\n\n```\nAuthorization: Bearer <API_KEY>\n```\n\n## Error Responses\n\nAll endpoints return errors in a consistent format:\n\n```json\n{\n  \"error\": {\n    \"code\": \"FORBIDDEN\",\n    \"message\": \"insufficient credits\"\n  }\n}\n```\n\n| HTTP Status | Meaning |\n|-------------|---------|\n| `400` | Bad request — invalid or missing parameters |\n| `401` | Unauthorized — missing or invalid API key |\n| `404` | Not found — the requested entity does not exist |\n| `422` | Validation error — parameter value is out of range or invalid |\n| `429` | Rate limited — too many requests, retry after the indicated interval |\n| `502` | Upstream error — a data source is temporarily unavailable |\n\n## Credits\n\nEach API call costs a certain number of credits. The cost is returned in every response under `meta.credits_used`. Check your remaining balance via `GET /v1/me/credit-balance`.\n"
  title: Hermod DEX Wallet API
  version: sha-80d3407
servers:
- url: /
tags:
- description: Inspect any wallet on Ethereum, Base, Solana, and other chains. View token balances, NFT holdings, entity labels, transfer history, full transaction logs, DeFi protocol positions (lending, staking, LP), and net worth trends over time.
  name: Wallet
paths:
  /gateway/v1/wallet/detail:
    get:
      description: 'Returns a wallet''s cross-chain portfolio with selectable sub-resources (balance, tokens, labels, NFTs). Always includes per-chain USD breakdown across 15+ EVM chains.


        **Available fields** (via `fields`): `balance`, `tokens`, `labels`, `nft`.


        **Lookup:** by `address`. Partial failures return available fields with per-field error info. Returns 422 if `fields` is invalid.'
      operationId: wallet-detail
      parameters:
      - description: Wallet address (0x hex for EVM, base58 for Solana)
        explode: false
        in: query
        name: address
        required: true
        schema:
          description: Wallet address (0x hex for EVM, base58 for Solana)
          examples:
          - '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'
          type: string
      - description: 'Chain filter for `tokens`, `nft`, and `approvals`. When omitted, inferred from address format: 0x addresses query all EVM chains, base58 addresses query Solana.'
        explode: false
        in: query
        name: chain
        schema:
          description: 'Chain filter for `tokens`, `nft`, and `approvals`. When omitted, inferred from address format: 0x addresses query all EVM chains, base58 addresses query Solana.'
          enum:
          - ethereum
          - polygon
          - bsc
          - avalanche
          - arbitrum
          - optimism
          - fantom
          - base
          - solana
          examples:
          - ethereum
          type: string
      - description: 'Comma-separated sub-resources to include. Valid: `balance`, `tokens`, `labels`, `nft`, `approvals`. The `active_chains` field is always returned. `approvals` is opt-in (not in default) as it triggers additional upstream calls.'
        explode: false
        in: query
        name: fields
        schema:
          default: balance,tokens,labels,nft
          description: 'Comma-separated sub-resources to include. Valid: `balance`, `tokens`, `labels`, `nft`, `approvals`. The `active_chains` field is always returned. `approvals` is opt-in (not in default) as it triggers additional upstream calls.'
          examples:
          - balance,labels,approvals
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataObjectResponseWalletDetailBody'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Aggregated Wallet Detail
      tags:
      - Wallet
  /gateway/v1/wallet/history:
    get:
      description: 'Returns all on-chain transactions for a wallet, classified by type (send, receive, swap, approve) with native token value. For ERC-20 token transfers with token identity and USD value, use `wallet-transfers` instead.


        **Lookup:** by `address`. Filter by `chain` — supports `ethereum`, `polygon`, `bsc`, `arbitrum`, `optimism`, `avalanche`, `fantom`, `base`.'
      operationId: wallet-history
      parameters:
      - description: Wallet address — must be a raw 0x-prefixed hex address, not an ENS name
        explode: false
        in: query
        name: address
        required: true
        schema:
          description: Wallet address — must be a raw 0x-prefixed hex address, not an ENS name
          examples:
          - '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'
          type: string
      - description: Chain filter. Can be `ethereum`, `polygon`, `bsc`, `avalanche`, `arbitrum`, `optimism`, `fantom`, or `base`.
        explode: false
        in: query
        name: chain
        schema:
          default: ethereum
          description: Chain filter. Can be `ethereum`, `polygon`, `bsc`, `avalanche`, `arbitrum`, `optimism`, `fantom`, or `base`.
          enum:
          - ethereum
          - polygon
          - bsc
          - avalanche
          - arbitrum
          - optimism
          - fantom
          - 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. This feed is cursor-paginated upstream and only the most recent ~1000 transactions are reachable; a larger offset returns an empty page with meta.empty_reason rather than an error. For deep history prefer the `before` cursor — its upstream cost is bounded by `limit` and independent of depth, whereas a large offset is emulated by walking the whole feed.
        explode: false
        in: query
        name: offset
        schema:
          default: 0
          description: Pagination offset. This feed is cursor-paginated upstream and only the most recent ~1000 transactions are reachable; a larger offset returns an empty page with meta.empty_reason rather than an error. For deep history prefer the `before` cursor — its upstream cost is bounded by `limit` and independent of depth, whereas a large offset is emulated by walking the whole feed.
          examples:
          - 0
          format: int64
          minimum: 0
          type: integer
      - description: 'Cursor for efficient deep pagination: return transactions strictly older than this Unix-seconds timestamp (exclusive). Pass the `timestamp` of the last item from the previous page; if items may share a second, pass that timestamp + 1 and de-duplicate on `tx_hash`. Unlike `offset` (which walks the feed), the number of upstream fetches is bounded by `limit` (DeBank returns up to 20 per page) and independent of how far back you page. Mutually exclusive with `offset`.'
        explode: false
        in: query
        name: before
        schema:
          description: 'Cursor for efficient deep pagination: return transactions strictly older than this Unix-seconds timestamp (exclusive). Pass the `timestamp` of the last item from the previous page; if items may share a second, pass that timestamp + 1 and de-duplicate on `tx_hash`. Unlike `offset` (which walks the feed), the number of upstream fetches is bounded by `limit` (DeBank returns up to 20 per page) and independent of how far back you page. Mutually exclusive with `offset`.'
          examples:
          - 1704067200
          format: int64
          minimum: 0
          type: integer
      - description: Field to sort results by. The cursor-paginated upstream feed only supports `timestamp` correctly; unsupported values are rejected by the handler for correctness.
        explode: false
        in: query
        name: sort_by
        schema:
          default: timestamp
          description: Field to sort results by. The cursor-paginated upstream feed only supports `timestamp` correctly; unsupported values are rejected by the handler for correctness.
          enum:
          - timestamp
          - value
          examples:
          - timestamp
          type: string
      - description: Sort order. The cursor-paginated upstream feed only supports `desc` correctly; unsupported values are rejected by the handler for correctness.
        explode: false
        in: query
        name: order
        schema:
          default: desc
          description: Sort order. The cursor-paginated upstream feed only supports `desc` correctly; unsupported values are rejected by the handler for correctness.
          enum:
          - asc
          - desc
          examples:
          - desc
          type: string
      - description: 'Comma-separated enrichments to attach to each item. Currently valid: `labels` — adds `from_label` and `to_label` fields with entity information for each counterparty address.'
        explode: false
        in: query
        name: include
        schema:
          description: 'Comma-separated enrichments to attach to each item. Currently valid: `labels` — adds `from_label` and `to_label` fields with entity information for each counterparty address.'
          examples:
          - labels
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataResponseWalletHistoryItem'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Wallet Transaction History
      tags:
      - Wallet
  /gateway/v1/wallet/labels/batch:
    get:
      description: 'Returns entity labels for multiple wallet addresses.


        Pass up to 100 comma-separated addresses via the `addresses` query parameter.


        **Included fields:** entity name, type, and labels per address.'
      operationId: wallet-labels-batch
      parameters:
      - description: Comma-separated wallet addresses to look up, max 100
        explode: false
        in: query
        name: addresses
        required: true
        schema:
          description: Comma-separated wallet addresses to look up, max 100
          examples:
          - 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045,0xdead
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataResponseWalletLabelItem'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Wallet Labels (Batch)
      tags:
      - Wallet
  /gateway/v1/wallet/net-worth:
    get:
      description: 'Returns a time-series of the wallet''s total net worth in USD.


        Returns ~288 data points at 5-minute intervals covering the last 24 hours. Fixed window — no custom time range supported.


        **Lookup:** by `address` (EVM only — 0x-prefixed hex). Solana addresses are not supported.'
      operationId: wallet-net-worth
      parameters:
      - description: Wallet address — must be a raw 0x-prefixed hex address (EVM only). Solana and ENS names are not supported.
        explode: false
        in: query
        name: address
        required: true
        schema:
          description: Wallet address — must be a raw 0x-prefixed hex address (EVM only). Solana and ENS names are not supported.
          examples:
          - '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataResponseWalletNetWorthPoint'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Wallet Net Worth History
      tags:
      - Wallet
  /gateway/v1/wallet/protocols:
    get:
      description: 'Returns all DeFi protocol positions for a wallet — lending, staking, LP, and farming with token breakdowns and USD values.


        **Lookup:** by `address` (EVM only — 0x-prefixed hex). Solana addresses are not supported.'
      operationId: wallet-protocols
      parameters:
      - description: Wallet address — must be a raw 0x-prefixed hex address, not an ENS name
        explode: false
        in: query
        name: address
        required: true
        schema:
          description: Wallet address — must be a raw 0x-prefixed hex address, not an ENS name
          examples:
          - '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'
          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
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataResponseWalletProtocolItem'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Wallet DeFi Protocol Positions
      tags:
      - Wallet
  /gateway/v1/wallet/transfers:
    get:
      description: 'Returns ERC-20/SPL token transfers with token identity, USD value, and flow direction (in/out). Unlike `wallet-history` which shows all tx types in native value, this focuses on token-level transfer activity.


        Pass the **wallet address** in `address` — returns all ERC-20/SPL token transfers where this wallet is the sender or receiver.


        **Included fields:** token contract, token symbol, amount USD, counterparty, flow direction.


        Filter by specific token or flow direction (in/out).


        **Lookup:** `address` (wallet, raw 0x hex or base58 — ENS not supported). Filter by `chain` — supports `ethereum`, `base`, `bsc`, `arbitrum`, `tron`, `solana`.


        **Data refresh:** ~24 hours · **Chains:** Ethereum, Base, BSC, Arbitrum, Tron (Solana uses a different source with no delay)'
      operationId: wallet-transfers
      parameters:
      - description: Wallet address — must be a raw address (0x-prefixed hex for EVM, base58 for Solana). ENS names like `vitalik.eth` are not supported; resolve to a 0x address first.
        explode: false
        in: query
        name: address
        required: true
        schema:
          description: Wallet address — must be a raw address (0x-prefixed hex for EVM, base58 for Solana). ENS names like `vitalik.eth` are not supported; resolve to a 0x address first.
          examples:
          - '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'
          type: string
      - description: Chain. Can be `ethereum`, `base`, `solana`, `tron`, `bsc`, or `arbitrum`.
        explode: false
        in: query
        name: chain
        schema:
          default: ethereum
          description: Chain. Can be `ethereum`, `base`, `solana`, `tron`, `bsc`, or `arbitrum`.
          enum:
          - ethereum
          - base
          - solana
          - tron
          - bsc
          - arbitrum
          examples:
          - ethereum
          type: string
      - description: Filter by transfer direction relative to the queried wallet. `in` for incoming, `out` for outgoing. Omit for both directions.
        explode: false
        in: query
        name: flow
        schema:
          description: Filter by transfer direction relative to the queried wallet. `in` for incoming, `out` for outgoing. Omit for both directions.
          enum:
          - in
          - out
          examples:
          - in
          type: string
      - description: Filter by token contract address. Use `0x0000000000000000000000000000000000000000` for native token transfers. Omit for all tokens.
        explode: false
        in: query
        name: token
        schema:
          description: Filter by token contract address. Use `0x0000000000000000000000000000000000000000` for native token transfers. Omit for all tokens.
          examples:
          - '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'
          type: string
      - description: 'Results per page. Default 20, max 100. NOTE: Solana (`chain=solana`) is hard-capped at 40 per call by the upstream Solscan API — values above 40 return at most 40 items. Check `meta.has_more` and paginate with `offset` to fetch beyond the first page.'
        explode: false
        in: query
        name: limit
        schema:
          default: 20
          description: 'Results per page. Default 20, max 100. NOTE: Solana (`chain=solana`) is hard-capped at 40 per call by the upstream Solscan API — values above 40 return at most 40 items. Check `meta.has_more` and paginate with `offset` to fetch beyond the first page.'
          examples:
          - 20
          format: int64
          maximum: 100
          minimum: 1
          type: integer
      - description: Pagination offset. For Solana, this maps to Solscan's 1-indexed `page` parameter (page = offset/page_size + 1).
        explode: false
        in: query
        name: offset
        schema:
          default: 0
          description: Pagination offset. For Solana, this maps to Solscan's 1-indexed `page` parameter (page = offset/page_size + 1).
          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 with entity information for each counterparty address.'
        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 with entity information for each counterparty address.'
          examples:
          - labels
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataResponseWalletTransferItem'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Wallet Transfer History
      tags:
      - Wallet
components:
  schemas:
    OffsetMeta:
      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 array is empty, when applicable
          type: string
        has_more:
          description: Whether more items may exist beyond this response. For offset-paged endpoints, continue with a larger offset. For time-series endpoints without offset/cursor controls, true means the requested time range hit an upstream cap; narrow from/to to continue. Omitted when exhaustion cannot be proven.
          type: boolean
        limit:
          description: Maximum number of items returned in this response
          format: int64
          type: integer
        offset:
          description: Number of items skipped (pagination offset)
          format: int64
          type: integer
        total:
          description: Total number of matching items (before pagination). Omitted when total is unknown.
          format: int64
          type: integer
        watermark:
          description: Warehouse watermark (Unix seconds) this response was computed at, on warehouse-backed endpoints (e.g. Hyperliquid /trades/aggregate) — rows up to this time come from the warehouse, newer rows from the live tail. Omitted elsewhere.
          format: int64
          type: integer
      required:
      - limit
      - offset
      - credits_used
      - cached
      type: object
    EvmTokenItem:
      additionalProperties: false
      properties:
        balance:
          description: Decimal-adjusted token balance as a string
          type: string
        chain:
          description: Chain name like ethereum, polygon (EVM only)
          type: string
        is_verified:
          description: Whether the token is verified (EVM only)
          type: boolean
        logo_url:
          description: Token logo image URL
          type: string
        name:
          description: Full token name
          type: string
        price:
          description: Current USD price per token (EVM only)
          format: double
          type: number
        symbol:
          description: Token ticker symbol
          type: string
        token_address:
          description: Token contract address (EVM only)
          type: string
        usd_value:
          description: Total USD value (balance * price) (EVM only)
          format: double
          type: number
      required:
      - token_address
      - symbol
      - balance
      - price
      - usd_value
      - is_verified
      type: object
    DataResponseWalletLabelItem:
      additionalProperties: false
      properties:
        $schema:
          description: A URL to the JSON Schema for this object.
          examples:
          - https://example.com/schemas/DataResponseWalletLabelItem.json
          format: uri
          readOnly: true
          type: string
        data:
          items:
            $ref: '#/components/schemas/WalletLabelItem'
          type:
          - array
          - 'null'
        meta:
          $ref: '#/components/schemas/OffsetMeta'
      required:
      - data
      - meta
      type: object
    ObjectResponseMeta:
      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 array is empty, when applicable
          type: string
      required:
      - credits_used
      - cached
      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
    WalletProtocolPosition:
      additionalProperties: false
      properties:
        balance_usd:
          description: Total USD value of this position
          format: double
          type: number
        borrow_tokens:
          description: Tokens borrowed in this position
          items:
            $ref: '#/components/schemas/WalletProtocolToken'
          type:
          - array
          - 'null'
        lp_tokens:
          description: LP tokens in this position
          items:
            $ref: '#/components/schemas/WalletProtocolToken'
          type:
          - array
          - 'null'
        name:
          description: Position name or type like `Lending` or `Staking`
          type: string
        reward_tokens:
          description: Unclaimed reward tokens in this position
          items:
            $ref: '#/components/schemas/WalletProtocolToken'
          type:
          - array
          - 'null'
        supply_tokens:
          description: Tokens supplied/deposited in this position
          items:
            $ref: '#/components/schemas/WalletProtocolToken'
          type:
          - array
          - 'null'
      required:
      - name
      - balance_usd
      type: object
    DataResponseWalletHistoryItem:
      additionalProperties: false
      properties:
        $schema:
          description: A URL to the JSON Schema for this object.
          examples:
          - https://example.com/schemas/DataResponseWalletHistoryItem.json
          format: uri
          readOnly: true
          type: string
        data:
          items:
            $ref: '#/components/schemas/WalletHistoryItem'
          type:
          - array
          - 'null'
        meta:
          $ref: '#/components/schemas/OffsetMeta'
      required:
      - data
      - meta
      type: object
    WalletDetailBody:
      additionalProperties: false
      properties:
        active_chains:
          description: Chains the wallet has non-zero balances on. Always present (not controlled by fields param). For Solana addresses, returns a single entry.
          items:
            $ref: '#/components/schemas/WalletChainItem'
          type:
          - array
          - 'null'
        approvals:
          description: Token approvals (EVM-only, up to 50). Only present when `approvals` is included in the `fields` param.
          items:
            $ref: '#/components/schemas/WalletApprovalItem'
          type:
          - array
          - 'null'
        errors:
          description: Per-field errors for any fields that failed to load
          items:
            $ref: '#/components/schemas/WalletDetailError'
          type:
          - array
          - 'null'
        evm_balance:
          $ref: '#/components/schemas/EvmBalanceItem'
          description: EVM wallet balance. Populated for EVM chains only.
        evm_tokens:
          description: EVM token holdings (up to 50). Populated for EVM chains only.
          items:
            $ref: '#/components/schemas/EvmTokenItem'
          type:
          - array
          - 'null'
        labels:
          $ref: '#/components/schemas/WalletLabelItem'
          description: Address labels and entity attribution
        nft:
          description: NFT holdings (EVM-only, top 200 by value)
          items:
            $ref: '#/components/schemas/WalletNFTItem'
          type:
          - array
          - 'null'
        sol_balance:
          $ref: '#/components/schemas/SolBalanceItem'
          description: Solana wallet balance from Solscan. Populated for Solana chain only.
        sol_tokens:
          description: Solana SPL token holdings from Solscan (up to 50). Populated for Solana chain only.
          items:
            $ref: '#/components/schemas/SolTokenItem'
          type:
          - array
          - 'null'
      type: object
    WalletNetWorthPoint:
      additionalProperties: false
      properties:
        timestamp:
          description: Unix timestamp in seconds
          format: int64
          type: integer
        usd_value:
          description: Total portfolio value in USD at this point in time
          format: double
          type: number
      required:
      - timestamp
      - usd_value
      type: object
    WalletHistoryItem:
      additionalProperties: false
      properties:
        from_address:
          description: Sender wallet address
          type: string
        from_label:
          $ref: '#/components/schemas/WalletLabelItem'
          description: Entity labels for from_address. Only present when the request sets `include=labels`.
        timestamp:
          description: Unix timestamp in seconds when the transaction was confirmed
          format: int64
          type: integer
        to_address:
          description: Recipient wallet address
          type: string
        to_label:
          $ref: '#/components/schemas/WalletLabelItem'
          description: Entity labels for to_address. Only present when the request sets `include=labels`.
        tx_hash:
          description: Transaction hash
          type: string
        tx_type:
          description: 'Transaction type: `send`, `receive`, `swap`, `approve`, etc.'
          type: string
        value:
          description: Decimal-adjusted transaction value in native token as a string
          type: string
      required:
      - tx_hash
      - from_address
      - to_address
      - value
      - timestamp
      type: object
    DataResponseWalletNetWorthPoint:
      additionalProperties: false
      properties:
        $schema:
          description: A URL to the JSON Schema for this object.
          examples:
          - https://example.com/schemas/DataResponseWalletNetWorthPoint.json
          format: uri
          readOnly: true
          type: string
        data:
          items:
            $ref: '#/components/schemas/WalletNetWorthPoint'
          type:
          - array
          - 'null'
        meta:
          $ref: '#/components/schemas/OffsetMeta'
      required:
      - data
      - meta
      type: object


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