Surf Social API

Monitor crypto social activity on X (Twitter). Look up user profiles and their posts, track project sentiment scores and follower geography, discover smart followers, and analyze mindshare trends over time to gauge social momentum.

Operations 12

GET /gateway/v1/social/detail Aggregated Social Analytics #
GET /gateway/v1/social/mindshare Project Mindshare Time Series #
GET /gateway/v1/social/ranking Social Mindshare Ranking #
GET /gateway/v1/social/sentiment Social Sentiment #
GET /gateway/v1/social/smart-followers/history Smart Follower Count History #
GET /gateway/v1/social/tweet/replies Tweet Replies #
GET /gateway/v1/social/tweets Social Posts by IDs #
GET /gateway/v1/social/user Social User Profile #
GET /gateway/v1/social/user/followers User Followers List #
GET /gateway/v1/social/user/following User Following List #
GET /gateway/v1/social/user/posts User Social Posts #
GET /gateway/v1/social/user/replies User Replies #

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-social-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-social-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. 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 Social API
  version: sha-80d3407
servers:
- url: /
tags:
- description: Monitor crypto social activity on X (Twitter). Look up user profiles and their posts, track project sentiment scores and follower geography, discover smart followers, and analyze mindshare trends over time to gauge social momentum.
  name: Social
