Surf Search API

Find anything across Surf's data universe. Search for crypto projects, X (Twitter) accounts and posts, news articles, wallet addresses, web pages, investment funds, airdrop opportunities, and prediction market events — all from a single unified search interface.

OpenAPI Specification

surf-search-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 Search API
  version: sha-80d3407
servers:
- url: /
tags:
- description: Find anything across Surf's data universe. Search for crypto projects, X (Twitter) accounts and posts, news articles, wallet addresses, web pages, investment funds, airdrop opportunities, and prediction market events — all from a single unified search interface.
  name: Search
paths:
  /gateway/v1/search/airdrop:
    get:
      description: 'Searches and filters airdrop opportunities.


        **Filters:** keyword, status, reward type, task type.


        Returns paginated results with optional task details.'
      operationId: search-airdrop
      parameters:
      - description: Search keyword for coin name
        explode: false
        in: query
        name: q
        schema:
          description: Search keyword for coin name
          examples:
          - airdrop
          maxLength: 100
          type: string
      - description: Comma-separated lifecycle phases. `active` = tasks open, can participate (POTENTIAL + CONFIRMED). `claimable` = eligible, can claim (SNAPSHOT + VERIFICATION + REWARD_AVAILABLE). `completed` = done (DISTRIBUTED). Defaults to `active,claimable` to show actionable airdrops.
        explode: false
        in: query
        name: phase
        schema:
          default: active,claimable
          description: Comma-separated lifecycle phases. `active` = tasks open, can participate (POTENTIAL + CONFIRMED). `claimable` = eligible, can claim (SNAPSHOT + VERIFICATION + REWARD_AVAILABLE). `completed` = done (DISTRIBUTED). Defaults to `active,claimable` to show actionable airdrops.
          examples:
          - active
          type: string
      - description: Filter by reward type
        explode: false
        in: query
        name: reward_type
        schema:
          description: Filter by reward type
          enum:
          - airdrop
          - points
          - whitelist
          - nft
          - role
          - ambassador
          examples:
          - airdrop
          type: string
      - description: Filter activities containing tasks of this type
        explode: false
        in: query
        name: task_type
        schema:
          description: Filter activities containing tasks of this type
          enum:
          - social
          - bounty-platforms
          - testnet
          - mainnet
          - role
          - form
          - liquidity
          - mint-nft
          - game
          - trading
          - staking
          - depin
          - node
          - ambassador
          - hold
          - check-wallet
          - mint-domain
          - predictions
          - deploy
          examples:
          - social
          type: string
      - description: Only return activities with currently OPEN tasks
        explode: false
        in: query
        name: has_open
        schema:
          default: false
          description: Only return activities with currently OPEN tasks
          examples:
          - true
          type: boolean
      - description: Field to sort results by
        explode: false
        in: query
        name: sort_by
        schema:
          default: last_status_update
          description: Field to sort results by
          enum:
          - total_raise
          - xscore
          - last_status_update
          examples:
          - last_status_update
          type: string
      - description: Sort order
        explode: false
        in: query
        name: order
        schema:
          default: desc
          description: Sort order
          enum:
          - asc
          - desc
          examples:
          - desc
          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: Include full task list per activity
        explode: false
        in: query
        name: include_tasks
        schema:
          default: false
          description: Include full task list per activity
          examples:
          - true
          type: boolean
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataResponseAirdropSearchItem'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Airdrop Search
      tags:
      - Search
  /gateway/v1/search/airdrop/activities:
    get:
      description: 'Lists airdrop activities with pagination.


        Returns activity metadata including reward type, status, and social metrics.'
      operationId: search-airdrop-activities
      parameters:
      - 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
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataResponseAirdropActivityItem'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Airdrop Activities
      tags:
      - Search
  /gateway/v1/search/events:
    get:
      description: 'Searches project events by keyword, optionally filtered by `type`.


        **Valid types:** `launch`, `upgrade`, `partnership`, `news`, `airdrop`, `listing`, `twitter`.


        **Lookup:** by UUID (`id`) or name (`q`). Returns 404 if the project is not found.'
      operationId: search-events
      parameters:
      - description: Surf project UUID. PREFERRED — always use this when available from a previous response (e.g. project_id from /fund/portfolio or id from /search/project). Takes priority over q.
        explode: false
        in: query
        name: id
        schema:
          description: Surf project UUID. PREFERRED — always use this when available from a previous response (e.g. project_id from /fund/portfolio or id from /search/project). Takes priority over q.
          examples:
          - 25c6612a-395c-4974-94eb-3b5f9f4b2ed7
          type: string
      - description: Fuzzy entity name search. Only use when 'id' is not available. May return unexpected results for ambiguous names.
        explode: false
        in: query
        name: q
        schema:
          description: Fuzzy entity name search. Only use when 'id' is not available. May return unexpected results for ambiguous names.
          examples:
          - ethereum
          type: string
      - description: Filter by event type. Can be `launch`, `upgrade`, `partnership`, `news`, `airdrop`, `listing`, or `twitter`.
        explode: false
        in: query
        name: type
        schema:
          description: Filter by event type. Can be `launch`, `upgrade`, `partnership`, `news`, `airdrop`, `listing`, or `twitter`.
          enum:
          - launch
          - upgrade
          - partnership
          - news
          - airdrop
          - listing
          - twitter
          examples:
          - launch
          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/DataResponseProjectEventItem'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Project Event Search
      tags:
      - Search
  /gateway/v1/search/fund:
    get:
      description: 'Searches funds by keyword.


        **Included fields:** name, tier, type, logo, top invested projects.'
      operationId: search-fund
      parameters:
      - description: Search keyword — fund name like `a16z`, `paradigm`, or `coinbase ventures`
        explode: false
        in: query
        name: q
        required: true
        schema:
          description: Search keyword — fund name like `a16z`, `paradigm`, or `coinbase ventures`
          examples:
          - a16z
          maxLength: 100
          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/DataResponseFundSearchItem'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Fund Search
      tags:
      - Search
  /gateway/v1/search/fundraising:
    get:
      description: 'Searches source-backed fundraising and token-sale events, or returns the latest fundraising timeline when `q` is omitted.


        Supports inclusive UTC time bounds, source and importance filters, localization, deterministic sorting, and offset pagination. Results intentionally omit project or fundraiser identity because source context is not guaranteed to identify the organization raising funds.'
      operationId: search-fundraising
      parameters:
      - description: Optional project name, alias, symbol, title, or summary search query. When provided, the trimmed query must contain 2-100 Unicode characters.
        explode: false
        in: query
        name: q
        schema:
          description: Optional project name, alias, symbol, title, or summary search query. When provided, the trimmed query must contain 2-100 Unicode characters.
          examples:
          - elliptic
          maxLength: 100
          minLength: 2
          type: string
      - description: Inclusive event-time lower bound. Accepts Unix seconds, YYYY-MM-DD, or RFC3339; date-only values start at 00:00:00 UTC.
        explode: false
        in: query
        name: from
        schema:
          description: Inclusive event-time lower bound. Accepts Unix seconds, YYYY-MM-DD, or RFC3339; date-only values start at 00:00:00 UTC.
          examples:
          - '2026-07-01'
          type: string
      - description: Inclusive event-time upper bound. Accepts Unix seconds, YYYY-MM-DD, or RFC3339; date-only values end at 23:59:59 UTC. Defaults to the current time.
        explode: false
        in: query
        name: to
        schema:
          description: Inclusive event-time upper bound. Accepts Unix seconds, YYYY-MM-DD, or RFC3339; date-only values end at 23:59:59 UTC. Defaults to the current time.
          examples:
          - '2026-07-10'
          type: string
      - description: 'Filter by public source type: social or news.'
        explode: false
        in: query
        name: source
        schema:
          description: 'Filter by public source type: social or news.'
          enum:
          - social
          - news
          examples:
          - social
          type: string
      - description: Display and search language. Missing translated fields fall back to English.
        explode: false
        in: query
        name: lang
        schema:
          default: en
          description: Display and search language. Missing translated fields fall back to English.
          enum:
          - en
          - zh
          - ja
          - kr
          examples:
          - en
          type: string
      - description: Minimum importance score from 1 to 5. Omit to include unscored events.
        explode: false
        in: query
        name: min_importance
        schema:
          description: Minimum importance score from 1 to 5. Omit to include unscored events.
          examples:
          - 3
          format: int64
          maximum: 5
          minimum: 1
          type: integer
      - description: Sort by recency, query relevance, or importance. Relevance requires q.
        explode: false
        in: query
        name: sort_by
        schema:
          default: recency
          description: Sort by recency, query relevance, or importance. Relevance requires q.
          enum:
          - recency
          - relevance
          - importance
          examples:
          - recency
          type: string
      - description: Sort order. Relevance only supports desc.
        explode: false
        in: query
        name: order
        schema:
          default: desc
          description: Sort order. Relevance only supports desc.
          enum:
          - asc
          - desc
          examples:
          - desc
          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. The offset plus limit cannot exceed 10000.
        explode: false
        in: query
        name: offset
        schema:
          default: 0
          description: Pagination offset. The offset plus limit cannot exceed 10000.
          examples:
          - 0
          format: int64
          minimum: 0
          type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataResponseFundraisingSearchItem'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Fundraising Event Search
      tags:
      - Search
  /gateway/v1/search/kalshi:
    get:
      deprecated: true
      description: '**[DEPRECATED]** Use `GET /v1/search/prediction-market?platform=kalshi` instead. This endpoint will continue to work but will not receive new features.


        ---


        Searches Kalshi events by keyword and/or category.


        **Filters:**

        - Keyword matching event title, subtitle, or market title

        - Category


        At least one of `q` or `category` is required. Returns events with nested markets.


        **Data refresh:** ~30 minutes'
      operationId: search-kalshi
      parameters:
      - description: Search keyword matching event title, subtitle, or market title
        explode: false
        in: query
        name: q
        schema:
          description: Search keyword matching event title, subtitle, or market title
          examples:
          - bitcoin
          maxLength: 200
          type: string
      - description: Filter by category
        explode: false
        in: query
        name: category
        schema:
          description: Filter by category
          enum:
          - crypto
          - culture
          - economics
          - financials
          - politics
          - stem
          - sports
          - unknown
          examples:
          - crypto
          type: string
      - description: 'Market status filter: `active`, `closed`, `determined`, `disputed`, `finalized`, `inactive`, or `initialized`'
        explode: false
        in: query
        name: status
        schema:
          description: 'Market status filter: `active`, `closed`, `determined`, `disputed`, `finalized`, `inactive`, or `initialized`'
          enum:
          - active
          - closed
          - determined
          - disputed
          - finalized
          - inactive
          - initialized
          examples:
          - active
          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/DataResponseKalshiEvent'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Kalshi Event Search [Deprecated]
      tags:
      - Search
  /gateway/v1/search/news:
    get:
      description: 'Searches crypto news articles by keyword.


        Returns results ranked by relevance with highlighted matching fragments. Supports pagination via limit and offset.'
      operationId: search-news
      parameters:
      - description: Search keyword or phrase
        explode: false
        in: query
        name: q
        required: true
        schema:
          description: Search keyword or phrase
          examples:
          - bitcoin ETF
          type: string
      - description: Results per page
        explode: false
        in: query
        name: limit
        schema:
          default: 10
          description: Results per page
          examples:
          - 10
          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/DataResponseNewsArticleItem'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: News Article Search
      tags:
      - Search
  /gateway/v1/search/polymarket:
    get:
      deprecated: true
      description: '**[DEPRECATED]** Use `GET /v1/search/prediction-market?platform=polymarket` instead. This endpoint will continue to work but will not receive new features.


        ---


        Searches Polymarket events by keyword, tags, and/or category.


        **Filters:**

        - Keyword matching market question, event title, or description

        - Comma-separated tag labels

        - Surf-curated category


        At least one of `q`, `tags`, or `category` is required. Returns events with nested markets ranked by volume.


        **Data refresh:** ~30 minutes'
      operationId: search-polymarket
      parameters:
      - description: Search keyword matching market question, event title, or description
        explode: false
        in: query
        name: q
        schema:
          description: Search keyword matching market question, event title, or description
          examples:
          - bitcoin
          maxLength: 200
          type: string
      - description: 'Comma-separated tag labels to filter by (matches any). Commonly used tags: `Crypto`, `Politics`, `Sports`, `Science`, `Pop Culture`'
        explode: false
        in: query
        name: tags
        schema:
          description: 'Comma-separated tag labels to filter by (matches any). Commonly used tags: `Crypto`, `Politics`, `Sports`, `Science`, `Pop Culture`'
          examples:
          - politics
          maxLength: 500
          type: string
      - description: Filter by Surf-curated category
        explode: false
        in: query
        name: category
        schema:
          description: Filter by Surf-curated category
          enum:
          - crypto
          - culture
          - early_polymarket_trades
          - economics
          - financials
          - politics
          - stem
          - sports
          - unknown
          examples:
          - politics
          type: string
      - description: 'Market status filter: `active`, `finalized`, `ended`, `initialized`, or `closed`'
        explode: false
        in: query
        name: status
        schema:
          default: active
          description: 'Market status filter: `active`, `finalized`, `ended`, `initialized`, or `closed`'
          enum:
          - active
          - finalized
          - ended
          - initialized
          - closed
          examples:
          - active
          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/DataResponsePolymarketEvent'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Polymarket Event Search [Deprecated]
      tags:
      - Search
  /gateway/v1/search/prediction-market:
    get:
      description: 'Browse and search prediction markets across all supported platforms.


        Filter by platform, category, status, keyword search, and smart money direction. Each result includes volume, open interest, trade counts, and smart money signals.


        Supports single-market lookup via `condition_id` or `market_ticker`.


        **Data refresh:** ~5 minutes.'
      operationId: search-prediction-market
      parameters:
      - description: Polymarket condition ID for single-market lookup
        explode: false
        in: query
        name: condition_id
        schema:
          description: Polymarket condition ID for single-market lookup
          type: string
      - description: Kalshi market ticker for single-market lookup
        explode: false
        in: query
        name: market_ticker
        schema:
          description: Kalshi market ticker for single-market lookup
          type: string
      - description: Filter by platform (omit for both)
        explode: false
        in: query
        name: platform
        schema:
          description: Filter by platform (omit for both)
          enum:
          - polymarket
          - kalshi
          type: string
      - description: Filter by Surf-curated category
        explode: false
        in: query
        name: category
        schema:
          description: Filter by Surf-curated category
          enum:
          - crypto
          - culture
          - economics
          - financials
          - politics
          - stem
          - sports
          type: string
      - description: Market status filter
        explode: false
        in: query
        name: status
        schema:
          default: active
          description: Market status filter
          enum:
          - active
          - closed
          - finalized
          type: string
      - description: Sort field
        explode: false
        in: query
        name: sort_by
        schema:
          default: volume_7d
          description: Sort field
          enum:
          - volume_1d
          - volume_7d
          - volume_30d
          - open_interest
          - trade_count_7d
          - days_to_resolution
          type: string
      - description: Sort direction
        explode: false
        in: query
        name: order
        schema:
          default: desc
          description: Sort direction
          enum:
          - asc
          - desc
          type: string
      - description: Filter by smart money direction (Polymarket only)
        explode: false
        in: query
        name: smart_money
        schema:
          description: Filter by smart money direction (Polymarket only)
          enum:
          - bullish
          - bearish
          type: string
      - description: Search markets by keyword in question text or ticker. Results include slug and event fields when available, but machine slugs are not searched.
        explode: false
        in: query
        name: q
        schema:
          description: Search markets by keyword in question text or ticker. Results include slug and event fields when available, but machine slugs are not searched.
          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
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataResponseDiscoverMarketItem'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Search Prediction Markets
      tags:
      - Search
  /gateway/v1/search/project:
    get:
      description: 'Searches crypto projects by keyword.


        **Included fields:** name, description, chains, logo.'
      operationId: search-project
      parameters:
      - description: Search keyword — project name or ticker like `uniswap`, `bitcoin`, or `ETH`
        explode: false
        in: query
        name: q
        required: true
        schema:
          description: Search keyword — project name or ticker like `uniswap`, `bitcoin`, or `ETH`
          examples:
          - bitcoin
          maxLength: 100
          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
        

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