paths:
  /gateway/v1/social/detail:
    get:
      description: 'Returns Twitter/X analytics for a crypto project: sentiment score, follower geography, and smart follower breakdown (VCs, KOLs, developers). For individual user profiles use `social-user` instead.


        **Available fields** (via `fields`): `sentiment`, `follower_geo`, `smart_followers`.


        **Lookup:** by X account ID (`x_id`) or project name (`q`, e.g. `uniswap`, `solana`). The `q` parameter must be a crypto project name, not a personal Twitter handle. Returns 404 if the project has no linked Twitter account.


        For sentiment **trends over time**, use `/social/mindshare` instead.'
      operationId: social-detail
      parameters:
      - description: Numeric X (Twitter) account ID (takes priority over `q`)
        explode: false
        in: query
        name: x_id
        schema:
          description: Numeric X (Twitter) account ID (takes priority over `q`)
          examples:
          - '984188226826010624'
          type: string
      - description: Entity name to resolve like `uniswap`, `ethereum`, or `aave`
        explode: false
        in: query
        name: q
        schema:
          description: Entity name to resolve like `uniswap`, `ethereum`, or `aave`
          examples:
          - uniswap
          type: string
      - description: Comma-separated sub-resources to include. Can be `sentiment`, `follower_geo`, or `smart_followers`.
        explode: false
        in: query
        name: fields
        schema:
          default: sentiment,follower_geo,smart_followers
          description: Comma-separated sub-resources to include. Can be `sentiment`, `follower_geo`, or `smart_followers`.
          examples:
          - sentiment
          type: string
      - description: 'Window to aggregate sentiment data over: `24h`, `48h`, `7d`, `30d`, `3m`, `6m`, or `1y`. Returns a single snapshot (not a time-series). This endpoint uses `time_range` only — it does NOT accept `interval`. For mindshare time-series use /v1/social/mindshare.'
        explode: false
        in: query
        name: time_range
        schema:
          default: 7d
          description: 'Window to aggregate sentiment data over: `24h`, `48h`, `7d`, `30d`, `3m`, `6m`, or `1y`. Returns a single snapshot (not a time-series). This endpoint uses `time_range` only — it does NOT accept `interval`. For mindshare time-series use /v1/social/mindshare.'
          enum:
          - 24h
          - 48h
          - 7d
          - 30d
          - 3m
          - 6m
          - 1y
          examples:
          - 7d
          type: string
      - description: Max geo locations to return
        explode: false
        in: query
        name: geo_limit
        schema:
          default: 20
          description: Max geo locations to return
          examples:
          - 10
          format: int64
          maximum: 100
          minimum: 1
          type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataObjectResponseSocialDetailBody'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Aggregated Social Analytics
      tags:
      - Social
  /gateway/v1/social/mindshare:
    get:
      description: 'Returns mindshare (social view count) **time-series trend** for a project, aggregated by `interval`.


        **Intervals:** `5m`, `1h`, `1d`, `7d`. `interval` is REQUIRED.


        **Filters:** date range with `from`/`to` (Unix seconds). Lookup by Surf project UUID (`id`) or by name (`q`) — exactly one of the two is required.


        **No pagination and no `time_range`** — this endpoint does NOT accept `limit`, `offset`, or `time_range`. Size of the returned series is controlled by `from`/`to` divided by `interval`.


        Use this for sentiment **trends**, mindshare **over time**, or social momentum changes.


        For a **point-in-time snapshot** of social analytics (sentiment score, follower geo, smart followers), use `/social/detail` instead.'
      operationId: social-mindshare
      parameters:
      - description: Surf project UUID. Provide one of `id` or `q`.
        explode: false
        in: query
        name: id
        schema:
          description: Surf project UUID. Provide one of `id` or `q`.
          examples:
          - 25c6612a-395c-4974-94eb-3b5f9f4b2ed7
          type: string
      - description: Entity name to resolve like `uniswap`, `ethereum`, or `aave`. Provide one of `id` or `q`.
        explode: false
        in: query
        name: q
        schema:
          description: Entity name to resolve like `uniswap`, `ethereum`, or `aave`. Provide one of `id` or `q`.
          examples:
          - uniswap
          type: string
      - description: 'Bucket size for each point in the returned time-series: `5m`, `1h`, `1d`, or `7d`. This is NOT a window — this endpoint has no default window, pass `from`/`to` to bound the range. Not the same parameter as `time_range` (which does not exist on this endpoint). Note: when `include_tag_percents=true`, `5m` falls back to hourly data for the per-tag series (Argus has no 5m granularity for tag percentages).'
        explode: false
        in: query
        name: interval
        required: true
        schema:
          description: 'Bucket size for each point in the returned time-series: `5m`, `1h`, `1d`, or `7d`. This is NOT a window — this endpoint has no default window, pass `from`/`to` to bound the range. Not the same parameter as `time_range` (which does not exist on this endpoint). Note: when `include_tag_percents=true`, `5m` falls back to hourly data for the per-tag series (Argus has no 5m granularity for tag percentages).'
          enum:
          - 5m
          - 1h
          - 1d
          - 7d
          examples:
          - 1d
          type: string
      - description: Start timestamp. Accepts Unix seconds (1704067200) or date string (2024-01-01)
        explode: false
        in: query
        name: from
        schema:
          description: Start timestamp. Accepts Unix seconds (1704067200) or date string (2024-01-01)
          examples:
          - '1704067200'
          type: string
      - description: End timestamp. Accepts Unix seconds (1706745600) or date string (2024-02-01)
        explode: false
        in: query
        name: to
        schema:
          description: End timestamp. Accepts Unix seconds (1706745600) or date string (2024-02-01)
          examples:
          - '1706745600'
          type: string
      - description: Set to `true` to additionally return per-tag mindshare percentage time-series in the `tag_percents` field. A project can belong to multiple tags; each tag returns its own sparse time-series (values are 0~100 percentages, not ratios). Default `false` — response shape is byte-identical to the legacy format.
        explode: false
        in: query
        name: include_tag_percents
        schema:
          description: Set to `true` to additionally return per-tag mindshare percentage time-series in the `tag_percents` field. A project can belong to multiple tags; each tag returns its own sparse time-series (values are 0~100 percentages, not ratios). Default `false` — response shape is byte-identical to the legacy format.
          examples:
          - true
          type: boolean
      - description: 'Data lane: `x` (X/Twitter, default) or `binance_square` (Binance Square). Response shape is identical across sources.'
        explode: false
        in: query
        name: source
        schema:
          default: x
          description: 'Data lane: `x` (X/Twitter, default) or `binance_square` (Binance Square). Response shape is identical across sources.'
          enum:
          - x
          - binance_square
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SocialMindshareBody'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Project Mindshare Time Series
      tags:
      - Social
  /gateway/v1/social/ranking:
    get:
      description: 'Returns top crypto projects ranked by mindshare (social view count), refreshed every 5 minutes.


        **Filters:**

        - `tag` — scope to a category (e.g. `dex`, `l1`, `meme`)

        - `time_range` — ranking window (`24h`, `48h`, `7d`, `30d`)


        Supports `limit`/`offset` pagination.'
      operationId: social-ranking
      parameters:
      - description: Pagination offset
        explode: false
        in: query
        name: offset
        schema:
          default: 0
          description: Pagination offset
          examples:
          - 0
          format: int64
          minimum: 0
          type: integer
      - 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: Filter by project category. `l1` = Layer 1, `l2` = Layer 2/scaling, `dex` = DEX/AMM, `derivatives` = perps/options, `cex` = centralized exchange, `gamefi` = gaming, `nft` = NFT collections, `oracle` = oracle, `prediction` = prediction market, `rwa` = real-world assets, `yield` = yield/asset management, `data` = data/analytics, `devtool` = developer tooling, `compliance` = compliance/regtech, `meme` = meme/token launchpad.
        explode: false
        in: query
        name: tag
        schema:
          description: Filter by project category. `l1` = Layer 1, `l2` = Layer 2/scaling, `dex` = DEX/AMM, `derivatives` = perps/options, `cex` = centralized exchange, `gamefi` = gaming, `nft` = NFT collections, `oracle` = oracle, `prediction` = prediction market, `rwa` = real-world assets, `yield` = yield/asset management, `data` = data/analytics, `devtool` = developer tooling, `compliance` = compliance/regtech, `meme` = meme/token launchpad.
          enum:
          - l1
          - l2
          - dex
          - derivatives
          - cex
          - gamefi
          - nft
          - oracle
          - prediction
          - rwa
          - yield
          - data
          - devtool
          - compliance
          - meme
          - ''
          examples:
          - dex
          type: string
      - description: 'Window to compute the ranking over: `24h`, `48h`, `7d`, or `30d`. Returns a single ranked snapshot (not a time-series). This endpoint uses `time_range` only — it does NOT accept `interval`.'
        explode: false
        in: query
        name: time_range
        schema:
          default: 7d
          description: 'Window to compute the ranking over: `24h`, `48h`, `7d`, or `30d`. Returns a single ranked snapshot (not a time-series). This endpoint uses `time_range` only — it does NOT accept `interval`.'
          enum:
          - 24h
          - 48h
          - 7d
          - 30d
          examples:
          - 7d
          type: string
      - description: Filter by sentiment polarity. Only projects with sufficient tweet data are classified.
        explode: false
        in: query
        name: sentiment
        schema:
          description: Filter by sentiment polarity. Only projects with sufficient tweet data are classified.
          enum:
          - positive
          - negative
          - ''
          examples:
          - positive
          type: string
      - description: 'Data lane: `x` (X/Twitter, default) or `binance_square` (Binance Square). Response shape is identical across sources.'
        explode: false
        in: query
        name: source
        schema:
          default: x
          description: 'Data lane: `x` (X/Twitter, default) or `binance_square` (Binance Square). Response shape is identical across sources.'
          enum:
          - x
          - binance_square
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataResponseMindshareTopProject'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Social Mindshare Ranking
      tags:
      - Social
  /gateway/v1/social/sentiment:
    get:
      description: 'Returns the aggregate social sentiment score for a project.


        Score ranges from -1.0 (bearish) to 1.0 (bullish).'
      operationId: social-sentiment
      parameters:
      - description: Surf project UUID
        explode: false
        in: query
        name: id
        schema:
          description: Surf project UUID
          examples:
          - 25c6612a-395c-4974-94eb-3b5f9f4b2ed7
          type: string
      - description: Project name or symbol for entity resolution
        explode: false
        in: query
        name: q
        schema:
          description: Project name or symbol for entity resolution
          examples:
          - bitcoin
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataObjectResponseSocialSentimentItem'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Social Sentiment
      tags:
      - Social
  /gateway/v1/social/smart-followers/history:
    get:
      description: 'Returns smart follower count time-series for a project, sorted by date descending.


        **Lookup:** by X account ID (`x_id`) or project name (`q`). The `q` parameter must be a project name (e.g. `uniswap`, `ethereum`), not a personal X handle — use `x_id` for individual accounts. Returns 404 if the project has no linked X account.'
      operationId: social-smart-followers-history
      parameters:
      - description: Numeric X (Twitter) account ID (takes priority over `q`)
        explode: false
        in: query
        name: x_id
        schema:
          description: Numeric X (Twitter) account ID (takes priority over `q`)
          examples:
          - '984188226826010624'
          type: string
      - description: Project name to resolve (e.g. `uniswap`, `ethereum`). Must be a project with a linked X account — personal handles like `VitalikButerin` return 404. Use `x_id` for individual accounts.
        explode: false
        in: query
        name: q
        schema:
          description: Project name to resolve (e.g. `uniswap`, `ethereum`). Must be a project with a linked X account — personal handles like `VitalikButerin` return 404. Use `x_id` for individual accounts.
          examples:
          - uniswap
          type: string
      - description: Max data points to return (upstream typically provides ~36 daily points)
        explode: false
        in: query
        name: limit
        schema:
          default: 36
          description: Max data points to return (upstream typically provides ~36 daily points)
          examples:
          - 36
          format: int64
          maximum: 100
          minimum: 1
          type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataResponseSmartFollowerHistoryPoint'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Smart Follower Count History
      tags:
      - Social
  /gateway/v1/social/tweet/replies:
    get:
      description: 'Returns replies/comments on a specific tweet.


        **Lookup:** by `tweet_id`.'
      operationId: social-tweet-replies
      parameters:
      - description: Tweet ID to get replies for
        explode: false
        in: query
        name: tweet_id
        required: true
        schema:
          description: Tweet ID to get replies for
          examples:
          - '1999187154530898007'
          type: string
      - description: Max results to return
        explode: false
        in: query
        name: limit
        schema:
          default: 20
          description: Max results to return
          examples:
          - 20
          format: int64
          maximum: 100
          minimum: 1
          type: integer
      - description: Opaque cursor token from a previous response's next_cursor field for fetching the next page
        explode: false
        in: query
        name: cursor
        schema:
          description: Opaque cursor token from a previous response's next_cursor field for fetching the next page
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CursorDataResponseXTweet'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Tweet Replies
      tags:
      - Social
  /gateway/v1/social/tweets:
    get:
      description: 'Returns X (Twitter) posts by numeric post ID strings.


        Pass up to 100 comma-separated IDs via the `ids` query parameter.'
      operationId: social-tweets
      parameters:
      - description: Comma-separated numeric post ID strings, max 100
        explode: false
        in: query
        name: ids
        required: true
        schema:
          description: Comma-separated numeric post ID strings, max 100
          examples:
          - 1880293339000000000,1880293339000000001
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataResponseXTweet'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Social Posts by IDs
      tags:
      - Social
  /gateway/v1/social/user:
    get:
      description: 'Returns a basic X/Twitter profile (name, bio, avatar, follower/following counts) for any handle. For crypto project social analytics (sentiment, smart followers, geo), use `social-detail` instead.


        **Lookup:** by `handle` (without @).'
      operationId: social-user
      parameters:
      - description: X (Twitter) username without @ like `cz_binance` or `vitalikbuterin`
        explode: false
        in: query
        name: handle
        required: true
        schema:
          description: X (Twitter) username without @ like `cz_binance` or `vitalikbuterin`
          examples:
          - vitalikbuterin
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataObjectResponseXUser'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: Social User Profile
      tags:
      - Social
  /gateway/v1/social/user/followers:
    get:
      description: 'Returns a list of followers for the specified handle on X (Twitter).


        **Lookup:** by `handle` (without @).'
      operationId: social-user-followers
      parameters:
      - description: X (Twitter) username without @ like `vitalikbuterin` or `cz_binance`
        explode: false
        in: query
        name: handle
        required: true
        schema:
          description: X (Twitter) username without @ like `vitalikbuterin` or `cz_binance`
          examples:
          - vitalikbuterin
          type: string
      - description: Max results to return
        explode: false
        in: query
        name: limit
        schema:
          default: 20
          description: Max results to return
          examples:
          - 20
          format: int64
          maximum: 100
          minimum: 1
          type: integer
      - description: Opaque cursor token from a previous response's next_cursor field for fetching the next page
        explode: false
        in: query
        name: cursor
        schema:
          description: Opaque cursor token from a previous response's next_cursor field for fetching the next page
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CursorDataResponseXUser'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: User Followers List
      tags:
      - Social
  /gateway/v1/social/user/following:
    get:
      description: 'Returns a list of users that the specified handle follows on X (Twitter).


        **Lookup:** by `handle` (without @).'
      operationId: social-user-following
      parameters:
      - description: X (Twitter) username without @ like `vitalikbuterin` or `cz_binance`
        explode: false
        in: query
        name: handle
        required: true
        schema:
          description: X (Twitter) username without @ like `vitalikbuterin` or `cz_binance`
          examples:
          - vitalikbuterin
          type: string
      - description: Max results to return
        explode: false
        in: query
        name: limit
        schema:
          default: 20
          description: Max results to return
          examples:
          - 20
          format: int64
          maximum: 100
          minimum: 1
          type: integer
      - description: Opaque cursor token from a previous response's next_cursor field for fetching the next page
        explode: false
        in: query
        name: cursor
        schema:
          description: Opaque cursor token from a previous response's next_cursor field for fetching the next page
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CursorDataResponseXUser'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: User Following List
      tags:
      - Social
  /gateway/v1/social/user/posts:
    get:
      description: 'Returns recent X (Twitter) posts by a specific user, ordered by recency.


        **Lookup:** by `handle` (without @). Use `filter=original` to exclude retweets.


        **Pagination:** check `meta.has_more`; if true, pass `meta.next_cursor` as the `cursor` query parameter in the next request.'
      operationId: social-user-posts
      parameters:
      - description: X (Twitter) username without @ like `vitalikbuterin` or `cz_binance`
        explode: false
        in: query
        name: handle
        required: true
        schema:
          description: X (Twitter) username without @ like `vitalikbuterin` or `cz_binance`
          examples:
          - vitalikbuterin
          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: Opaque cursor token from a previous response's next_cursor field for fetching the next page
        explode: false
        in: query
        name: cursor
        schema:
          description: Opaque cursor token from a previous response's next_cursor field for fetching the next page
          type: string
      - description: 'Filter tweets: `all` returns everything, `original` excludes retweets'
        explode: false
        in: query
        name: filter
        schema:
          default: all
          description: 'Filter tweets: `all` returns everything, `original` excludes retweets'
          enum:
          - all
          - original
          examples:
          - all
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CursorDataResponseXTweet'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: User Social Posts
      tags:
      - Social
  /gateway/v1/social/user/replies:
    get:
      description: 'Returns recent replies by the specified handle on X (Twitter).


        **Lookup:** by `handle` (without @).'
      operationId: social-user-replies
      parameters:
      - description: X (Twitter) username without @ like `vitalikbuterin` or `cz_binance`
        explode: false
        in: query
        name: handle
        required: true
        schema:
          description: X (Twitter) username without @ like `vitalikbuterin` or `cz_binance`
          examples:
          - vitalikbuterin
          type: string
      - description: Max results to return
        explode: false
        in: query
        name: limit
        schema:
          default: 20
          description: Max results to return
          examples:
          - 20
          format: int64
          maximum: 100
          minimum: 1
          type: integer
      - description: Opaque cursor token from a previous response's next_cursor field for fetching the next page
        explode: false
        in: query
        name: cursor
        schema:
          description: Opaque cursor token from a previous response's next_cursor field for fetching the next page
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CursorDataResponseXTweet'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataAPIError'
          description: Error
      security:
      - AccessToken: []
      summary: User Replies
      tags:
      - Social
components:
  schemas:
    XUser:
      additionalProperties: false
      properties:
        avatar:
          description: Profile picture URL
          type: string
        bio:
          description: Profile biography text
          type: string
        followers_count:
          description: Number of followers
          format: int64
          type: integer
        following_count:
          description: Number of accounts this user follows
          format: int64
          type: integer
        handle:
          description: X/Twitter handle without the @ prefix
          type: string
        name:
          description: Display name on X/Twitter
          type: string
        user_id:
          description: Numeric X/Twitter user ID as a string
          type: string
      required:
      - user_id
      - handle
      - name
      - followers_count
      - following_count
      type: object
    SentimentData:
      additionalProperties: false
      properties:
        insufficient_social_data:
          description: True when fewer than the minimum number of scored tweets were available in the timeframe (or all view counts were 0). The score is null in that case rather than a meaningful neutral. Absent (or false) for normal respo

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