FetchPI
Log in

Docs

API reference and guides: authentication, error codes, pagination, freshness and the X endpoints.

OpenAPI 1.0.0

Quickstart

5 min

Quickstart in 5 minutes

Three steps from zero to your first structured response:

  1. Create an account — registration also creates your default workspace. Sign up
  2. Create an API key in the console. The secret is shown exactly once; store it securely. Create an API key
  3. Call any endpoint with the key as a Bearer token:
curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/x/users/newdev?freshness=default"

AI agents

FetchPI is built to be called by AI agents: the catalog, the contract and a step-by-step skill file are all machine-readable, static, and generated from the same data as this site.

  • /llms.txt — the agent-facing site index: what is available, where the docs and prices live.
  • /SKILL.md — the step-by-step agent guide: discover → inspect → call → read usage, with billing rules.
  • /openapi.yaml — the public OpenAPI subset: every /v1 data path plus the catalog — admin and console surfaces are not part of it.

Workflow for an agent: read the catalog for availability and prices, read the schema before calling, send one API key per request, prefer freshness=cache for repeated lookups, and stop paginating once the question is answered.

Authentication

All /v1/* endpoints authenticate with an API key sent as an HTTP Bearer token. Keys use the mk_live_… / mk_test_… prefix scheme.

Authorization: Bearer mk_live_…

Treat the secret like a password: it is displayed only once, at creation. If it may have leaked, revoke the key and create a new one.

Error codes

Every non-2xx response uses the same envelope: an error object with a stable machine-readable code, plus the request_id to quote when contacting support.

{
  "error": {
    "code": "NOT_FOUND",
    "message": "API key not found."
  },
  "request_id": "req_01HTXQ8Z9HTQ"
}
CodeHTTP statusDescriptionCommon triggers
UNAUTHENTICATED401Missing or invalid API key / session.Data API called without a valid API key, or a console session missing/expired.
FORBIDDEN403Authenticated, but the key is not allowed to use this capability.Key ACL denies the capability, RBAC denies the action, or the workspace Credits are frozen (CREDITS_FROZEN).
NOT_FOUND404The addressed resource does not exist or is not visible to you.Resource does not exist or is not visible to this workspace (API key, dataset, order number).
DATA_NOT_FOUND404No data available — for example cache-only mode without a cached entity.Cache-only mode without a cached copy, or an unknown platform user.
METHOD_NOT_ALLOWED—The HTTP method is not supported for this path.Unsupported HTTP verb on an existing path (e.g. POST on a GET-only endpoint).
VALIDATION400Request parameters failed validation; see error.details.fields.Parameter validation failed: limit out of range, bad cursor, malformed id; see error.details.fields.
CONFLICT409Conflicting state, e.g. a duplicate resource or a reused idempotency key.Conflicting state, e.g. a duplicate resource or a reused idempotency key.
RATE_LIMIT_EXCEEDED429Too many requests — the unified 429 code across every limiter gate (details.scope names the gate); honor Retry-After and retry later.Refused by a limiter gate: key minute window, workspace hour window, extra key-hour cap or RPS bucket (details.scope names it); retry after Retry-After.
RATE_LIMITER_UNAVAILABLE503The rate-limiting backend is temporarily unavailable; the request was refused without consuming quota — retry after Retry-After.Shared limiter store (Redis) briefly down; fail-closed refusal without consuming quota.
REGISTRATION_DISABLED403Direct sign-up is closed — use Google or GitHub sign-in instead.Direct sign-up is closed on this deployment; use Google/GitHub sign-in.
OAUTH_PROVIDER_UNAVAILABLE404This sign-in provider is temporarily unavailable; try another provider.Sign-in provider not configured on this deployment or temporarily failing.
PASSWORD_CHANGE_REQUIRED—Your password was reset by an operator and must be changed before continuing.An operator reset the password; it must be changed before the session may continue.
INSUFFICIENT_CREDITS402Not enough credits for this request. Recharge and retry.Workspace credit balance is below the request price; details carry required/available Credits.
CREDITS_FROZEN403This workspace has frozen credits — top-ups stay available, but data API requests are refused until it is unfrozen.Credits frozen after a payment reversal (deep reorg): top-ups work, data API requests are refused.
NOT_IMPLEMENTED501The capability is reserved but not implemented in V1.Capability reserved but not implemented in V1.
UPSTREAM_ERROR502All eligible upstream data paths failed; the request is not billed.All eligible upstream data paths failed; the request is not billed.
INTERNALdefaultUnexpected server error; quote the request_id when reporting it.Unexpected server error; quote the request_id when reporting.
PAYMENT_AMOUNT_UNAVAILABLE402Every slot for the requested top-up amount is currently taken; pick another amount or retry later.All slots for that top-up amount are taken; pick another amount or retry later.
PAYMENT_NETWORK_DISABLED400The selected network/asset is not accepting payment orders right now.The selected network/asset is not accepting top-up orders right now.
PAYMENT_ORDER_EXPIRED—The payment order has left its payment window and can no longer be paid; create a new order.The order left its 30-minute payment window and can no longer be paid; create a new one.
PAYMENT_PENDING_LIMIT409The workspace already has the maximum number of pending payment orders; complete them or wait for expiry.Too many pending orders; complete them or wait for expiry.
PAYMENT_DUPLICATE_RATE409This idempotency key was already used with different order conditions; reuse the original order or pick a new key.The idempotency key was already used with different order conditions; reuse the original order or pick a new key.
PAYMENT_RATE_STALE409The market rate for this currency is stale; new top-up orders are temporarily refused. Please try again later.The fiat rate is stale; new top-up orders are temporarily refused.
DATASET_NOT_AVAILABLE409This dataset is not accepting orders — it is collecting or paused (compliance).The dataset is collecting or paused (compliance) and not accepting orders.
DATASET_DUPLICATE_ORDER409This idempotency key was already used with a different dataset order; reuse the original order or pick a new key.The idempotency key was already used with a different dataset order; reuse the original order or pick a new key.
PAYMENT_PROVIDER_DISABLED400This payment provider is disabled or not configured.The payment provider is disabled or not configured.
CUSTOM_REQUEST_LIMIT_EXCEEDED403Custom-service request quota reached — at most 5 open custom-data requests per natural month; try again next month.Custom-service monthly quota exceeded — more than 5 open custom-data requests in the natural month (business quota, never a 429).
SITE_BUILD_NOT_CONFIGURED—Site rebuild webhook is not configured.A site rebuild was triggered from the admin console, but the server has no rebuild webhook URL configured.

Pagination

List endpoints use cursor pagination: pass limit (1–100, default 20) and cursor; the response's next_cursor points to the next page.

GET /v1/x/users/newdev/posts?limit=20&cursor=eyJpZCI6MTAwfQ

next_cursor is null (or absent) when the list is exhausted. Cursors are opaque — do not parse them or rely on them across data-source changes.

Freshness

Every data endpoint accepts freshness (cache | default | live) and max_age (seconds). freshness wins over max_age, which wins over the platform TTL; the default is default.

freshness=cache

Never touches upstream. If nothing is cached you get 404 DATA_NOT_FOUND.

freshness=default

The platform decides using TTL and source policy: cached, stored or freshly acquired data.

freshness=live

Requests a fresh fetch and may cost extra (live multiplier). Failure returns 502 UPSTREAM_ERROR — never fake-fresh data.

Every data response reports what actually happened in meta.freshness — effective mode, data age and serving layer. See Response meta below.

Rate limits

Requests are rate limited per API key and per workspace. Exceeding the limit returns 429 RATE_LIMITED with a Retry-After header in seconds.

Per-key request limits and monthly spend caps can be configured on each key in the console.

Response meta

Every /v1/* success response carries meta.request_id plus freshness and billing metadata:

FieldTypeRequiredDescription
modecache | default | liveRequiredEffective mode after merging param > max_age > source policy (D-004).
age_secondsinteger | nullOptionalAge of served data; null when unknown.
source_layercache | db | upstreamRequiredWhich layer served the response (PRD §10).
stalebooleanOptionalTrue when stale data was served under stale_if_error / SWR (D-004).
billing.amount_creditsintegerRequiredMicro-USD (1e-6 USD) actually charged for this request.
billing.cache_hitbooleanRequired—

Field notes are shown in the contract's original English.

API endpoints

The 165 documented endpoints across all 18 platforms, with parameters, responses and a sample payload, grouped by platform. The normalized schemas live on the product pages.

GET/v1/x/users/{username}x.profile

X profile

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringX handle without leading @.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Responses

200Normalized profile of the requested user.

404 — No data available (e.g. cache-only mode without cached entity, or unknown username).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/x/users/newdev"

Example response

{
  "data": {
    "id": "2244994945",
    "platform": "x",
    "type": "profile",
    "username": "newdev",
    "display_name": "New Dev",
    "description": "Building data APIs.",
    "url": "https://x.com/newdev",
    "profile_image_url": "https://cdn.example.com/avatar/newdev.jpg",
    "banner_image_url": null,
    "location": "Berlin",
    "verified": false,
    "created_at": "2019-04-01T10:15:00Z",
    "metrics": {
      "followers": 1204,
      "following": 312,
      "posts": 870,
      "likes": 15200
    },
    "fetched_at": "2026-09-18T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 120,
      "source_layer": "db",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/x/users/{username}/postsx.user_posts

X user posts

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringX handle without leading @.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/x/users/newdev/posts"

Example response

{
  "data": [
    {
      "id": "1842951234567890123",
      "platform": "x",
      "type": "post",
      "author": {
        "id": "2244994945",
        "username": "newdev",
        "display_name": "New Dev",
        "verified": false
      },
      "text": "One API for internet data.",
      "lang": "en",
      "created_at": "2026-09-17T12:34:56Z",
      "metrics": {
        "likes": 128,
        "reposts": 12,
        "replies": 4,
        "quotes": 1,
        "views": 5230
      },
      "in_reply_to": null,
      "attachments": [],
      "fetched_at": "2026-09-18T09:00:00Z"
    },
    {
      "id": "1842909876543210987",
      "platform": "x",
      "type": "post",
      "author": {
        "id": "2244994945",
        "username": "newdev",
        "display_name": "New Dev",
        "verified": false
      },
      "text": "Freshness modes explained.",
      "lang": "en",
      "created_at": "2026-09-16T08:00:00Z",
      "metrics": {
        "likes": 64,
        "reposts": 3,
        "replies": 1,
        "quotes": 0,
        "views": 1200
      },
      "in_reply_to": null,
      "attachments": [
        {
          "type": "photo",
          "url": "https://cdn.example.com/p/1.jpg",
          "width": 1024,
          "height": 512
        }
      ],
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": "eyJpZCI6IjE4MjkwMDAwMDAwMDAwMDAwIn0",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/x/posts/{id}x.post

X post detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringX post id (platform-native, numeric string).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/x/posts/1842951234567890123"

Example response

{
  "data": {
    "id": "1842951234567890123",
    "platform": "x",
    "type": "post",
    "author": {
      "id": "2244994945",
      "username": "newdev",
      "display_name": "New Dev",
      "verified": false
    },
    "text": "One API for internet data.",
    "lang": "en",
    "created_at": "2026-09-17T12:34:56Z",
    "metrics": {
      "likes": 128,
      "reposts": 12,
      "replies": 4,
      "quotes": 1,
      "views": 5230
    },
    "in_reply_to": null,
    "attachments": [],
    "fetched_at": "2026-09-18T07:30:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 3600,
      "source_layer": "cache",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": true
    }
  }
}
GET/v1/x/posts/{id}/commentsx.comments

X post comments

ParameterLocationRequiredTypeDescription
idpathRequiredstringX post id (platform-native, numeric string).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/x/posts/1842951234567890123/comments"

Example response

{
  "data": [
    {
      "id": "1842951999999999999",
      "platform": "x",
      "type": "comment",
      "post_id": "1842951234567890123",
      "author": {
        "id": "1122334455",
        "username": "curiouscat",
        "display_name": "Curious Cat",
        "verified": false
      },
      "text": "Great post!",
      "created_at": "2026-09-17T13:00:00Z",
      "metrics": {
        "likes": 3
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 600,
      "source_layer": "db",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/x/search/postsx.search_posts

X search posts

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Responses

200Paginated normalized posts matching the query.

404 — Search is unavailable in cache-only mode without results.

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/x/search/posts?q=meshdata"

Example response

{
  "data": [
    {
      "id": "1841001111111111111",
      "platform": "x",
      "type": "post",
      "author": {
        "id": "5566778899",
        "username": "datafan",
        "display_name": "Data Fan",
        "verified": true
      },
      "text": "meshdata launch day!",
      "lang": "en",
      "created_at": "2026-09-15T10:00:00Z",
      "metrics": {
        "likes": 9,
        "reposts": 2,
        "replies": 0,
        "quotes": 0,
        "views": 340
      },
      "in_reply_to": null,
      "attachments": [],
      "fetched_at": "2026-09-18T09:05:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "live",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/x/users/{username}/followersx.user_followers

List followers

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringX handle without leading @.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/x/users/newdev/followers"

Example response

{
  "data": [
    {
      "id": "2244994945",
      "platform": "x",
      "type": "profile",
      "username": "newdev",
      "display_name": "New Dev",
      "description": "Building data APIs.",
      "url": "https://x.com/newdev",
      "profile_image_url": "https://cdn.example.com/avatar/newdev.jpg",
      "banner_image_url": null,
      "location": "Berlin",
      "verified": false,
      "created_at": "2019-04-01T10:15:00Z",
      "metrics": {
        "followers": 1204,
        "following": 312,
        "posts": 870,
        "likes": 15200
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/x/users/{username}/followingx.user_following

List following

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringX handle without leading @.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/x/users/newdev/following"

Example response

{
  "data": [
    {
      "id": "2244994945",
      "platform": "x",
      "type": "profile",
      "username": "newdev",
      "display_name": "New Dev",
      "description": "Building data APIs.",
      "url": "https://x.com/newdev",
      "profile_image_url": "https://cdn.example.com/avatar/newdev.jpg",
      "banner_image_url": null,
      "location": "Berlin",
      "verified": false,
      "created_at": "2019-04-01T10:15:00Z",
      "metrics": {
        "followers": 1204,
        "following": 312,
        "posts": 870,
        "likes": 15200
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/x/users/{username}/repliesx.user_replies

List user replies

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringX handle without leading @.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/x/users/newdev/replies"

Example response

{
  "data": [
    {
      "id": "1842951234567890123",
      "platform": "x",
      "type": "post",
      "author": {
        "id": "2244994945",
        "username": "newdev",
        "display_name": "New Dev",
        "verified": false
      },
      "text": "One API for internet data.",
      "lang": "en",
      "created_at": "2026-09-17T12:34:56Z",
      "metrics": {
        "likes": 128,
        "reposts": 12,
        "replies": 4,
        "quotes": 1,
        "views": 5230
      },
      "in_reply_to": null,
      "attachments": [],
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/x/users/{username}/mediax.user_media

List user media

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringX handle without leading @.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/x/users/newdev/media"

Example response

{
  "data": [
    {
      "id": "1842951234567890123",
      "platform": "x",
      "type": "post",
      "author": {
        "id": "2244994945",
        "username": "newdev",
        "display_name": "New Dev",
        "verified": false
      },
      "text": "One API for internet data.",
      "lang": "en",
      "created_at": "2026-09-17T12:34:56Z",
      "metrics": {
        "likes": 128,
        "reposts": 12,
        "replies": 4,
        "quotes": 1,
        "views": 5230
      },
      "in_reply_to": null,
      "attachments": [],
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/x/trendsx.trends

Get trends

ParameterLocationRequiredTypeDescription
qqueryOptionalstringCountry for the trends (optional).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/x/trends?q=meshdata"

Example response

{
  "data": {
    "platform": "x",
    "type": "trends",
    "country": "united states",
    "trends": [
      {
        "name": "#MeshData",
        "post_count": 52341
      },
      {
        "name": "Normalized Entities",
        "post_count": 8800,
        "url": "https://x.com/search?q=normalized"
      }
    ],
    "fetched_at": "2026-09-18T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/tiktok/users/{username}tiktok.profile

TikTok profile

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringTikTok uniqueId handle without leading @.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Responses

200Normalized profile of the requested user.

404 — No data available (e.g. cache-only mode without cached entity, or unknown username).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/tiktok/users/newdev"

Example response

{
  "data": {
    "id": "7004994945112",
    "platform": "tiktok",
    "type": "profile",
    "username": "creatordev",
    "display_name": "Creator Dev",
    "description": "Short videos about data APIs.",
    "url": "https://fetchpi.com",
    "profile_image_url": "https://cdn.example.com/avatar/creatordev.jpg",
    "verified": true,
    "is_private": false,
    "created_at": "2017-10-01T00:00:00Z",
    "metrics": {
      "followers": 88230,
      "following": 412,
      "posts": 356,
      "likes": 2140000
    },
    "fetched_at": "2026-09-18T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 120,
      "source_layer": "db",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/tiktok/users/{username}/poststiktok.user_posts

TikTok user posts

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringTikTok uniqueId handle without leading @.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/tiktok/users/newdev/posts"

Example response

{
  "data": [
    {
      "id": "7410886000000000001",
      "platform": "tiktok",
      "type": "post",
      "author": {
        "id": "7004994945112",
        "username": "creatordev",
        "display_name": "Creator Dev",
        "verified": true
      },
      "text": "One API for every platform.",
      "created_at": "2026-09-17T12:34:56Z",
      "metrics": {
        "likes": 864,
        "comments": 42,
        "shares": 87,
        "collects": 310,
        "views": 154203
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover.jpeg",
          "duration_ms": 34567
        }
      ],
      "fetched_at": "2026-09-18T09:00:00Z"
    },
    {
      "id": "7410886000000000002",
      "platform": "tiktok",
      "type": "post",
      "author": {
        "id": "7004994945112",
        "username": "creatordev",
        "display_name": "Creator Dev",
        "verified": true
      },
      "text": "Photo dump from launch week.",
      "created_at": "2026-09-16T08:00:00Z",
      "metrics": {
        "likes": 412,
        "comments": 18,
        "shares": 9,
        "collects": 77,
        "views": 52100
      },
      "attachments": [
        {
          "type": "photo",
          "url": "https://cdn.example.com/p/1.jpeg"
        }
      ],
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": "eyJ2IjoxLCJzcmMiOiJ4dGhpcmQiLCJwb3MiOiIxNzU4MzI2NDAwIn0",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/tiktok/posts/{id}tiktok.post

TikTok post detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringTikTok video id (platform-native, numeric string).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/tiktok/posts/1842951234567890123"

Example response

{
  "data": {
    "id": "7410886000000000001",
    "platform": "tiktok",
    "type": "post",
    "author": {
      "id": "7004994945112",
      "username": "creatordev",
      "display_name": "Creator Dev",
      "verified": true
    },
    "text": "One API for every platform.",
    "created_at": "2026-09-17T12:34:56Z",
    "metrics": {
      "likes": 864,
      "comments": 42,
      "shares": 87,
      "collects": 310,
      "views": 154203
    },
    "attachments": [
      {
        "type": "video",
        "preview_image_url": "https://cdn.example.com/cover.jpeg",
        "duration_ms": 34567
      }
    ],
    "fetched_at": "2026-09-18T07:30:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 3600,
      "source_layer": "cache",
      "stale": false
    },
    "billing": {
      "amount_credits": 0,
      "cache_hit": true
    }
  }
}
GET/v1/tiktok/posts/{id}/commentstiktok.comments

TikTok post comments

ParameterLocationRequiredTypeDescription
idpathRequiredstringTikTok video id (platform-native, numeric string).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/tiktok/posts/1842951234567890123/comments"

Example response

{
  "data": [
    {
      "id": "7411111111000000001",
      "platform": "tiktok",
      "type": "comment",
      "post_id": "7410886000000000001",
      "author": {
        "id": "3311223344",
        "username": "curiousfan",
        "display_name": "Curious Fan",
        "verified": false
      },
      "text": "This is the future of data APIs.",
      "created_at": "2026-09-17T13:00:00Z",
      "metrics": {
        "likes": 12,
        "replies": 2
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 600,
      "source_layer": "db",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/tiktok/search/poststiktok.search_posts

TikTok search videos

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Responses

200Paginated normalized posts matching the query.

404 — Search is unavailable in cache-only mode without results.

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/tiktok/search/posts?q=meshdata"

Example response

{
  "data": [
    {
      "id": "7410999000000000001",
      "platform": "tiktok",
      "type": "post",
      "author": {
        "id": "5566778899001",
        "username": "datafan",
        "display_name": "Data Fan",
        "verified": true
      },
      "text": "normalized entities for every feed!",
      "created_at": "2026-09-15T10:00:00Z",
      "metrics": {
        "likes": 91,
        "comments": 3,
        "shares": 12,
        "collects": 24,
        "views": 40320
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/s1.jpeg",
          "duration_ms": 21000
        }
      ],
      "fetched_at": "2026-09-18T09:05:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "live",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/tiktok/posts/{id}/comments/{comment_id}/repliestiktok.comment_replies

List comment replies

ParameterLocationRequiredTypeDescription
idpathRequiredstringTikTok video id (platform-native, numeric string).
comment_idpathRequiredstringParent comment id whose replies are listed.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/tiktok/posts/1842951234567890123/comments/9901222200001001/replies"

Example response

{
  "data": [
    {
      "id": "7411111111000000001",
      "platform": "tiktok",
      "type": "comment",
      "post_id": "7410886000000000001",
      "author": {
        "id": "3311223344",
        "username": "curiousfan",
        "display_name": "Curious Fan",
        "verified": false
      },
      "text": "This is the future of data APIs.",
      "created_at": "2026-09-17T13:00:00Z",
      "metrics": {
        "likes": 12,
        "replies": 2
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/tiktok/users/{username}/followerstiktok.user_followers

List followers

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringTikTok uniqueId handle without leading @.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/tiktok/users/newdev/followers"

Example response

{
  "data": [
    {
      "id": "7004994945112",
      "platform": "tiktok",
      "type": "profile",
      "username": "creatordev",
      "display_name": "Creator Dev",
      "description": "Short videos about data APIs.",
      "url": "https://fetchpi.com",
      "profile_image_url": "https://cdn.example.com/avatar/creatordev.jpg",
      "verified": true,
      "is_private": false,
      "created_at": "2017-10-01T00:00:00Z",
      "metrics": {
        "followers": 88230,
        "following": 412,
        "posts": 356,
        "likes": 2140000
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/tiktok/users/{username}/followingtiktok.user_following

List following

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringTikTok uniqueId handle without leading @.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/tiktok/users/newdev/following"

Example response

{
  "data": [
    {
      "id": "7004994945112",
      "platform": "tiktok",
      "type": "profile",
      "username": "creatordev",
      "display_name": "Creator Dev",
      "description": "Short videos about data APIs.",
      "url": "https://fetchpi.com",
      "profile_image_url": "https://cdn.example.com/avatar/creatordev.jpg",
      "verified": true,
      "is_private": false,
      "created_at": "2017-10-01T00:00:00Z",
      "metrics": {
        "followers": 88230,
        "following": 412,
        "posts": 356,
        "likes": 2140000
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/tiktok/search/userstiktok.search_users

Search users

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/tiktok/search/users?q=meshdata"

Example response

{
  "query": "data api",
  "data": [
    {
      "id": "7004994945112",
      "platform": "tiktok",
      "type": "profile",
      "username": "creatordev",
      "display_name": "Creator Dev",
      "description": "Short videos about data APIs.",
      "url": "https://fetchpi.com",
      "profile_image_url": "https://cdn.example.com/avatar/creatordev.jpg",
      "verified": true,
      "is_private": false,
      "created_at": "2017-10-01T00:00:00Z",
      "metrics": {
        "followers": 88230,
        "following": 412,
        "posts": 356,
        "likes": 2140000
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/tiktok/hashtags/{tag}tiktok.hashtag

Get hashtag

ParameterLocationRequiredTypeDescription
tagpathRequiredstringTikTok hashtag name (without the #) or, on the posts list, the upstream challenge id forwarded as-is.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/tiktok/hashtags/trending"

Example response

{
  "data": {
    "id": "1600000000000000001",
    "platform": "tiktok",
    "type": "hashtag",
    "name": "meshdata",
    "description": "One API for every platform feed.",
    "cover_image_url": "https://p19-sign-sg.tiktokcdn.com/aweme/hashtag/meshdata.jpeg",
    "metrics": {
      "views": 4820000000
    },
    "fetched_at": "2026-09-18T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/tiktok/hashtags/{tag}/poststiktok.hashtag_posts

List hashtag posts

ParameterLocationRequiredTypeDescription
tagpathRequiredstringTikTok hashtag name (without the #) or, on the posts list, the upstream challenge id forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/tiktok/hashtags/trending/posts"

Example response

{
  "data": [
    {
      "id": "7410886000000000001",
      "platform": "tiktok",
      "type": "post",
      "author": {
        "id": "7004994945112",
        "username": "creatordev",
        "display_name": "Creator Dev",
        "verified": true
      },
      "text": "One API for every platform.",
      "created_at": "2026-09-17T12:34:56Z",
      "metrics": {
        "likes": 864,
        "comments": 42,
        "shares": 87,
        "collects": 310,
        "views": 154203
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover.jpeg",
          "duration_ms": 34567
        }
      ],
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/tiktok/musics/{id}tiktok.music

Get music

ParameterLocationRequiredTypeDescription
idpathRequiredstringTikTok platform-native media id (music id on /musics, room id on /live, video id on /download).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/tiktok/musics/1842951234567890123"

Example response

{
  "data": {
    "id": "7416880000000000001",
    "platform": "tiktok",
    "type": "music",
    "title": "Sim Song (prod. Creator Dev)",
    "author_name": "Creator Dev",
    "duration_ms": 34567,
    "cover_image_url": "https://p16-sign-sg.tiktokcdn.com/aweme/music/7416880000000000001.jpeg",
    "metrics": {
      "videos": 128000
    },
    "fetched_at": "2026-09-18T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/tiktok/live/{id}tiktok.live_room

Get live room

ParameterLocationRequiredTypeDescription
idpathRequiredstringTikTok platform-native media id (music id on /musics, room id on /live, video id on /download).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/tiktok/live/1842951234567890123"

Example response

{
  "data": {
    "id": "8800000000000000001",
    "platform": "tiktok",
    "type": "live_room",
    "title": "Live: normalized entities Q&A",
    "username": "creatordev",
    "display_name": "Creator Dev",
    "status": "LIVE",
    "viewer_count": 2345,
    "started_at": "2026-09-20T00:00:00Z",
    "cover_image_url": "https://p19-sign-sg.tiktokcdn.com/aweme/live/8800000000000000001.jpeg",
    "fetched_at": "2026-09-18T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/tiktok/search/livetiktok.live_search

Search live rooms

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/tiktok/search/live?q=meshdata"

Example response

{
  "query": "data talk",
  "data": [
    {
      "id": "8800000000000000001",
      "platform": "tiktok",
      "type": "live_room",
      "title": "Live: normalized entities Q&A",
      "username": "creatordev",
      "display_name": "Creator Dev",
      "status": "LIVE",
      "viewer_count": 2345,
      "started_at": "2026-09-20T00:00:00Z",
      "cover_image_url": "https://p19-sign-sg.tiktokcdn.com/aweme/live/8800000000000000001.jpeg",
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/tiktok/homefeedtiktok.homefeed

Get home feed

ParameterLocationRequiredTypeDescription
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/tiktok/homefeed"

Example response

{
  "data": [
    {
      "id": "7410886000000000001",
      "platform": "tiktok",
      "type": "post",
      "author": {
        "id": "7004994945112",
        "username": "creatordev",
        "display_name": "Creator Dev",
        "verified": true
      },
      "text": "One API for every platform.",
      "created_at": "2026-09-17T12:34:56Z",
      "metrics": {
        "likes": 864,
        "comments": 42,
        "shares": 87,
        "collects": 310,
        "views": 154203
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover.jpeg",
          "duration_ms": 34567
        }
      ],
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/tiktok/download/{id}tiktok.download

Resolve download

ParameterLocationRequiredTypeDescription
idpathRequiredstringTikTok platform-native media id (music id on /musics, room id on /live, video id on /download).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/tiktok/download/1842951234567890123"

Example response

{
  "data": {
    "id": "7412050000000000001",
    "platform": "tiktok",
    "type": "download",
    "play_url": "https://v16-webapp.tiktok.com/aweme/v1/play/?video_id=7412050000000000001&no-watermark=1",
    "preview_image_url": "https://p19-sign-sg.tiktokcdn.com/aweme/cover/7412050000000000001.jpeg",
    "duration_ms": 34567,
    "fetched_at": "2026-09-18T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/ig/users/{username}ig.profile

Instagram profile

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringInstagram username without leading @.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Responses

200Normalized profile of the requested user.

404 — No data available (e.g. cache-only mode without cached entity, or unknown username).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/ig/users/newdev"

Example response

{
  "data": {
    "id": "1295448945",
    "platform": "instagram",
    "type": "profile",
    "username": "creatordev",
    "display_name": "Creator Dev",
    "description": "Photo dumps and API graphs.",
    "url": "https://fetchpi.com",
    "profile_image_url": "https://cdn.example.com/profile_pic/creatordev.jpg",
    "verified": true,
    "is_private": false,
    "created_at": null,
    "metrics": {
      "followers": 51230,
      "following": 310,
      "posts": 862
    },
    "fetched_at": "2026-09-18T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 120,
      "source_layer": "db",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/ig/users/{username}/postsig.user_posts

Instagram user posts

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringInstagram username without leading @.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/ig/users/newdev/posts"

Example response

{
  "data": [
    {
      "id": "CwxOne00001",
      "platform": "instagram",
      "type": "post",
      "author": {
        "id": "1295448945",
        "username": "creatordev",
        "display_name": "Creator Dev",
        "verified": true
      },
      "text": "Carousel dump",
      "created_at": "2026-09-17T12:34:56Z",
      "metrics": {
        "likes": 1204,
        "comments": 36,
        "views": 0
      },
      "attachments": [
        {
          "type": "photo",
          "url": "https://cdn.example.com/1.jpg"
        },
        {
          "type": "photo",
          "url": "https://cdn.example.com/2.jpg"
        }
      ],
      "fetched_at": "2026-09-18T09:00:00Z"
    },
    {
      "id": "CwxTwo00002",
      "platform": "instagram",
      "type": "post",
      "author": {
        "id": "1295448945",
        "username": "creatordev",
        "display_name": "Creator Dev",
        "verified": true
      },
      "text": "Reel day",
      "created_at": "2026-09-16T08:00:00Z",
      "metrics": {
        "likes": 640,
        "comments": 21,
        "views": 60110
      },
      "attachments": [
        {
          "type": "video",
          "url": "https://cdn.example.com/reel2.mp4",
          "duration_ms": 30100
        }
      ],
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": "QVFBQ2daOTItcGxhdGZvcm0",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/ig/posts/{id}ig.post

Instagram post detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringInstagram post SHORTCODE (the /p/{code} addressing key).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/ig/posts/1842951234567890123"

Example response

{
  "data": {
    "id": "Creel00001",
    "platform": "instagram",
    "type": "post",
    "author": {
      "id": "1295448945",
      "username": "creatordev",
      "display_name": "Creator Dev",
      "verified": true
    },
    "text": "Reel day",
    "created_at": "2026-09-17T12:34:56Z",
    "metrics": {
      "likes": 1204,
      "comments": 36,
      "views": 88231
    },
    "attachments": [
      {
        "type": "video",
        "url": "https://cdn.example.com/reel.mp4",
        "duration_ms": 32500
      }
    ],
    "fetched_at": "2026-09-18T07:30:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 3600,
      "source_layer": "cache",
      "stale": false
    },
    "billing": {
      "amount_credits": 0,
      "cache_hit": true
    }
  }
}
GET/v1/ig/posts/{id}/commentsig.comments

Instagram post comments

ParameterLocationRequiredTypeDescription
idpathRequiredstringInstagram post SHORTCODE (the /p/{code} addressing key).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/ig/posts/1842951234567890123/comments"

Example response

{
  "data": [
    {
      "id": "17990000000000001",
      "platform": "instagram",
      "type": "comment",
      "post_id": "CwxOne00001",
      "author": {
        "id": "8811223344",
        "username": "curiousfan",
        "display_name": "Curious Fan",
        "verified": false
      },
      "text": "Clean normalized shape!",
      "created_at": "2026-09-17T13:00:00Z",
      "metrics": {
        "likes": 5
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 600,
      "source_layer": "db",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/ig/search/postsig.search_posts

Instagram search posts

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Responses

200Paginated normalized posts matching the query.

404 — Search is unavailable in cache-only mode without results.

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/ig/search/posts?q=meshdata"

Example response

{
  "data": [
    {
      "id": "Creel00001",
      "platform": "instagram",
      "type": "post",
      "author": {
        "id": "5566778899001",
        "username": "datafan",
        "display_name": "Data Fan",
        "verified": true
      },
      "text": "search hit one",
      "created_at": "2026-09-15T10:00:00Z",
      "metrics": {
        "likes": 341,
        "comments": 12,
        "views": 88231
      },
      "attachments": [
        {
          "type": "video",
          "url": "https://cdn.example.com/reel1.mp4",
          "duration_ms": 32500
        }
      ],
      "fetched_at": "2026-09-18T09:05:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "live",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/ig/posts/{id}/comments/{comment_id}/repliesig.comment_replies

List comment replies

ParameterLocationRequiredTypeDescription
idpathRequiredstringInstagram post SHORTCODE (the /p/{code} addressing key).
comment_idpathRequiredstringParent comment id whose replies are listed.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/ig/posts/1842951234567890123/comments/9901222200001001/replies"

Example response

{
  "data": [
    {
      "id": "17990000000000001",
      "platform": "instagram",
      "type": "comment",
      "post_id": "CwxOne00001",
      "author": {
        "id": "8811223344",
        "username": "curiousfan",
        "display_name": "Curious Fan",
        "verified": false
      },
      "text": "Clean normalized shape!",
      "created_at": "2026-09-17T13:00:00Z",
      "metrics": {
        "likes": 5
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/ig/users/{username}/followersig.user_followers

List followers

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringInstagram username without leading @.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/ig/users/newdev/followers"

Example response

{
  "data": [
    {
      "id": "1295448945",
      "platform": "instagram",
      "type": "profile",
      "username": "creatordev",
      "display_name": "Creator Dev",
      "description": "Photo dumps and API graphs.",
      "url": "https://fetchpi.com",
      "profile_image_url": "https://cdn.example.com/profile_pic/creatordev.jpg",
      "verified": true,
      "is_private": false,
      "created_at": null,
      "metrics": {
        "followers": 51230,
        "following": 310,
        "posts": 862
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/ig/users/{username}/followingig.user_following

List following

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringInstagram username without leading @.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/ig/users/newdev/following"

Example response

{
  "data": [
    {
      "id": "1295448945",
      "platform": "instagram",
      "type": "profile",
      "username": "creatordev",
      "display_name": "Creator Dev",
      "description": "Photo dumps and API graphs.",
      "url": "https://fetchpi.com",
      "profile_image_url": "https://cdn.example.com/profile_pic/creatordev.jpg",
      "verified": true,
      "is_private": false,
      "created_at": null,
      "metrics": {
        "followers": 51230,
        "following": 310,
        "posts": 862
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/ig/search/usersig.search_users

Search users

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/ig/search/users?q=meshdata"

Example response

{
  "query": "data api",
  "data": [
    {
      "id": "1295448945",
      "platform": "instagram",
      "type": "profile",
      "username": "creatordev",
      "display_name": "Creator Dev",
      "description": "Photo dumps and API graphs.",
      "url": "https://fetchpi.com",
      "profile_image_url": "https://cdn.example.com/profile_pic/creatordev.jpg",
      "verified": true,
      "is_private": false,
      "created_at": null,
      "metrics": {
        "followers": 51230,
        "following": 310,
        "posts": 862
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/ig/users/{username}/storiesig.stories

List stories

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringInstagram username without leading @.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/ig/users/newdev/stories"

Example response

{
  "data": [
    {
      "id": "CwxOne00001",
      "platform": "instagram",
      "type": "post",
      "author": {
        "id": "1295448945",
        "username": "creatordev",
        "display_name": "Creator Dev",
        "verified": true
      },
      "text": "Carousel dump #1",
      "created_at": "2026-09-17T12:34:56Z",
      "metrics": {
        "likes": 1204,
        "comments": 36,
        "views": 0
      },
      "attachments": [
        {
          "type": "photo",
          "url": "https://cdn.example.com/1.jpg"
        },
        {
          "type": "photo",
          "url": "https://cdn.example.com/2.jpg"
        }
      ],
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/ig/users/{username}/highlightsig.highlights

List highlights

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringInstagram username without leading @.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/ig/users/newdev/highlights"

Example response

{
  "data": [
    {
      "id": "highlight_launch",
      "platform": "instagram",
      "type": "highlight",
      "title": "Launch Week",
      "username": "creatordev",
      "cover_image_url": "https://scontent.cdninstagram.com/hl-launch.jpg",
      "media_count": 3,
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/ig/posts/{id}/likersig.post_likers

List post likers

ParameterLocationRequiredTypeDescription
idpathRequiredstringInstagram post SHORTCODE (the /p/{code} addressing key).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/ig/posts/1842951234567890123/likers"

Example response

{
  "data": [
    {
      "id": "1295448945",
      "platform": "instagram",
      "type": "profile",
      "username": "creatordev",
      "display_name": "Creator Dev",
      "description": "Photo dumps and API graphs.",
      "url": "https://fetchpi.com",
      "profile_image_url": "https://cdn.example.com/profile_pic/creatordev.jpg",
      "verified": true,
      "is_private": false,
      "created_at": null,
      "metrics": {
        "followers": 51230,
        "following": 310,
        "posts": 862
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/xhs/users/{username}xhs.profile

Xiaohongshu profile

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringXiaohongshu user id — the upstream app surface addresses users by numeric user id, so the caller value is forwarded as-is (handle lookup is a pending upstream calibration).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Responses

200Normalized profile of the requested user.

404 — No data available (e.g. cache-only mode without cached entity, or unknown user).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/xhs/users/newdev"

Example response

{
  "data": {
    "id": "66f2a1de000000001e0167a1",
    "platform": "xiaohongshu",
    "type": "profile",
    "username": "creatordev",
    "display_name": "Creator Dev",
    "description": "Notes about data APIs.",
    "profile_image_url": "https://cdn.example.com/avatar/creatordev.jpg",
    "verified": true,
    "created_at": null,
    "metrics": {
      "followers": 51230,
      "following": 310,
      "posts": 862,
      "likes": 2140000
    },
    "fetched_at": "2026-09-18T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 120,
      "source_layer": "db",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/xhs/users/{username}/postsxhs.user_posts

Xiaohongshu user posts

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringXiaohongshu user id — the upstream app surface addresses users by numeric user id, so the caller value is forwarded as-is (handle lookup is a pending upstream calibration).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/xhs/users/newdev/posts"

Example response

{
  "data": [
    {
      "id": "66f2b1de000000001f0167a1",
      "platform": "xiaohongshu",
      "type": "post",
      "author": null,
      "title": "First note on the platform.",
      "text": null,
      "created_at": null,
      "metrics": {
        "likes": 512,
        "collects": 0,
        "comments": 0,
        "shares": 0
      },
      "attachments": [
        {
          "type": "photo",
          "url": "https://cdn.example.com/n1-cover.jpg"
        }
      ],
      "fetched_at": "2026-09-18T09:00:00Z"
    },
    {
      "id": "66f2b1de000000001f0167a2",
      "platform": "xiaohongshu",
      "type": "post",
      "author": null,
      "title": "Freshness modes, explained in 30s.",
      "text": null,
      "created_at": null,
      "metrics": {
        "likes": 512,
        "collects": 0,
        "comments": 0,
        "shares": 0
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/n2-cover.jpg"
        }
      ],
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": "eyJ2IjoxLCJzcmMiOiJ4dGhpcmQiLCJwb3MiOiI2NmYyYjFkZTAwIn0",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/xhs/posts/{id}xhs.post

Xiaohongshu post detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringXiaohongshu note id.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/xhs/posts/1842951234567890123"

Example response

{
  "data": {
    "id": "66f2b1de000000001f0167a1",
    "platform": "xiaohongshu",
    "type": "post",
    "author": {
      "id": "66f2a1de000000001e0167a1",
      "username": "creatordev",
      "display_name": "Creator Dev",
      "verified": true
    },
    "title": "One API for every feed.",
    "text": "One API for every platform.",
    "created_at": "2026-09-17T12:34:56Z",
    "metrics": {
      "likes": 1204,
      "collects": 310,
      "comments": 42,
      "shares": 87
    },
    "attachments": [
      {
        "type": "video",
        "url": "https://cdn.example.com/note.mp4",
        "preview_image_url": "https://cdn.example.com/note-cover.jpg"
      }
    ],
    "fetched_at": "2026-09-18T07:30:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 3600,
      "source_layer": "cache",
      "stale": false
    },
    "billing": {
      "amount_credits": 0,
      "cache_hit": true
    }
  }
}
GET/v1/xhs/posts/{id}/commentsxhs.comments

Xiaohongshu post comments

ParameterLocationRequiredTypeDescription
idpathRequiredstringXiaohongshu note id.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/xhs/posts/1842951234567890123/comments"

Example response

{
  "data": [
    {
      "id": "66f3a1de000000001f0267c1",
      "platform": "xiaohongshu",
      "type": "comment",
      "post_id": "66f2b1de000000001f0167a1",
      "author": {
        "id": "66f1a1de000000001f0167d1",
        "username": "curiousfan",
        "display_name": "Curious Fan",
        "verified": false
      },
      "text": "This is the future of data APIs.",
      "created_at": "2026-09-17T13:06:40Z",
      "metrics": {
        "likes": 12,
        "replies": 2
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 600,
      "source_layer": "db",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/xhs/search/postsxhs.search_posts

Xiaohongshu search posts

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Responses

200Paginated normalized posts matching the query.

404 — Search is unavailable in cache-only mode without results.

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/xhs/search/posts?q=meshdata"

Example response

{
  "data": [
    {
      "id": "66f2c1de000000001f0167b1",
      "platform": "xiaohongshu",
      "type": "post",
      "author": null,
      "title": "search hit one",
      "text": null,
      "created_at": null,
      "metrics": {
        "likes": 512,
        "collects": 0,
        "comments": 0,
        "shares": 0
      },
      "attachments": [
        {
          "type": "photo",
          "url": "https://cdn.example.com/s1-cover.jpg"
        }
      ],
      "fetched_at": "2026-09-18T09:05:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "live",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/xhs/posts/{id}/comments/{comment_id}/repliesxhs.comment_replies

List comment replies

ParameterLocationRequiredTypeDescription
idpathRequiredstringTikTok video id (platform-native, numeric string).
comment_idpathRequiredstringParent comment id whose sub-comments are listed.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/xhs/posts/1842951234567890123/comments/9901222200001001/replies"

Example response

{
  "data": [
    {
      "id": "66f3a1de000000001f0267c1",
      "platform": "xiaohongshu",
      "type": "comment",
      "post_id": "66f2b1de000000001f0167a1",
      "author": {
        "id": "66f1a1de000000001f0167d1",
        "username": "curiousfan",
        "display_name": "Curious Fan",
        "verified": false
      },
      "text": "This is the future of data APIs.",
      "created_at": "2026-09-17T13:06:40Z",
      "metrics": {
        "likes": 12,
        "replies": 2
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/xhs/search/usersxhs.search_users

Search users

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/xhs/search/users?q=meshdata"

Example response

{
  "query": "data api",
  "data": [
    {
      "id": "66f2a1de000000001e0167a1",
      "platform": "xiaohongshu",
      "type": "profile",
      "username": "creatordev",
      "display_name": "Creator Dev",
      "description": "Notes about data APIs.",
      "profile_image_url": "https://cdn.example.com/avatar/creatordev.jpg",
      "verified": true,
      "created_at": null,
      "metrics": {
        "followers": 51230,
        "following": 310,
        "posts": 862,
        "likes": 2140000
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/xhs/homefeedxhs.homefeed

Get home feed

ParameterLocationRequiredTypeDescription
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/xhs/homefeed"

Example response

{
  "data": [
    {
      "id": "66f2b1de000000001f0167a1",
      "platform": "xiaohongshu",
      "type": "post",
      "author": {
        "id": "66f2a1de000000001e0167a1",
        "username": "creatordev",
        "display_name": "Creator Dev",
        "verified": true
      },
      "title": "One API for every feed.",
      "text": "One API for every platform.",
      "created_at": "2026-09-17T12:34:56Z",
      "metrics": {
        "likes": 1204,
        "collects": 310,
        "comments": 42,
        "shares": 87
      },
      "attachments": [
        {
          "type": "video",
          "url": "https://cdn.example.com/note.mp4",
          "preview_image_url": "https://cdn.example.com/note-cover.jpg"
        }
      ],
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/youtube/users/{username}youtube.profile

YouTube channel profile (a channel is the platform user)

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringYouTube channel id (UC…) — the channel is the platform user; the upstream addresses channels by channel id, so the caller value is forwarded as-is (handle tolerance is a pending upstream calibration).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Responses

200Normalized profile of the requested user.

404 — No data available (e.g. cache-only mode without cached entity, or unknown channel).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/youtube/users/newdev"

Example response

{
  "data": {
    "id": "UCsim0000000000000000777",
    "platform": "youtube",
    "type": "profile",
    "username": "creatordev",
    "display_name": "Creator Dev",
    "description": "Videos about data APIs.",
    "url": "https://www.youtube.com/@creatordev",
    "profile_image_url": "https://cdn.example.com/avatar/creatordev.jpg",
    "verified": true,
    "created_at": "2019-04-01T10:15:00Z",
    "metrics": {
      "subscribers": 51230,
      "views": 19824567,
      "posts": 862
    },
    "fetched_at": "2026-09-18T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 120,
      "source_layer": "db",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/youtube/users/{username}/postsyoutube.user_posts

YouTube channel videos

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringYouTube channel id (UC…) — the channel is the platform user; the upstream addresses channels by channel id, so the caller value is forwarded as-is (handle tolerance is a pending upstream calibration).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/youtube/users/newdev/posts"

Example response

{
  "data": [
    {
      "id": "wSimVideo0001",
      "platform": "youtube",
      "type": "post",
      "author": null,
      "title": "First video on the platform.",
      "text": null,
      "created_at": "2026-09-16T08:00:00Z",
      "metrics": {
        "views": 0,
        "likes": 0,
        "comments": 0
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/t1.jpg",
          "duration_ms": 30000
        }
      ],
      "fetched_at": "2026-09-18T09:00:00Z"
    },
    {
      "id": "wSimVideo0002",
      "platform": "youtube",
      "type": "post",
      "author": null,
      "title": "Freshness modes, explained in 30s.",
      "text": null,
      "created_at": "2026-09-15T08:00:00Z",
      "metrics": {
        "views": 52100,
        "likes": 0,
        "comments": 0
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/t2.jpg",
          "duration_ms": 30000
        }
      ],
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": "eyJ2IjoxLCJzcmMiOiJ4dGhpcmQiLCJwb3MiOiJDQlFTRCJ9",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/youtube/posts/{id}youtube.post

YouTube post detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringYouTube video id.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/youtube/posts/1842951234567890123"

Example response

{
  "data": {
    "id": "wSimVideo0001",
    "platform": "youtube",
    "type": "post",
    "author": {
      "id": "UCsim0000000000000000777",
      "username": "creatordev",
      "display_name": "Creator Dev",
      "verified": true
    },
    "title": "One API for every platform.",
    "text": "One API for every platform.",
    "created_at": "2026-09-17T12:34:56Z",
    "metrics": {
      "views": 154203,
      "likes": 864,
      "comments": 42
    },
    "attachments": [
      {
        "type": "video",
        "preview_image_url": "https://cdn.example.com/thumb.jpg",
        "duration_ms": 212000
      }
    ],
    "fetched_at": "2026-09-18T07:30:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 3600,
      "source_layer": "cache",
      "stale": false
    },
    "billing": {
      "amount_credits": 0,
      "cache_hit": true
    }
  }
}
GET/v1/youtube/posts/{id}/commentsyoutube.comments

YouTube video comments

ParameterLocationRequiredTypeDescription
idpathRequiredstringYouTube video id.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/youtube/posts/1842951234567890123/comments"

Example response

{
  "data": [
    {
      "id": "UgxSim000000000001",
      "platform": "youtube",
      "type": "comment",
      "post_id": "wSimVideo0001",
      "author": {
        "id": "UCsimfan000000000001",
        "username": "curiousfan",
        "display_name": "Curious Fan",
        "verified": false
      },
      "text": "This is the future of data APIs.",
      "created_at": "2026-09-17T13:00:00Z",
      "metrics": {
        "likes": 12,
        "replies": 2
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 600,
      "source_layer": "db",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/youtube/search/postsyoutube.search_posts

YouTube search videos

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Responses

200Paginated normalized posts matching the query.

404 — Search is unavailable in cache-only mode without results.

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/youtube/search/posts?q=meshdata"

Example response

{
  "data": [
    {
      "id": "sSimVideo001",
      "platform": "youtube",
      "type": "post",
      "author": {
        "id": "UCsimsearch00000000001",
        "username": "datafan",
        "display_name": "Data Fan",
        "verified": false
      },
      "title": "normalized entities for every feed!",
      "text": null,
      "created_at": null,
      "metrics": {
        "views": 0,
        "likes": 0,
        "comments": 0
      },
      "attachments": [],
      "fetched_at": "2026-09-18T09:05:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "live",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/youtube/search/usersyoutube.search_users

Search channels

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/youtube/search/users?q=meshdata"

Example response

{
  "query": "data api",
  "data": [
    {
      "id": "UCsim0000000000000000777",
      "platform": "youtube",
      "type": "profile",
      "username": "creatordev",
      "display_name": "Creator Dev",
      "description": "Videos about data APIs.",
      "url": "https://www.youtube.com/@creatordev",
      "profile_image_url": "https://cdn.example.com/avatar/creatordev.jpg",
      "verified": true,
      "created_at": "2019-04-01T10:15:00Z",
      "metrics": {
        "subscribers": 51230,
        "views": 19824567,
        "posts": 862
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/reddit/users/{username}reddit.profile

Reddit profile

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringReddit username without u/.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Responses

200Normalized profile of the requested user.

404 — No data available (e.g. cache-only mode without cached entity, or unknown username).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/reddit/users/newdev"

Example response

{
  "data": {
    "id": "1a2b3c",
    "platform": "reddit",
    "type": "profile",
    "username": "creatordev",
    "display_name": "Creator Dev",
    "description": "Posts about data APIs.",
    "profile_image_url": "https://cdn.example.com/avatar/creatordev.png",
    "verified": true,
    "created_at": "2019-04-01T08:15:00Z",
    "metrics": {
      "karma_posts": 8620,
      "karma_comments": 15300,
      "total_karma": 24100,
      "followers": 4811
    },
    "fetched_at": "2026-09-18T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 120,
      "source_layer": "db",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/reddit/users/{username}/postsreddit.user_posts

Reddit user posts

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringReddit username without u/.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/reddit/users/newdev/posts"

Example response

{
  "data": [
    {
      "id": "1simpost01",
      "platform": "reddit",
      "type": "post",
      "author": {
        "id": "7004994945",
        "username": "creatordev",
        "display_name": null,
        "verified": false
      },
      "title": "First post on the platform.",
      "text": "One API for every platform.",
      "url": "https://www.reddit.com/r/dataapi/comments/1simpost01/",
      "created_at": "2026-09-16T19:23:20Z",
      "metrics": {
        "upvotes": 864,
        "downvotes": 12,
        "comments": 42
      },
      "attachments": [],
      "fetched_at": "2026-09-18T09:00:00Z"
    },
    {
      "id": "1simpost02",
      "platform": "reddit",
      "type": "post",
      "author": {
        "id": "7004994945",
        "username": "creatordev",
        "display_name": null,
        "verified": false
      },
      "title": "Freshness modes, explained.",
      "text": "One API for every platform.",
      "url": "https://www.reddit.com/r/dataapi/comments/1simpost02/",
      "created_at": "2026-09-16T08:00:00Z",
      "metrics": {
        "upvotes": 412,
        "downvotes": 9,
        "comments": 18
      },
      "attachments": [
        {
          "type": "photo",
          "url": "https://cdn.example.com/p1-full.jpg",
          "preview_image_url": "https://cdn.example.com/p1.jpg"
        },
        {
          "type": "video",
          "url": "https://cdn.example.com/p2.mp4",
          "preview_image_url": "https://cdn.example.com/p2.jpg"
        }
      ],
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": "eyJ2IjoxLCJzcmMiOiJ4dGhpcmQiLCJwb3MiOiJ0M19zaW0ifQ",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/reddit/posts/{id}reddit.post

Reddit post detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringReddit post id (t3 base36 without prefix).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/reddit/posts/1842951234567890123"

Example response

{
  "data": {
    "id": "1simpost01",
    "platform": "reddit",
    "type": "post",
    "author": {
      "id": "7004994945",
      "username": "creatordev",
      "display_name": null,
      "verified": false
    },
    "title": "One API for every platform.",
    "text": "One API for every platform.",
    "url": "https://www.reddit.com/r/dataapi/comments/1simpost01/",
    "created_at": "2026-09-17T12:34:56Z",
    "metrics": {
      "upvotes": 864,
      "downvotes": 12,
      "comments": 42
    },
    "attachments": [],
    "fetched_at": "2026-09-18T07:30:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 3600,
      "source_layer": "cache",
      "stale": false
    },
    "billing": {
      "amount_credits": 0,
      "cache_hit": true
    }
  }
}
GET/v1/reddit/posts/{id}/commentsreddit.comments

Reddit post comments

ParameterLocationRequiredTypeDescription
idpathRequiredstringReddit post id (t3 base36 without prefix).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/reddit/posts/1842951234567890123/comments"

Example response

{
  "data": [
    {
      "id": "simcomment1",
      "platform": "reddit",
      "type": "comment",
      "post_id": "1simpost01",
      "author": {
        "id": "fan0000001",
        "username": "curiousfan",
        "display_name": null,
        "verified": false
      },
      "text": "This is the future of data APIs.",
      "created_at": "2026-09-17T13:06:40Z",
      "metrics": {
        "upvotes": 12,
        "downvotes": 1
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 600,
      "source_layer": "db",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/reddit/search/postsreddit.search_posts

Reddit search posts

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Responses

200Paginated normalized posts matching the query.

404 — Search is unavailable in cache-only mode without results.

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/reddit/search/posts?q=meshdata"

Example response

{
  "data": [
    {
      "id": "1simsear01",
      "platform": "reddit",
      "type": "post",
      "author": {
        "id": "5566778899",
        "username": "datafan",
        "display_name": null,
        "verified": false
      },
      "title": "normalized entities for every feed!",
      "text": "One API for every platform.",
      "url": "https://www.reddit.com/r/dataapi/comments/1simsear01/",
      "created_at": "2026-09-17T12:34:56Z",
      "metrics": {
        "upvotes": 91,
        "downvotes": 2,
        "comments": 3
      },
      "attachments": [],
      "fetched_at": "2026-09-18T09:05:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "live",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/reddit/search/usersreddit.search_users

Search users

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/reddit/search/users?q=meshdata"

Example response

{
  "query": "data api",
  "data": [
    {
      "id": "1a2b3c",
      "platform": "reddit",
      "type": "profile",
      "username": "creatordev",
      "display_name": "Creator Dev",
      "description": "Posts about data APIs.",
      "profile_image_url": "https://cdn.example.com/avatar/creatordev.png",
      "verified": true,
      "created_at": "2019-04-01T08:15:00Z",
      "metrics": {
        "karma_posts": 8620,
        "karma_comments": 15300,
        "total_karma": 24100,
        "followers": 4811
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/reddit/subreddits/{name}/postsreddit.subreddit_posts

List subreddit posts

ParameterLocationRequiredTypeDescription
namepathRequiredstringSubreddit name without r/.
sortqueryOptionalhot | new | top = hotUpstream feed order of the subreddit posts list.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/reddit/subreddits/technology/posts"

Example response

{
  "data": [
    {
      "id": "1simpost01",
      "platform": "reddit",
      "type": "post",
      "author": {
        "id": "7004994945",
        "username": "creatordev",
        "display_name": null,
        "verified": false
      },
      "title": "One API for every platform.",
      "text": "One API for every platform.",
      "url": "https://www.reddit.com/r/dataapi/comments/1simpost01/",
      "created_at": "2026-09-17T12:34:56Z",
      "metrics": {
        "upvotes": 864,
        "downvotes": 12,
        "comments": 42
      },
      "attachments": [],
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/reddit/users/{username}/commentsreddit.user_comments

List user comments

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringReddit username without u/.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/reddit/users/newdev/comments"

Example response

{
  "data": [
    {
      "id": "simcomment1",
      "platform": "reddit",
      "type": "comment",
      "post_id": "1simpost01",
      "author": {
        "id": "fan0000001",
        "username": "curiousfan",
        "display_name": null,
        "verified": false
      },
      "text": "This is the future of data APIs.",
      "created_at": "2026-09-17T13:06:40Z",
      "metrics": {
        "upvotes": 12,
        "downvotes": 1
      },
      "fetched_at": "2026-09-18T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/douyin/users/{username}douyin.profile

Douyin profile

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringDouyin user addressing key (sec_user_id) — the upstream addresses users by sec_user_id, so the caller value is forwarded as-is (handle lookup is a pending upstream calibration).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/douyin/users/newdev"

Example response

{
  "data": {
    "id": "7004994945113",
    "platform": "douyin",
    "type": "profile",
    "username": "meshdata_dev",
    "display_name": "MeshData 抖音站",
    "description": "短视频形式的数据 API 教程。",
    "url": "https://fetchpi.com",
    "profile_image_url": "https://cdn.example.com/avatar/douyin-meshdata.jpg",
    "verified": true,
    "created_at": "2019-06-01T00:00:00Z",
    "metrics": {
      "followers": 1288000,
      "following": 88,
      "posts": 412,
      "likes": 18600000
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/douyin/posts/{id}douyin.post

Douyin post detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringDouyin video id (platform-native aweme id; also the addressing key on /download).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/douyin/posts/1842951234567890123"

Example response

{
  "data": {
    "id": "7412050000000001001",
    "platform": "douyin",
    "type": "post",
    "author": {
      "id": "7004994945113",
      "username": "meshdata_dev",
      "display_name": "MeshData 抖音站",
      "verified": true
    },
    "text": "一条关于数据 API 的短视频。",
    "created_at": "2026-09-17T12:34:56Z",
    "metrics": {
      "likes": 32810,
      "comments": 1204,
      "shares": 988,
      "collects": 5600,
      "views": 2140000
    },
    "attachments": [
      {
        "type": "video",
        "preview_image_url": "https://cdn.example.com/cover/douyin-7412050000000001001.jpeg",
        "duration_ms": 45678
      }
    ],
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/douyin/users/{username}/postsdouyin.user_posts

Douyin user posts

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringDouyin user addressing key (sec_user_id) — the upstream addresses users by sec_user_id, so the caller value is forwarded as-is (handle lookup is a pending upstream calibration).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/douyin/users/newdev/posts"

Example response

{
  "data": [
    {
      "id": "7412050000000001001",
      "platform": "douyin",
      "type": "post",
      "author": {
        "id": "7004994945113",
        "username": "meshdata_dev",
        "display_name": "MeshData 抖音站",
        "verified": true
      },
      "text": "一条关于数据 API 的短视频。",
      "created_at": "2026-09-17T12:34:56Z",
      "metrics": {
        "likes": 32810,
        "comments": 1204,
        "shares": 988,
        "collects": 5600,
        "views": 2140000
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover/douyin-7412050000000001001.jpeg",
          "duration_ms": 45678
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/douyin/posts/{id}/commentsdouyin.comments

Douyin post comments

ParameterLocationRequiredTypeDescription
idpathRequiredstringDouyin video id (platform-native aweme id; also the addressing key on /download).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/douyin/posts/1842951234567890123/comments"

Example response

{
  "data": [
    {
      "id": "7411222200000001001",
      "platform": "douyin",
      "type": "comment",
      "post_id": "7412050000000001001",
      "author": {
        "id": "7004994945114",
        "username": "commentfan",
        "display_name": "评论粉丝",
        "verified": false
      },
      "text": "讲得清楚,赞。",
      "created_at": "2026-09-17T13:01:22Z",
      "metrics": {
        "likes": 823,
        "replies": 12
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/douyin/posts/{id}/comments/{comment_id}/repliesdouyin.comment_replies

Douyin comment replies

ParameterLocationRequiredTypeDescription
idpathRequiredstringDouyin video id (platform-native aweme id; also the addressing key on /download).
comment_idpathRequiredstringParent comment id whose replies are listed.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/douyin/posts/1842951234567890123/comments/9901222200001001/replies"

Example response

{
  "data": [
    {
      "id": "7411222200000001001",
      "platform": "douyin",
      "type": "comment",
      "post_id": "7412050000000001001",
      "author": {
        "id": "7004994945114",
        "username": "commentfan",
        "display_name": "评论粉丝",
        "verified": false
      },
      "text": "讲得清楚,赞。",
      "created_at": "2026-09-17T13:01:22Z",
      "metrics": {
        "likes": 823,
        "replies": 12
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/douyin/users/{username}/followersdouyin.user_followers

Douyin user followers

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringDouyin user addressing key (sec_user_id) — the upstream addresses users by sec_user_id, so the caller value is forwarded as-is (handle lookup is a pending upstream calibration).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/douyin/users/newdev/followers"

Example response

{
  "data": [
    {
      "id": "7004994945113",
      "platform": "douyin",
      "type": "profile",
      "username": "meshdata_dev",
      "display_name": "MeshData 抖音站",
      "description": "短视频形式的数据 API 教程。",
      "url": "https://fetchpi.com",
      "profile_image_url": "https://cdn.example.com/avatar/douyin-meshdata.jpg",
      "verified": true,
      "created_at": "2019-06-01T00:00:00Z",
      "metrics": {
        "followers": 1288000,
        "following": 88,
        "posts": 412,
        "likes": 18600000
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/douyin/users/{username}/followingdouyin.user_following

Douyin user following

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringDouyin user addressing key (sec_user_id) — the upstream addresses users by sec_user_id, so the caller value is forwarded as-is (handle lookup is a pending upstream calibration).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/douyin/users/newdev/following"

Example response

{
  "data": [
    {
      "id": "7004994945113",
      "platform": "douyin",
      "type": "profile",
      "username": "meshdata_dev",
      "display_name": "MeshData 抖音站",
      "description": "短视频形式的数据 API 教程。",
      "url": "https://fetchpi.com",
      "profile_image_url": "https://cdn.example.com/avatar/douyin-meshdata.jpg",
      "verified": true,
      "created_at": "2019-06-01T00:00:00Z",
      "metrics": {
        "followers": 1288000,
        "following": 88,
        "posts": 412,
        "likes": 18600000
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/douyin/hashtags/{tag}douyin.hashtag

Douyin hashtag detail

ParameterLocationRequiredTypeDescription
tagpathRequiredstringDouyin hashtag addressing key: the upstream challenge id ch_id, forwarded as-is.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/douyin/hashtags/trending"

Example response

{
  "data": {
    "id": "1655000000000001001",
    "platform": "douyin",
    "type": "hashtag",
    "name": "数据API",
    "description": "话题详情(按上游 ch_id 寻址)。",
    "cover_image_url": "https://cdn.example.com/cover/douyin-hashtag.jpeg",
    "metrics": {
      "views": 960000000,
      "posts": 128000
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/douyin/hashtags/{tag}/postsdouyin.hashtag_posts

Douyin hashtag posts

ParameterLocationRequiredTypeDescription
tagpathRequiredstringDouyin hashtag addressing key: the upstream challenge id ch_id, forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/douyin/hashtags/trending/posts"

Example response

{
  "data": [
    {
      "id": "7412050000000001001",
      "platform": "douyin",
      "type": "post",
      "author": {
        "id": "7004994945113",
        "username": "meshdata_dev",
        "display_name": "MeshData 抖音站",
        "verified": true
      },
      "text": "一条关于数据 API 的短视频。",
      "created_at": "2026-09-17T12:34:56Z",
      "metrics": {
        "likes": 32810,
        "comments": 1204,
        "shares": 988,
        "collects": 5600,
        "views": 2140000
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover/douyin-7412050000000001001.jpeg",
          "duration_ms": 45678
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/douyin/musics/{id}douyin.music

Douyin music detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringDouyin platform-native media id (music id on /musics, room id on /live).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/douyin/musics/1842951234567890123"

Example response

{
  "data": {
    "id": "7416880000000001001",
    "platform": "douyin",
    "type": "music",
    "title": "原创音源(数据 API 主题曲)",
    "author_name": "数据工场",
    "duration_ms": 45678,
    "cover_image_url": "https://cdn.example.com/cover/douyin-music.jpeg",
    "metrics": {
      "videos": 128000
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/douyin/musics/{id}/postsdouyin.music_posts

Douyin music posts

ParameterLocationRequiredTypeDescription
idpathRequiredstringDouyin platform-native media id (music id on /musics, room id on /live).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/douyin/musics/1842951234567890123/posts"

Example response

{
  "data": [
    {
      "id": "7412050000000001001",
      "platform": "douyin",
      "type": "post",
      "author": {
        "id": "7004994945113",
        "username": "meshdata_dev",
        "display_name": "MeshData 抖音站",
        "verified": true
      },
      "text": "一条关于数据 API 的短视频。",
      "created_at": "2026-09-17T12:34:56Z",
      "metrics": {
        "likes": 32810,
        "comments": 1204,
        "shares": 988,
        "collects": 5600,
        "views": 2140000
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover/douyin-7412050000000001001.jpeg",
          "duration_ms": 45678
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/douyin/live/{id}douyin.live_room

Douyin live room

ParameterLocationRequiredTypeDescription
idpathRequiredstringDouyin platform-native media id (music id on /musics, room id on /live).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/douyin/live/1842951234567890123"

Example response

{
  "data": {
    "id": "8800000000000001001",
    "platform": "douyin",
    "type": "live_room",
    "title": "直播:数据 API 问答",
    "username": "meshdata_dev",
    "display_name": "MeshData 抖音站",
    "status": "LIVE",
    "viewer_count": 3456,
    "started_at": "2026-09-21T08:00:00Z",
    "cover_image_url": "https://cdn.example.com/cover/douyin-live.jpeg",
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/douyin/hot-searchdouyin.hot_search

Douyin hot search board

ParameterLocationRequiredTypeDescription
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/douyin/hot-search"

Example response

{
  "data": {
    "platform": "douyin",
    "type": "hot_search",
    "words": [
      {
        "word": "数据开放",
        "hot_value": 4821000
      },
      {
        "word": "实体层",
        "hot_value": 3120004
      }
    ],
    "updated_at": "2026-09-21T08:00:00Z",
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/douyin/download/{id}douyin.download

Douyin download URL

ParameterLocationRequiredTypeDescription
idpathRequiredstringDouyin video id (platform-native aweme id; also the addressing key on /download).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/douyin/download/1842951234567890123"

Example response

{
  "data": {
    "id": "7412050000000001001",
    "platform": "douyin",
    "type": "download",
    "play_url": "https://v.douyincdn.com/aweme/7412050000000001001/play.mp4?no-watermark=1",
    "preview_image_url": "https://cdn.example.com/cover/douyin-7412050000000001001.jpeg",
    "duration_ms": 45678,
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/kuaishou/users/{username}kuaishou.profile

Kuaishou profile

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringKuaishou user id — the upstream addresses users by numeric user_id, so the caller value is forwarded as-is.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/kuaishou/users/newdev"

Example response

{
  "data": {
    "id": "3185500122",
    "platform": "kuaishou",
    "type": "profile",
    "username": "meshdata_ks",
    "display_name": "MeshData 快手号",
    "description": "快手短视频与数据开放。",
    "url": "https://fetchpi.com",
    "profile_image_url": "https://cdn.example.com/avatar/kuaishou-meshdata.jpg",
    "verified": false,
    "created_at": "2018-03-15T00:00:00Z",
    "metrics": {
      "followers": 156000,
      "following": 210,
      "posts": 389,
      "likes": 2100000
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/kuaishou/posts/{id}kuaishou.post

Kuaishou post detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringKuaishou photo id (platform-native photo_id).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/kuaishou/posts/1842951234567890123"

Example response

{
  "data": {
    "id": "5566778899001",
    "platform": "kuaishou",
    "type": "post",
    "author": {
      "id": "3185500122",
      "username": "meshdata_ks",
      "display_name": "MeshData 快手号",
      "verified": false
    },
    "text": "快手短视频数据示例。",
    "created_at": "2026-09-16T10:00:00Z",
    "metrics": {
      "likes": 8642,
      "comments": 512,
      "shares": 87,
      "views": 154000
    },
    "attachments": [
      {
        "type": "video",
        "preview_image_url": "https://cdn.example.com/cover/kuaishou-5566778899001.jpeg",
        "duration_ms": 38400
      }
    ],
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/kuaishou/users/{username}/postskuaishou.user_posts

Kuaishou user posts

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringKuaishou user id — the upstream addresses users by numeric user_id, so the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/kuaishou/users/newdev/posts"

Example response

{
  "data": [
    {
      "id": "5566778899001",
      "platform": "kuaishou",
      "type": "post",
      "author": {
        "id": "3185500122",
        "username": "meshdata_ks",
        "display_name": "MeshData 快手号",
        "verified": false
      },
      "text": "快手短视频数据示例。",
      "created_at": "2026-09-16T10:00:00Z",
      "metrics": {
        "likes": 8642,
        "comments": 512,
        "shares": 87,
        "views": 154000
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover/kuaishou-5566778899001.jpeg",
          "duration_ms": 38400
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/kuaishou/posts/{id}/commentskuaishou.comments

Kuaishou post comments

ParameterLocationRequiredTypeDescription
idpathRequiredstringKuaishou photo id (platform-native photo_id).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/kuaishou/posts/1842951234567890123/comments"

Example response

{
  "data": [
    {
      "id": "7700112233445",
      "platform": "kuaishou",
      "type": "comment",
      "post_id": "5566778899001",
      "author": {
        "id": "4400112233445",
        "username": "ksfan001",
        "display_name": "快手网友",
        "verified": false
      },
      "text": "这个讲解很实用。",
      "created_at": "2026-09-16T10:20:00Z",
      "metrics": {
        "likes": 96,
        "replies": 3
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/kuaishou/search/postskuaishou.search_posts

Kuaishou search posts

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/kuaishou/search/posts?q=meshdata"

Example response

{
  "data": [
    {
      "id": "5566778899001",
      "platform": "kuaishou",
      "type": "post",
      "author": {
        "id": "3185500122",
        "username": "meshdata_ks",
        "display_name": "MeshData 快手号",
        "verified": false
      },
      "text": "快手短视频数据示例。",
      "created_at": "2026-09-16T10:00:00Z",
      "metrics": {
        "likes": 8642,
        "comments": 512,
        "shares": 87,
        "views": 154000
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover/kuaishou-5566778899001.jpeg",
          "duration_ms": 38400
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "query": "数据",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/kuaishou/posts/{id}/comments/{comment_id}/replieskuaishou.comment_replies

Kuaishou comment replies

ParameterLocationRequiredTypeDescription
idpathRequiredstringKuaishou photo id (platform-native photo_id).
comment_idpathRequiredstringRoot comment id whose sub-comments are listed.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/kuaishou/posts/1842951234567890123/comments/9901222200001001/replies"

Example response

{
  "data": [
    {
      "id": "7700112233445",
      "platform": "kuaishou",
      "type": "comment",
      "post_id": "5566778899001",
      "author": {
        "id": "4400112233445",
        "username": "ksfan001",
        "display_name": "快手网友",
        "verified": false
      },
      "text": "这个讲解很实用。",
      "created_at": "2026-09-16T10:20:00Z",
      "metrics": {
        "likes": 96,
        "replies": 3
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/kuaishou/search/userskuaishou.search_users

Kuaishou search users

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/kuaishou/search/users?q=meshdata"

Example response

{
  "data": [
    {
      "id": "3185500122",
      "platform": "kuaishou",
      "type": "profile",
      "username": "meshdata_ks",
      "display_name": "MeshData 快手号",
      "description": "快手短视频与数据开放。",
      "url": "https://fetchpi.com",
      "profile_image_url": "https://cdn.example.com/avatar/kuaishou-meshdata.jpg",
      "verified": false,
      "created_at": "2018-03-15T00:00:00Z",
      "metrics": {
        "followers": 156000,
        "following": 210,
        "posts": 389,
        "likes": 2100000
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "query": "数据",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/kuaishou/hashtags/{tag}/postskuaishou.hashtag_posts

Kuaishou hashtag posts

ParameterLocationRequiredTypeDescription
tagpathRequiredstringKuaishou tag addressing key: the upstream general_tag_id, forwarded as-is (the pool has no tag-detail route).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/kuaishou/hashtags/trending/posts"

Example response

{
  "data": [
    {
      "id": "5566778899001",
      "platform": "kuaishou",
      "type": "post",
      "author": {
        "id": "3185500122",
        "username": "meshdata_ks",
        "display_name": "MeshData 快手号",
        "verified": false
      },
      "text": "快手短视频数据示例。",
      "created_at": "2026-09-16T10:00:00Z",
      "metrics": {
        "likes": 8642,
        "comments": 512,
        "shares": 87,
        "views": 154000
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover/kuaishou-5566778899001.jpeg",
          "duration_ms": 38400
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/kuaishou/users/{username}/livekuaishou.live_room

Kuaishou live room

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringKuaishou user id — the upstream addresses users by numeric user_id, so the caller value is forwarded as-is.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/kuaishou/users/newdev/live"

Example response

{
  "data": {
    "id": "8810000000000001001",
    "platform": "kuaishou",
    "type": "live_room",
    "title": "快手直播:数据开放夜",
    "username": "meshdata_ks",
    "display_name": "MeshData 快手号",
    "status": "LIVE",
    "viewer_count": 1234,
    "started_at": "2026-09-21T07:30:00Z",
    "cover_image_url": "https://cdn.example.com/cover/kuaishou-live.jpeg",
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/xigua/users/{username}xigua.profile

Xigua Video profile

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringXigua user id — the upstream addresses users by numeric user_id, so the caller value is forwarded as-is.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/xigua/users/newdev"

Example response

{
  "data": {
    "id": "7004994945115",
    "platform": "xigua",
    "type": "profile",
    "username": "meshdata_xigua",
    "display_name": "MeshData 西瓜号",
    "description": "中视频数据 API 演示。",
    "url": "https://fetchpi.com",
    "profile_image_url": "https://cdn.example.com/avatar/xigua-meshdata.jpg",
    "verified": false,
    "created_at": "2020-01-10T00:00:00Z",
    "metrics": {
      "followers": 86500,
      "following": 35,
      "posts": 128,
      "likes": 940000
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/xigua/posts/{id}xigua.post

Xigua Video post detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringXigua video id (platform-native item id; also the addressing key on /download).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/xigua/posts/1842951234567890123"

Example response

{
  "data": {
    "id": "7413050000000001001",
    "platform": "xigua",
    "type": "post",
    "author": {
      "id": "7004994945115",
      "username": "meshdata_xigua",
      "display_name": "MeshData 西瓜号",
      "verified": false
    },
    "title": "西瓜视频:一条中视频",
    "text": "中视频格式的数据 API 演示。",
    "created_at": "2026-09-15T08:30:00Z",
    "metrics": {
      "likes": 5120,
      "comments": 320,
      "shares": 140,
      "views": 880000
    },
    "attachments": [
      {
        "type": "video",
        "preview_image_url": "https://cdn.example.com/cover/xigua-7413050000000001001.jpeg",
        "duration_ms": 732000
      }
    ],
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/xigua/users/{username}/postsxigua.user_posts

Xigua Video user posts

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringXigua user id — the upstream addresses users by numeric user_id, so the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/xigua/users/newdev/posts"

Example response

{
  "data": [
    {
      "id": "7413050000000001001",
      "platform": "xigua",
      "type": "post",
      "author": {
        "id": "7004994945115",
        "username": "meshdata_xigua",
        "display_name": "MeshData 西瓜号",
        "verified": false
      },
      "title": "西瓜视频:一条中视频",
      "text": "中视频格式的数据 API 演示。",
      "created_at": "2026-09-15T08:30:00Z",
      "metrics": {
        "likes": 5120,
        "comments": 320,
        "shares": 140,
        "views": 880000
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover/xigua-7413050000000001001.jpeg",
          "duration_ms": 732000
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/xigua/posts/{id}/commentsxigua.comments

Xigua Video post comments

ParameterLocationRequiredTypeDescription
idpathRequiredstringXigua video id (platform-native item id; also the addressing key on /download).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/xigua/posts/1842951234567890123/comments"

Example response

{
  "data": [
    {
      "id": "7413222200000001001",
      "platform": "xigua",
      "type": "comment",
      "post_id": "7413050000000001001",
      "author": {
        "id": "7004994945116",
        "username": "xiguafan",
        "display_name": "西瓜观众",
        "verified": false
      },
      "text": "中视频也可以结构化。",
      "created_at": "2026-09-15T09:12:00Z",
      "metrics": {
        "likes": 41,
        "replies": 2
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/xigua/search/postsxigua.search_posts

Xigua Video search posts

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/xigua/search/posts?q=meshdata"

Example response

{
  "data": [
    {
      "id": "7413050000000001001",
      "platform": "xigua",
      "type": "post",
      "author": {
        "id": "7004994945115",
        "username": "meshdata_xigua",
        "display_name": "MeshData 西瓜号",
        "verified": false
      },
      "title": "西瓜视频:一条中视频",
      "text": "中视频格式的数据 API 演示。",
      "created_at": "2026-09-15T08:30:00Z",
      "metrics": {
        "likes": 5120,
        "comments": 320,
        "shares": 140,
        "views": 880000
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover/xigua-7413050000000001001.jpeg",
          "duration_ms": 732000
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "query": "数据",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/xigua/download/{id}xigua.download

Xigua Video download URL

ParameterLocationRequiredTypeDescription
idpathRequiredstringXigua video id (platform-native item id; also the addressing key on /download).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/xigua/download/1842951234567890123"

Example response

{
  "data": {
    "id": "7413050000000001001",
    "platform": "xigua",
    "type": "download",
    "play_url": "https://v.xiguacdn.com/item/7413050000000001001/play.mp4",
    "preview_image_url": "https://cdn.example.com/cover/xigua-7413050000000001001.jpeg",
    "duration_ms": 732000,
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/toutiao/users/{username}toutiao.profile

Toutiao profile

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringToutiao user id — the upstream addresses users by numeric user_id, so the caller value is forwarded as-is.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/toutiao/users/newdev"

Example response

{
  "data": {
    "id": "1567049494",
    "platform": "toutiao",
    "type": "profile",
    "username": "toutiao_datastudio",
    "display_name": "数据工场头条号",
    "description": "今日头条创作与数据开放。",
    "url": "https://fetchpi.com",
    "profile_image_url": "https://cdn.example.com/avatar/toutiao-meshdata.jpg",
    "verified": true,
    "created_at": "2016-08-01T00:00:00Z",
    "metrics": {
      "followers": 235000,
      "following": 12,
      "posts": 890,
      "likes": 620000
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/toutiao/posts/{id}toutiao.post

Toutiao post detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringToutiao content id (platform-native group_id of the article).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/toutiao/posts/1842951234567890123"

Example response

{
  "data": {
    "id": "1820000000001001",
    "platform": "toutiao",
    "type": "post",
    "author": {
      "id": "1567049494",
      "username": "toutiao_datastudio",
      "display_name": "数据工场头条号",
      "verified": true
    },
    "title": "头条文章:实体层与数据集市",
    "text": "结构化访问文章内容与互动指标。",
    "url": "https://www.toutiao.com/article/1820000000001001",
    "created_at": "2026-09-14T07:00:00Z",
    "metrics": {
      "likes": 610,
      "comments": 88,
      "views": 45200
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/toutiao/posts/{id}/commentstoutiao.comments

Toutiao post comments

ParameterLocationRequiredTypeDescription
idpathRequiredstringToutiao content id (platform-native group_id of the article).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/toutiao/posts/1842951234567890123/comments"

Example response

{
  "data": [
    {
      "id": "1821000000001001",
      "platform": "toutiao",
      "type": "comment",
      "post_id": "1820000000001001",
      "author": {
        "id": "1567049500",
        "username": "toutiaoreader",
        "display_name": "头条读者",
        "verified": false
      },
      "text": "文章数据口径讲得明白。",
      "created_at": "2026-09-14T08:05:00Z",
      "metrics": {
        "likes": 18,
        "replies": 1
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/lemon8/users/{username}lemon8.profile

Lemon8 profile

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringLemon8 user id — the upstream addresses users by user_id, so the caller value is forwarded as-is.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/lemon8/users/newdev"

Example response

{
  "data": {
    "id": "7304994945116",
    "platform": "lemon8",
    "type": "profile",
    "username": "meshdata_lemon",
    "display_name": "MeshData on Lemon8",
    "description": "Lifestyle data notes.",
    "url": "https://fetchpi.com",
    "profile_image_url": "https://cdn.example.com/avatar/lemon8-meshdata.jpg",
    "verified": false,
    "created_at": "2023-04-01T00:00:00Z",
    "metrics": {
      "followers": 24800,
      "following": 150,
      "posts": 96,
      "likes": 158000
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/lemon8/posts/{id}lemon8.post

Lemon8 post detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringLemon8 note id (platform-native item id).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/lemon8/posts/1842951234567890123"

Example response

{
  "data": {
    "id": "7423050000000001001",
    "platform": "lemon8",
    "type": "post",
    "author": {
      "id": "7304994945116",
      "username": "meshdata_lemon",
      "display_name": "MeshData on Lemon8",
      "verified": false
    },
    "title": "Lemon8 note: data APIs",
    "text": "A lifestyle note with structured metrics.",
    "created_at": "2026-09-13T11:00:00Z",
    "metrics": {
      "likes": 1320,
      "comments": 64,
      "collects": 210
    },
    "attachments": [
      {
        "type": "photo",
        "url": "https://cdn.example.com/images/lemon8-7423050000000001001-1.jpeg"
      },
      {
        "type": "photo",
        "url": "https://cdn.example.com/images/lemon8-7423050000000001001-2.jpeg"
      }
    ],
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/lemon8/search/postslemon8.search_posts

Lemon8 search posts

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/lemon8/search/posts?q=meshdata"

Example response

{
  "data": [
    {
      "id": "7423050000000001001",
      "platform": "lemon8",
      "type": "post",
      "author": {
        "id": "7304994945116",
        "username": "meshdata_lemon",
        "display_name": "MeshData on Lemon8",
        "verified": false
      },
      "title": "Lemon8 note: data APIs",
      "text": "A lifestyle note with structured metrics.",
      "created_at": "2026-09-13T11:00:00Z",
      "metrics": {
        "likes": 1320,
        "comments": 64,
        "collects": 210
      },
      "attachments": [
        {
          "type": "photo",
          "url": "https://cdn.example.com/images/lemon8-7423050000000001001-1.jpeg"
        },
        {
          "type": "photo",
          "url": "https://cdn.example.com/images/lemon8-7423050000000001001-2.jpeg"
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "query": "数据",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/lemon8/users/{username}/followerslemon8.user_followers

Lemon8 user followers

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringLemon8 user id — the upstream addresses users by user_id, so the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/lemon8/users/newdev/followers"

Example response

{
  "data": [
    {
      "id": "7304994945116",
      "platform": "lemon8",
      "type": "profile",
      "username": "meshdata_lemon",
      "display_name": "MeshData on Lemon8",
      "description": "Lifestyle data notes.",
      "url": "https://fetchpi.com",
      "profile_image_url": "https://cdn.example.com/avatar/lemon8-meshdata.jpg",
      "verified": false,
      "created_at": "2023-04-01T00:00:00Z",
      "metrics": {
        "followers": 24800,
        "following": 150,
        "posts": 96,
        "likes": 158000
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/lemon8/users/{username}/followinglemon8.user_following

Lemon8 user following

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringLemon8 user id — the upstream addresses users by user_id, so the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/lemon8/users/newdev/following"

Example response

{
  "data": [
    {
      "id": "7304994945116",
      "platform": "lemon8",
      "type": "profile",
      "username": "meshdata_lemon",
      "display_name": "MeshData on Lemon8",
      "description": "Lifestyle data notes.",
      "url": "https://fetchpi.com",
      "profile_image_url": "https://cdn.example.com/avatar/lemon8-meshdata.jpg",
      "verified": false,
      "created_at": "2023-04-01T00:00:00Z",
      "metrics": {
        "followers": 24800,
        "following": 150,
        "posts": 96,
        "likes": 158000
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/lemon8/topics/{id}lemon8.topic

Lemon8 topic detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringLemon8 topic id (platform-native forum id).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/lemon8/topics/1842951234567890123"

Example response

{
  "data": {
    "id": "1666000000000001001",
    "platform": "lemon8",
    "type": "topic",
    "name": "数据开放",
    "description": "Lemon8 话题详情(按 forum_id 寻址)。",
    "metrics": {
      "posts": 8600
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/bilibili/users/{username}bilibili.profile

Bilibili profile

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringBilibili user addressing key (numeric uid) — the upstream addresses users by uid, so the caller value is forwarded as-is.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/bilibili/users/newdev"

Example response

{
  "data": {
    "id": "3255000122",
    "platform": "bilibili",
    "type": "profile",
    "username": "MeshData 哔哩站",
    "display_name": "MeshData 哔哩站",
    "description": "哔哩哔哩数据开放。",
    "profile_image_url": "https://cdn.example.com/avatar/bilibili-meshdata.jpg",
    "verified": true,
    "metrics": {
      "followers": 328000,
      "following": 45,
      "posts": 388
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/bilibili/posts/{id}bilibili.post

Bilibili post detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringBilibili video id (platform-native BV id).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/bilibili/posts/1842951234567890123"

Example response

{
  "data": {
    "id": "BV1ma101c0001",
    "platform": "bilibili",
    "type": "post",
    "author": {
      "id": "3255000122",
      "username": "MeshData 哔哩站",
      "display_name": "MeshData 哔哩站",
      "verified": true
    },
    "title": "哔哩哔哩:数据 API 实战",
    "text": "一条关于数据 API 的视频。",
    "created_at": "2026-09-16T11:20:00Z",
    "metrics": {
      "likes": 18220,
      "comments": 940,
      "collects": 2100,
      "views": 480000
    },
    "attachments": [
      {
        "type": "video",
        "preview_image_url": "https://cdn.example.com/cover/bilibili-BV1ma101c0001.jpeg"
      }
    ],
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/bilibili/users/{username}/postsbilibili.user_posts

Bilibili user posts

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringBilibili user addressing key (numeric uid) — the upstream addresses users by uid, so the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/bilibili/users/newdev/posts"

Example response

{
  "data": [
    {
      "id": "BV1ma101c0001",
      "platform": "bilibili",
      "type": "post",
      "author": {
        "id": "3255000122",
        "username": "MeshData 哔哩站",
        "display_name": "MeshData 哔哩站",
        "verified": true
      },
      "title": "哔哩哔哩:数据 API 实战",
      "text": "一条关于数据 API 的视频。",
      "created_at": "2026-09-16T11:20:00Z",
      "metrics": {
        "likes": 18220,
        "comments": 940,
        "collects": 2100,
        "views": 480000
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover/bilibili-BV1ma101c0001.jpeg"
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/bilibili/posts/{id}/commentsbilibili.comments

Bilibili post comments

ParameterLocationRequiredTypeDescription
idpathRequiredstringBilibili video id (platform-native BV id).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/bilibili/posts/1842951234567890123/comments"

Example response

{
  "data": [
    {
      "id": "887711220001",
      "platform": "bilibili",
      "type": "comment",
      "post_id": "BV1ma101c0001",
      "author": {
        "id": "3255000200",
        "username": "哔哩网友",
        "display_name": "哔哩网友",
        "verified": false
      },
      "text": "讲得清楚,赞。",
      "created_at": "2026-09-16T12:01:22Z",
      "metrics": {
        "likes": 96,
        "replies": 3
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/bilibili/posts/{id}/comments/{comment_id}/repliesbilibili.comment_replies

Bilibili comment replies

ParameterLocationRequiredTypeDescription
idpathRequiredstringBilibili video id (platform-native BV id).
comment_idpathRequiredstringParent comment id (rpid) whose replies are listed.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/bilibili/posts/1842951234567890123/comments/9901222200001001/replies"

Example response

{
  "data": [
    {
      "id": "887711220001",
      "platform": "bilibili",
      "type": "comment",
      "post_id": "BV1ma101c0001",
      "author": {
        "id": "3255000200",
        "username": "哔哩网友",
        "display_name": "哔哩网友",
        "verified": false
      },
      "text": "讲得清楚,赞。",
      "created_at": "2026-09-16T12:01:22Z",
      "metrics": {
        "likes": 96,
        "replies": 3
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/bilibili/search/postsbilibili.search_posts

Bilibili search videos

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/bilibili/search/posts?q=meshdata"

Example response

{
  "data": [
    {
      "id": "BV1ma101c0001",
      "platform": "bilibili",
      "type": "post",
      "author": {
        "id": "3255000122",
        "username": "MeshData 哔哩站",
        "display_name": "MeshData 哔哩站",
        "verified": true
      },
      "title": "哔哩哔哩:数据 API 实战",
      "text": "一条关于数据 API 的视频。",
      "created_at": "2026-09-16T11:20:00Z",
      "metrics": {
        "likes": 18220,
        "comments": 940,
        "collects": 2100,
        "views": 480000
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover/bilibili-BV1ma101c0001.jpeg"
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "query": "数据",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/bilibili/popularbilibili.popular

Bilibili popular posts

ParameterLocationRequiredTypeDescription
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/bilibili/popular"

Example response

{
  "data": [
    {
      "id": "BV1ma101c0001",
      "platform": "bilibili",
      "type": "post",
      "author": {
        "id": "3255000122",
        "username": "MeshData 哔哩站",
        "display_name": "MeshData 哔哩站",
        "verified": true
      },
      "title": "哔哩哔哩:数据 API 实战",
      "text": "一条关于数据 API 的视频。",
      "created_at": "2026-09-16T11:20:00Z",
      "metrics": {
        "likes": 18220,
        "comments": 940,
        "collects": 2100,
        "views": 480000
      },
      "attachments": [
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover/bilibili-BV1ma101c0001.jpeg"
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/bilibili/hot-searchbilibili.hot_search

Bilibili hot search board

ParameterLocationRequiredTypeDescription
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/bilibili/hot-search"

Example response

{
  "data": {
    "platform": "bilibili",
    "type": "hot_search",
    "words": [
      {
        "word": "数据开放",
        "hot_value": 4821000
      },
      {
        "word": "实体层",
        "hot_value": 3120004
      }
    ],
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/bilibili/live/{id}bilibili.live_room

Bilibili live room

ParameterLocationRequiredTypeDescription
idpathRequiredstringBilibili live room id (platform-native room_id).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/bilibili/live/1842951234567890123"

Example response

{
  "data": {
    "id": "8900000000001001",
    "platform": "bilibili",
    "type": "live_room",
    "title": "直播:数据 API 问答",
    "username": "MeshData 哔哩站",
    "display_name": "MeshData 哔哩站",
    "status": "LIVE",
    "viewer_count": 3456,
    "cover_image_url": "https://cdn.example.com/cover/bilibili-live.jpeg",
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/weibo/users/{username}weibo.profile

Weibo profile

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringWeibo user addressing key (numeric uid) — the upstream addresses users by uid, so the caller value is forwarded as-is.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/weibo/users/newdev"

Example response

{
  "data": {
    "id": "6605000122",
    "platform": "weibo",
    "type": "profile",
    "username": "微博数据站",
    "display_name": "微博数据站",
    "description": "微博数据开放。",
    "profile_image_url": "https://cdn.example.com/avatar/weibo-meshdata.jpg",
    "verified": true,
    "created_at": "2018-06-01T00:00:00Z",
    "metrics": {
      "followers": 1288000,
      "following": 210,
      "posts": 19800
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/weibo/posts/{id}weibo.post

Weibo post detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringWeibo post id (platform-native status id).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/weibo/posts/1842951234567890123"

Example response

{
  "data": {
    "id": "5551000000001001",
    "platform": "weibo",
    "type": "post",
    "author": {
      "id": "6605000122",
      "username": "微博数据站",
      "display_name": "微博数据站",
      "verified": true
    },
    "text": "一条关于数据 API 的微博。",
    "created_at": "2026-09-17T04:34:56Z",
    "metrics": {
      "likes": 8230,
      "comments": 1204,
      "shares": 988
    },
    "attachments": [
      {
        "type": "photo",
        "url": "https://cdn.example.com/images/weibo-5551000000001001-1.jpeg"
      },
      {
        "type": "photo",
        "url": "https://cdn.example.com/images/weibo-5551000000001001-2.jpeg"
      }
    ],
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/weibo/users/{username}/postsweibo.user_posts

Weibo user posts

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringWeibo user addressing key (numeric uid) — the upstream addresses users by uid, so the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/weibo/users/newdev/posts"

Example response

{
  "data": [
    {
      "id": "5551000000001001",
      "platform": "weibo",
      "type": "post",
      "author": {
        "id": "6605000122",
        "username": "微博数据站",
        "display_name": "微博数据站",
        "verified": true
      },
      "text": "一条关于数据 API 的微博。",
      "created_at": "2026-09-17T04:34:56Z",
      "metrics": {
        "likes": 8230,
        "comments": 1204,
        "shares": 988
      },
      "attachments": [
        {
          "type": "photo",
          "url": "https://cdn.example.com/images/weibo-5551000000001001-1.jpeg"
        },
        {
          "type": "photo",
          "url": "https://cdn.example.com/images/weibo-5551000000001001-2.jpeg"
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/weibo/posts/{id}/commentsweibo.comments

Weibo post comments

ParameterLocationRequiredTypeDescription
idpathRequiredstringWeibo post id (platform-native status id).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/weibo/posts/1842951234567890123/comments"

Example response

{
  "data": [
    {
      "id": "5551222200001001",
      "platform": "weibo",
      "type": "comment",
      "post_id": "5551000000001001",
      "author": {
        "id": "6605000200",
        "username": "微博网友",
        "display_name": "微博网友",
        "verified": false
      },
      "text": "讲得清楚,赞。",
      "created_at": "2026-09-17T05:01:22Z",
      "metrics": {
        "likes": 96,
        "replies": 3
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/weibo/posts/{id}/comments/{comment_id}/repliesweibo.comment_replies

Weibo comment replies

ParameterLocationRequiredTypeDescription
idpathRequiredstringWeibo post id (platform-native status id).
comment_idpathRequiredstringParent comment id (主评论 id) whose sub-comments are listed.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/weibo/posts/1842951234567890123/comments/9901222200001001/replies"

Example response

{
  "data": [
    {
      "id": "5551222200001001",
      "platform": "weibo",
      "type": "comment",
      "post_id": "5551000000001001",
      "author": {
        "id": "6605000200",
        "username": "微博网友",
        "display_name": "微博网友",
        "verified": false
      },
      "text": "讲得清楚,赞。",
      "created_at": "2026-09-17T05:01:22Z",
      "metrics": {
        "likes": 96,
        "replies": 3
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/weibo/posts/{id}/repostsweibo.post_reposts

Weibo post reposts

ParameterLocationRequiredTypeDescription
idpathRequiredstringWeibo post id (platform-native status id).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/weibo/posts/1842951234567890123/reposts"

Example response

{
  "data": [
    {
      "id": "5551000000001001",
      "platform": "weibo",
      "type": "post",
      "author": {
        "id": "6605000122",
        "username": "微博数据站",
        "display_name": "微博数据站",
        "verified": true
      },
      "text": "一条关于数据 API 的微博。",
      "created_at": "2026-09-17T04:34:56Z",
      "metrics": {
        "likes": 8230,
        "comments": 1204,
        "shares": 988
      },
      "attachments": [
        {
          "type": "photo",
          "url": "https://cdn.example.com/images/weibo-5551000000001001-1.jpeg"
        },
        {
          "type": "photo",
          "url": "https://cdn.example.com/images/weibo-5551000000001001-2.jpeg"
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/weibo/posts/{id}/likersweibo.post_likers

Weibo post likers

ParameterLocationRequiredTypeDescription
idpathRequiredstringWeibo post id (platform-native status id).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/weibo/posts/1842951234567890123/likers"

Example response

{
  "data": [
    {
      "id": "6605000122",
      "platform": "weibo",
      "type": "profile",
      "username": "微博数据站",
      "display_name": "微博数据站",
      "description": "微博数据开放。",
      "profile_image_url": "https://cdn.example.com/avatar/weibo-meshdata.jpg",
      "verified": true,
      "created_at": "2018-06-01T00:00:00Z",
      "metrics": {
        "followers": 1288000,
        "following": 210,
        "posts": 19800
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/weibo/users/{username}/followersweibo.user_followers

Weibo user followers

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringWeibo user addressing key (numeric uid) — the upstream addresses users by uid, so the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/weibo/users/newdev/followers"

Example response

{
  "data": [
    {
      "id": "6605000122",
      "platform": "weibo",
      "type": "profile",
      "username": "微博数据站",
      "display_name": "微博数据站",
      "description": "微博数据开放。",
      "profile_image_url": "https://cdn.example.com/avatar/weibo-meshdata.jpg",
      "verified": true,
      "created_at": "2018-06-01T00:00:00Z",
      "metrics": {
        "followers": 1288000,
        "following": 210,
        "posts": 19800
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/weibo/users/{username}/followingweibo.user_following

Weibo user following

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringWeibo user addressing key (numeric uid) — the upstream addresses users by uid, so the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/weibo/users/newdev/following"

Example response

{
  "data": [
    {
      "id": "6605000122",
      "platform": "weibo",
      "type": "profile",
      "username": "微博数据站",
      "display_name": "微博数据站",
      "description": "微博数据开放。",
      "profile_image_url": "https://cdn.example.com/avatar/weibo-meshdata.jpg",
      "verified": true,
      "created_at": "2018-06-01T00:00:00Z",
      "metrics": {
        "followers": 1288000,
        "following": 210,
        "posts": 19800
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/weibo/search/postsweibo.search_posts

Weibo search posts

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/weibo/search/posts?q=meshdata"

Example response

{
  "data": [
    {
      "id": "5551000000001001",
      "platform": "weibo",
      "type": "post",
      "author": {
        "id": "6605000122",
        "username": "微博数据站",
        "display_name": "微博数据站",
        "verified": true
      },
      "text": "一条关于数据 API 的微博。",
      "created_at": "2026-09-17T04:34:56Z",
      "metrics": {
        "likes": 8230,
        "comments": 1204,
        "shares": 988
      },
      "attachments": [
        {
          "type": "photo",
          "url": "https://cdn.example.com/images/weibo-5551000000001001-1.jpeg"
        },
        {
          "type": "photo",
          "url": "https://cdn.example.com/images/weibo-5551000000001001-2.jpeg"
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "query": "数据",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/weibo/search/usersweibo.search_users

Weibo search users

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/weibo/search/users?q=meshdata"

Example response

{
  "data": [
    {
      "id": "6605000122",
      "platform": "weibo",
      "type": "profile",
      "username": "微博数据站",
      "display_name": "微博数据站",
      "description": "微博数据开放。",
      "profile_image_url": "https://cdn.example.com/avatar/weibo-meshdata.jpg",
      "verified": true,
      "created_at": "2018-06-01T00:00:00Z",
      "metrics": {
        "followers": 1288000,
        "following": 210,
        "posts": 19800
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "query": "数据",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/weibo/hot-searchweibo.hot_search

Weibo hot search board

ParameterLocationRequiredTypeDescription
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/weibo/hot-search"

Example response

{
  "data": {
    "platform": "weibo",
    "type": "hot_search",
    "words": [
      {
        "word": "数据开放",
        "hot_value": 4821000
      },
      {
        "word": "实体层",
        "hot_value": 3120004
      }
    ],
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/zhihu/users/{username}zhihu.profile

Zhihu profile

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringZhihu user addressing key (url_token) — the upstream addresses users by url_token, so the caller value is forwarded as-is.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/zhihu/users/newdev"

Example response

{
  "data": {
    "id": "9905000122",
    "platform": "zhihu",
    "type": "profile",
    "username": "meshdata-zhihu",
    "display_name": "知乎数据答主",
    "description": "知乎数据开放。",
    "profile_image_url": "https://cdn.example.com/avatar/zhihu-meshdata.jpg",
    "verified": false,
    "metrics": {
      "followers": 86500,
      "following": 35,
      "posts": 128
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/zhihu/answers/{id}zhihu.post

Zhihu answer detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringZhihu answer id (the canonical zhihu post surface).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/zhihu/answers/1842951234567890123"

Example response

{
  "data": {
    "id": "8801000000001001",
    "platform": "zhihu",
    "type": "post",
    "author": {
      "id": "9905000122",
      "username": "meshdata-zhihu",
      "display_name": "知乎数据答主",
      "verified": false
    },
    "title": "实体层是如何炼成的?",
    "text": "回答:结构化访问知乎内容。",
    "created_at": "2026-09-16T11:20:00Z",
    "metrics": {
      "likes": 5120,
      "comments": 320
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/zhihu/articles/{id}zhihu.article

Zhihu article detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringZhihu column article id.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/zhihu/articles/1842951234567890123"

Example response

{
  "data": {
    "id": "8801000000001001",
    "platform": "zhihu",
    "type": "post",
    "author": {
      "id": "9905000122",
      "username": "meshdata-zhihu",
      "display_name": "知乎数据答主",
      "verified": false
    },
    "title": "实体层是如何炼成的?",
    "text": "回答:结构化访问知乎内容。",
    "created_at": "2026-09-16T11:20:00Z",
    "metrics": {
      "likes": 5120,
      "comments": 320
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/zhihu/questions/{id}zhihu.question

Zhihu question detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringZhihu question id.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/zhihu/questions/1842951234567890123"

Example response

{
  "data": {
    "id": "7701000000001001",
    "platform": "zhihu",
    "type": "question",
    "title": "实体层是如何炼成的?",
    "detail": "问题详情:数据 API 的实体层设计。",
    "metrics": {
      "answers": 1280,
      "followers": 8600
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/zhihu/questions/{id}/answerszhihu.question_answers

Zhihu question answers

ParameterLocationRequiredTypeDescription
idpathRequiredstringZhihu question id.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/zhihu/questions/1842951234567890123/answers"

Example response

{
  "data": [
    {
      "id": "8801000000001001",
      "platform": "zhihu",
      "type": "post",
      "author": {
        "id": "9905000122",
        "username": "meshdata-zhihu",
        "display_name": "知乎数据答主",
        "verified": false
      },
      "title": "实体层是如何炼成的?",
      "text": "回答:结构化访问知乎内容。",
      "created_at": "2026-09-16T11:20:00Z",
      "metrics": {
        "likes": 5120,
        "comments": 320
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/zhihu/users/{username}/answerszhihu.user_answers

Zhihu user answers

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringZhihu user addressing key (url_token) — the upstream addresses users by url_token, so the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/zhihu/users/newdev/answers"

Example response

{
  "data": [
    {
      "id": "8801000000001001",
      "platform": "zhihu",
      "type": "post",
      "author": {
        "id": "9905000122",
        "username": "meshdata-zhihu",
        "display_name": "知乎数据答主",
        "verified": false
      },
      "title": "实体层是如何炼成的?",
      "text": "回答:结构化访问知乎内容。",
      "created_at": "2026-09-16T11:20:00Z",
      "metrics": {
        "likes": 5120,
        "comments": 320
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/zhihu/users/{username}/articleszhihu.user_articles

Zhihu user articles

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringZhihu user addressing key (url_token) — the upstream addresses users by url_token, so the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/zhihu/users/newdev/articles"

Example response

{
  "data": [
    {
      "id": "8801000000001001",
      "platform": "zhihu",
      "type": "post",
      "author": {
        "id": "9905000122",
        "username": "meshdata-zhihu",
        "display_name": "知乎数据答主",
        "verified": false
      },
      "title": "实体层是如何炼成的?",
      "text": "回答:结构化访问知乎内容。",
      "created_at": "2026-09-16T11:20:00Z",
      "metrics": {
        "likes": 5120,
        "comments": 320
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/zhihu/answers/{id}/commentszhihu.comments

Zhihu answer comments

ParameterLocationRequiredTypeDescription
idpathRequiredstringZhihu answer id (the canonical zhihu post surface).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/zhihu/answers/1842951234567890123/comments"

Example response

{
  "data": [
    {
      "id": "9901222200001001",
      "platform": "zhihu",
      "type": "comment",
      "post_id": "8801000000001001",
      "author": {
        "id": "9905000200",
        "username": "zhihu-fan",
        "display_name": "知乎网友",
        "verified": false
      },
      "text": "讲得明白。",
      "created_at": "2026-09-16T12:01:22Z",
      "metrics": {
        "likes": 41,
        "replies": 2
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/zhihu/answers/{id}/comments/{comment_id}/replieszhihu.comment_replies

Zhihu comment replies

ParameterLocationRequiredTypeDescription
idpathRequiredstringZhihu answer id (the canonical zhihu post surface).
comment_idpathRequiredstringParent comment id whose sub-comments are listed.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/zhihu/answers/1842951234567890123/comments/9901222200001001/replies"

Example response

{
  "data": [
    {
      "id": "9901222200001001",
      "platform": "zhihu",
      "type": "comment",
      "post_id": "8801000000001001",
      "author": {
        "id": "9905000200",
        "username": "zhihu-fan",
        "display_name": "知乎网友",
        "verified": false
      },
      "text": "讲得明白。",
      "created_at": "2026-09-16T12:01:22Z",
      "metrics": {
        "likes": 41,
        "replies": 2
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/zhihu/users/{username}/followerszhihu.user_followers

Zhihu user followers

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringZhihu user addressing key (url_token) — the upstream addresses users by url_token, so the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/zhihu/users/newdev/followers"

Example response

{
  "data": [
    {
      "id": "9905000122",
      "platform": "zhihu",
      "type": "profile",
      "username": "meshdata-zhihu",
      "display_name": "知乎数据答主",
      "description": "知乎数据开放。",
      "profile_image_url": "https://cdn.example.com/avatar/zhihu-meshdata.jpg",
      "verified": false,
      "metrics": {
        "followers": 86500,
        "following": 35,
        "posts": 128
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/zhihu/users/{username}/followingzhihu.user_following

Zhihu user following

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringZhihu user addressing key (url_token) — the upstream addresses users by url_token, so the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/zhihu/users/newdev/following"

Example response

{
  "data": [
    {
      "id": "9905000122",
      "platform": "zhihu",
      "type": "profile",
      "username": "meshdata-zhihu",
      "display_name": "知乎数据答主",
      "description": "知乎数据开放。",
      "profile_image_url": "https://cdn.example.com/avatar/zhihu-meshdata.jpg",
      "verified": false,
      "metrics": {
        "followers": 86500,
        "following": 35,
        "posts": 128
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/zhihu/search/postszhihu.search_posts

Zhihu search posts

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/zhihu/search/posts?q=meshdata"

Example response

{
  "data": [
    {
      "id": "8801000000001001",
      "platform": "zhihu",
      "type": "post",
      "author": {
        "id": "9905000122",
        "username": "meshdata-zhihu",
        "display_name": "知乎数据答主",
        "verified": false
      },
      "title": "实体层是如何炼成的?",
      "text": "回答:结构化访问知乎内容。",
      "created_at": "2026-09-16T11:20:00Z",
      "metrics": {
        "likes": 5120,
        "comments": 320
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "query": "数据",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/zhihu/search/userszhihu.search_users

Zhihu search users

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/zhihu/search/users?q=meshdata"

Example response

{
  "data": [
    {
      "id": "9905000122",
      "platform": "zhihu",
      "type": "profile",
      "username": "meshdata-zhihu",
      "display_name": "知乎数据答主",
      "description": "知乎数据开放。",
      "profile_image_url": "https://cdn.example.com/avatar/zhihu-meshdata.jpg",
      "verified": false,
      "metrics": {
        "followers": 86500,
        "following": 35,
        "posts": 128
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "query": "数据",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/zhihu/hot-listzhihu.hot_list

Zhihu hot list

ParameterLocationRequiredTypeDescription
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/zhihu/hot-list"

Example response

{
  "data": {
    "platform": "zhihu",
    "type": "hot_list",
    "items": [
      {
        "title": "实体层是如何炼成的?",
        "question_id": "7701000000001001",
        "heat": 4821000
      },
      {
        "title": "数据开放意味着什么?",
        "question_id": "7701000000001002",
        "heat": 3120004
      }
    ],
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/threads/users/{username}threads.profile

Get profile

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringThreads user addressing key — profiles address by username, the lists by numeric user_id; the caller value is forwarded as-is.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/threads/users/newdev"

Example response

{
  "data": {
    "id": "7455000122",
    "platform": "threads",
    "type": "profile",
    "username": "meshdata",
    "display_name": "MeshData Threads",
    "description": "Threads 数据开放。",
    "profile_image_url": "https://cdn.example.com/avatar/threads-meshdata.jpg",
    "verified": true,
    "created_at": "2021-07-06T00:00:00Z",
    "metrics": {
      "followers": 815000,
      "following": 310,
      "posts": 4200
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/threads/posts/{id}threads.post

Get post

ParameterLocationRequiredTypeDescription
idpathRequiredstringThreads post id (platform-native pk).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/threads/posts/1842951234567890123"

Example response

{
  "data": {
    "id": "7459000000001001",
    "platform": "threads",
    "type": "post",
    "author": {
      "id": "7455000122",
      "username": "meshdata",
      "display_name": "MeshData Threads",
      "verified": true
    },
    "text": "一条关于数据 API 的 Threads。",
    "created_at": "2026-09-16T11:20:00Z",
    "metrics": {
      "likes": 12480,
      "comments": 214,
      "shares": 66,
      "views": 91000
    },
    "attachments": [
      {
        "type": "photo",
        "url": "https://cdn.example.com/images/threads-7459000000001001-1.jpeg"
      },
      {
        "type": "photo",
        "url": "https://cdn.example.com/images/threads-7459000000001001-2.jpeg"
      },
      {
        "type": "video",
        "preview_image_url": "https://cdn.example.com/media/threads-7459000000001001.mp4"
      }
    ],
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/threads/users/{username}/poststhreads.user_posts

List user posts

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringThreads user addressing key — profiles address by username, the lists by numeric user_id; the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/threads/users/newdev/posts"

Example response

{
  "data": [
    {
      "id": "7459000000001001",
      "platform": "threads",
      "type": "post",
      "author": {
        "id": "7455000122",
        "username": "meshdata",
        "display_name": "MeshData Threads",
        "verified": true
      },
      "text": "一条关于数据 API 的 Threads。",
      "created_at": "2026-09-16T11:20:00Z",
      "metrics": {
        "likes": 12480,
        "comments": 214,
        "shares": 66,
        "views": 91000
      },
      "attachments": [
        {
          "type": "photo",
          "url": "https://cdn.example.com/images/threads-7459000000001001-1.jpeg"
        },
        {
          "type": "photo",
          "url": "https://cdn.example.com/images/threads-7459000000001001-2.jpeg"
        },
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/media/threads-7459000000001001.mp4"
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/threads/users/{username}/repliesthreads.user_replies

List user replies

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringThreads user addressing key — profiles address by username, the lists by numeric user_id; the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/threads/users/newdev/replies"

Example response

{
  "data": [
    {
      "id": "7458000000003001",
      "platform": "threads",
      "type": "comment",
      "post_id": "7459000000001001",
      "author": {
        "id": "7455000200",
        "username": "threads_fan",
        "display_name": null,
        "verified": false
      },
      "text": "讲得清楚,赞。",
      "created_at": "2026-09-16T12:01:22Z",
      "metrics": {
        "likes": 96,
        "replies": 3
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/threads/users/{username}/repoststhreads.user_reposts

List user reposts

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringThreads user addressing key — profiles address by username, the lists by numeric user_id; the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/threads/users/newdev/reposts"

Example response

{
  "data": [
    {
      "id": "7459000000001001",
      "platform": "threads",
      "type": "post",
      "author": {
        "id": "7455000122",
        "username": "meshdata",
        "display_name": "MeshData Threads",
        "verified": true
      },
      "text": "一条关于数据 API 的 Threads。",
      "created_at": "2026-09-16T11:20:00Z",
      "metrics": {
        "likes": 12480,
        "comments": 214,
        "shares": 66,
        "views": 91000
      },
      "attachments": [
        {
          "type": "photo",
          "url": "https://cdn.example.com/images/threads-7459000000001001-1.jpeg"
        },
        {
          "type": "photo",
          "url": "https://cdn.example.com/images/threads-7459000000001001-2.jpeg"
        },
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/media/threads-7459000000001001.mp4"
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/threads/posts/{id}/commentsthreads.comments

List post comments

ParameterLocationRequiredTypeDescription
idpathRequiredstringThreads post id (platform-native pk).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/threads/posts/1842951234567890123/comments"

Example response

{
  "data": [
    {
      "id": "7458000000003001",
      "platform": "threads",
      "type": "comment",
      "post_id": "7459000000001001",
      "author": {
        "id": "7455000200",
        "username": "threads_fan",
        "display_name": null,
        "verified": false
      },
      "text": "讲得清楚,赞。",
      "created_at": "2026-09-16T12:01:22Z",
      "metrics": {
        "likes": 96,
        "replies": 3
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/threads/search/usersthreads.search_users

Search users

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/threads/search/users?q=meshdata"

Example response

{
  "data": [
    {
      "id": "7455000122",
      "platform": "threads",
      "type": "profile",
      "username": "meshdata",
      "display_name": "MeshData Threads",
      "description": "Threads 数据开放。",
      "profile_image_url": "https://cdn.example.com/avatar/threads-meshdata.jpg",
      "verified": true,
      "created_at": "2021-07-06T00:00:00Z",
      "metrics": {
        "followers": 815000,
        "following": 310,
        "posts": 4200
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "query": "数据",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/linkedin/users/{username}linkedin.profile

Get profile

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringLinkedIn member addressing key: the profile URL percent-encoded — forwarded as-is as the upstream url query.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/linkedin/users/newdev"

Example response

{
  "data": {
    "id": "6155000122",
    "platform": "linkedin",
    "type": "profile",
    "username": "meshdata-linkedin",
    "display_name": "MeshData LinkedIn",
    "description": "结构化 LinkedIn 数据。",
    "url": "https://www.linkedin.com/in/meshdata-linkedin",
    "profile_image_url": "https://cdn.example.com/avatar/linkedin-meshdata.jpg",
    "verified": false,
    "metrics": {
      "followers": 92000,
      "following": 4800,
      "posts": 610
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/linkedin/users/{username}/postslinkedin.user_posts

List user posts

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringLinkedIn member addressing key: the profile URL percent-encoded — forwarded as-is as the upstream url query.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/linkedin/users/newdev/posts"

Example response

{
  "data": [
    {
      "id": "7255000000001001",
      "platform": "linkedin",
      "type": "post",
      "author": {
        "id": "6155000122",
        "username": "meshdata-linkedin",
        "display_name": "MeshData LinkedIn",
        "verified": false
      },
      "text": "一条关于数据 API 的 LinkedIn 帖子。",
      "created_at": "2026-09-16T11:20:00Z",
      "metrics": {
        "likes": 3120,
        "comments": 96,
        "shares": 18
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/linkedin/companies/{username}linkedin.company_profile

Get company profile

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringLinkedIn company addressing key: the company page URL percent-encoded — forwarded as-is as the upstream url query.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/linkedin/companies/newdev"

Example response

{
  "data": {
    "id": "6155000122",
    "platform": "linkedin",
    "type": "profile",
    "username": "meshdata-linkedin",
    "display_name": "MeshData LinkedIn",
    "description": "结构化 LinkedIn 数据。",
    "url": "https://www.linkedin.com/in/meshdata-linkedin",
    "profile_image_url": "https://cdn.example.com/avatar/linkedin-meshdata.jpg",
    "verified": false,
    "metrics": {
      "followers": 92000,
      "following": 4800,
      "posts": 610
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/linkedin/companies/{username}/postslinkedin.company_posts

List company posts

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringLinkedIn company addressing key: the company page URL percent-encoded — forwarded as-is as the upstream url query.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/linkedin/companies/newdev/posts"

Example response

{
  "data": [
    {
      "id": "7255000000001001",
      "platform": "linkedin",
      "type": "post",
      "author": {
        "id": "6155000122",
        "username": "meshdata-linkedin",
        "display_name": "MeshData LinkedIn",
        "verified": false
      },
      "text": "一条关于数据 API 的 LinkedIn 帖子。",
      "created_at": "2026-09-16T11:20:00Z",
      "metrics": {
        "likes": 3120,
        "comments": 96,
        "shares": 18
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/linkedin/posts/{id}linkedin.post

Get post

ParameterLocationRequiredTypeDescription
idpathRequiredstringLinkedIn post addressing key: the post URL percent-encoded — forwarded as-is as the upstream url query.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/linkedin/posts/1842951234567890123"

Example response

{
  "data": {
    "id": "7255000000001001",
    "platform": "linkedin",
    "type": "post",
    "author": {
      "id": "6155000122",
      "username": "meshdata-linkedin",
      "display_name": "MeshData LinkedIn",
      "verified": false
    },
    "text": "一条关于数据 API 的 LinkedIn 帖子。",
    "created_at": "2026-09-16T11:20:00Z",
    "metrics": {
      "likes": 3120,
      "comments": 96,
      "shares": 18
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/linkedin/posts/{id}/commentslinkedin.post_comments

List post comments

ParameterLocationRequiredTypeDescription
idpathRequiredstringLinkedIn share URN percent-encoded — forwarded as-is as the upstream urn query.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/linkedin/posts/1842951234567890123/comments"

Example response

{
  "data": [
    {
      "id": "7258000000002001",
      "platform": "linkedin",
      "type": "comment",
      "post_id": "7255000000001001",
      "author": {
        "id": "6155000200",
        "username": "linkedin-fan",
        "display_name": "LinkedIn 网友",
        "verified": false
      },
      "text": "讲得清楚,赞。",
      "created_at": "2026-09-16T12:01:22Z",
      "metrics": {
        "likes": 12,
        "replies": 1
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/linkedin/jobs/{id}linkedin.job

Get job detail

ParameterLocationRequiredTypeDescription
idpathRequiredstringLinkedIn job addressing key: the job URL percent-encoded — forwarded as-is as the upstream url query.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/linkedin/jobs/1842951234567890123"

Example response

{
  "data": {
    "id": "6257000000001001",
    "platform": "linkedin",
    "type": "job",
    "title": "数据平台工程师",
    "company": "MeshData",
    "location": "Remote",
    "description": "数据平台工程师职位。",
    "employment_type": "FULL_TIME",
    "posted_at": "2026-09-15T11:20:00Z",
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/linkedin/search/jobslinkedin.search_jobs

Search jobs

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/linkedin/search/jobs?q=meshdata"

Example response

{
  "data": [
    {
      "id": "6257000000001001",
      "platform": "linkedin",
      "type": "job",
      "title": "数据平台工程师",
      "company": "MeshData",
      "location": "Remote",
      "description": "数据平台工程师职位。",
      "employment_type": "FULL_TIME",
      "posted_at": "2026-09-15T11:20:00Z",
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "query": "数据",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/telegram/channels/{username}telegram.profile

Get channel info

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringTelegram channel addressing key (the channel handle) — forwarded as-is as the upstream channel query.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/telegram/channels/newdev"

Example response

{
  "data": {
    "id": "8355000122",
    "platform": "telegram",
    "type": "profile",
    "username": "meshdata_tg",
    "display_name": "MeshData 频道",
    "description": "Telegram 频道数据开放。",
    "profile_image_url": "https://cdn.example.com/avatar/telegram-meshdata_tg.jpg",
    "verified": false,
    "metrics": {
      "followers": 230000,
      "following": 0,
      "posts": 5100
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/telegram/channels/{username}/poststelegram.user_posts

List channel posts

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringTelegram channel addressing key (the channel handle) — forwarded as-is as the upstream channel query.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/telegram/channels/newdev/posts"

Example response

{
  "data": [
    {
      "id": "8359000000001002",
      "platform": "telegram",
      "type": "post",
      "author": {
        "id": "8355000122",
        "username": "meshdata_tg",
        "display_name": "MeshData 频道",
        "verified": false
      },
      "text": "频道消息:数据 API 发布。",
      "created_at": "2026-09-16T11:20:00Z",
      "metrics": {
        "likes": 0,
        "comments": 2,
        "shares": 120,
        "views": 51000
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/telegram/channels/{username}/posts/{id}telegram.post

Get post

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringTelegram channel addressing key (the channel handle) — forwarded as-is as the upstream channel query.
idpathRequiredstringTelegram message id (the upstream post_id query).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/telegram/channels/newdev/posts/1842951234567890123"

Example response

{
  "data": {
    "id": "8359000000001002",
    "platform": "telegram",
    "type": "post",
    "author": {
      "id": "8355000122",
      "username": "meshdata_tg",
      "display_name": "MeshData 频道",
      "verified": false
    },
    "text": "频道消息:数据 API 发布。",
    "created_at": "2026-09-16T11:20:00Z",
    "metrics": {
      "likes": 0,
      "comments": 2,
      "shares": 120,
      "views": 51000
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/telegram/channels/{username}/posts/{id}/commentstelegram.comments

List post comments

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringTelegram channel addressing key (the channel handle) — forwarded as-is as the upstream channel query.
idpathRequiredstringTelegram message id (the upstream post_id query).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/telegram/channels/newdev/posts/1842951234567890123/comments"

Example response

{
  "data": [
    {
      "id": "8358000000002001",
      "platform": "telegram",
      "type": "comment",
      "post_id": "8359000000001002",
      "author": {
        "id": "8355000200",
        "username": "tg_fan",
        "display_name": "TG 网友",
        "verified": false
      },
      "text": "讲得清楚,赞。",
      "created_at": "2026-09-16T12:01:22Z",
      "metrics": {
        "likes": 8,
        "replies": 0
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/telegram/channels/{username}/search/poststelegram.search_posts

Search channel posts

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringTelegram channel addressing key (the channel handle) — forwarded as-is as the upstream channel query.
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/telegram/channels/newdev/search/posts?q=meshdata"

Example response

{
  "data": [
    {
      "id": "8359000000001002",
      "platform": "telegram",
      "type": "post",
      "author": {
        "id": "8355000122",
        "username": "meshdata_tg",
        "display_name": "MeshData 频道",
        "verified": false
      },
      "text": "频道消息:数据 API 发布。",
      "created_at": "2026-09-16T11:20:00Z",
      "metrics": {
        "likes": 0,
        "comments": 2,
        "shares": 120,
        "views": 51000
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "query": "数据",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/telegram/channels/{username}/similartelegram.similar_channels

List similar channels

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringTelegram channel addressing key (the channel handle) — forwarded as-is as the upstream channel query.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/telegram/channels/newdev/similar"

Example response

{
  "data": [
    {
      "id": "8355000122",
      "platform": "telegram",
      "type": "profile",
      "username": "meshdata_tg",
      "display_name": "MeshData 频道",
      "description": "Telegram 频道数据开放。",
      "profile_image_url": "https://cdn.example.com/avatar/telegram-meshdata_tg.jpg",
      "verified": false,
      "metrics": {
        "followers": 230000,
        "following": 0,
        "posts": 5100
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/pipixia/users/{username}pipixia.profile

Get profile

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringPipixia user addressing key (numeric user_id) — the upstream addresses users by user_id, so the caller value is forwarded as-is.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/pipixia/users/newdev"

Example response

{
  "data": {
    "id": "9255000122",
    "platform": "pipixia",
    "type": "profile",
    "username": "皮皮虾数据站",
    "display_name": "皮皮虾数据站",
    "description": "皮皮虾数据开放。",
    "profile_image_url": "https://cdn.example.com/avatar/pipixia-meshdata.jpg",
    "verified": false,
    "created_at": "2021-06-30T17:33:20Z",
    "metrics": {
      "followers": 456000,
      "following": 64,
      "posts": 1320
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/pipixia/users/{username}/postspipixia.user_posts

List user posts

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringPipixia user addressing key (numeric user_id) — the upstream addresses users by user_id, so the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/pipixia/users/newdev/posts"

Example response

{
  "data": [
    {
      "id": "9259000000001001",
      "platform": "pipixia",
      "type": "post",
      "author": {
        "id": "9255000122",
        "username": "皮皮虾数据站",
        "display_name": "皮皮虾数据站",
        "verified": false
      },
      "title": "皮皮虾:数据 API 实战",
      "text": "一条关于数据 API 的作品。",
      "created_at": "2026-09-16T11:20:00Z",
      "metrics": {
        "likes": 21000,
        "comments": 158,
        "shares": 74,
        "views": 780000
      },
      "attachments": [
        {
          "type": "photo",
          "url": "https://cdn.example.com/images/pipixia-9259000000001001-1.jpeg"
        },
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover/pipixia-9259000000001001.jpeg",
          "duration_ms": 45000
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/pipixia/users/{username}/followerspipixia.user_followers

List followers

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringPipixia user addressing key (numeric user_id) — the upstream addresses users by user_id, so the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/pipixia/users/newdev/followers"

Example response

{
  "data": [
    {
      "id": "9255000122",
      "platform": "pipixia",
      "type": "profile",
      "username": "皮皮虾数据站",
      "display_name": "皮皮虾数据站",
      "description": "皮皮虾数据开放。",
      "profile_image_url": "https://cdn.example.com/avatar/pipixia-meshdata.jpg",
      "verified": false,
      "created_at": "2021-06-30T17:33:20Z",
      "metrics": {
        "followers": 456000,
        "following": 64,
        "posts": 1320
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/pipixia/users/{username}/followingpipixia.user_following

List following

ParameterLocationRequiredTypeDescription
usernamepathRequiredstringPipixia user addressing key (numeric user_id) — the upstream addresses users by user_id, so the caller value is forwarded as-is.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/pipixia/users/newdev/following"

Example response

{
  "data": [
    {
      "id": "9255000122",
      "platform": "pipixia",
      "type": "profile",
      "username": "皮皮虾数据站",
      "display_name": "皮皮虾数据站",
      "description": "皮皮虾数据开放。",
      "profile_image_url": "https://cdn.example.com/avatar/pipixia-meshdata.jpg",
      "verified": false,
      "created_at": "2021-06-30T17:33:20Z",
      "metrics": {
        "followers": 456000,
        "following": 64,
        "posts": 1320
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/pipixia/posts/{id}pipixia.post

Get post

ParameterLocationRequiredTypeDescription
idpathRequiredstringPipixia work id (platform-native cell id).
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/pipixia/posts/1842951234567890123"

Example response

{
  "data": {
    "id": "9259000000001001",
    "platform": "pipixia",
    "type": "post",
    "author": {
      "id": "9255000122",
      "username": "皮皮虾数据站",
      "display_name": "皮皮虾数据站",
      "verified": false
    },
    "title": "皮皮虾:数据 API 实战",
    "text": "一条关于数据 API 的作品。",
    "created_at": "2026-09-16T11:20:00Z",
    "metrics": {
      "likes": 21000,
      "comments": 158,
      "shares": 74,
      "views": 780000
    },
    "attachments": [
      {
        "type": "photo",
        "url": "https://cdn.example.com/images/pipixia-9259000000001001-1.jpeg"
      },
      {
        "type": "video",
        "preview_image_url": "https://cdn.example.com/cover/pipixia-9259000000001001.jpeg",
        "duration_ms": 45000
      }
    ],
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/pipixia/posts/{id}/commentspipixia.comments

List post comments

ParameterLocationRequiredTypeDescription
idpathRequiredstringPipixia work id (platform-native cell id).
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/pipixia/posts/1842951234567890123/comments"

Example response

{
  "data": [
    {
      "id": "9258000000002001",
      "platform": "pipixia",
      "type": "comment",
      "post_id": "9259000000001001",
      "author": {
        "id": "9255000200",
        "username": "皮皮虾网友",
        "display_name": "皮皮虾网友",
        "verified": false
      },
      "text": "讲得清楚,赞。",
      "created_at": "2026-09-16T12:01:22Z",
      "metrics": {
        "likes": 22,
        "replies": 1
      },
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/pipixia/search/postspipixia.search_posts

Search posts

ParameterLocationRequiredTypeDescription
qqueryRequiredstringSearch query text.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/pipixia/search/posts?q=meshdata"

Example response

{
  "data": [
    {
      "id": "9259000000001001",
      "platform": "pipixia",
      "type": "post",
      "author": {
        "id": "9255000122",
        "username": "皮皮虾数据站",
        "display_name": "皮皮虾数据站",
        "verified": false
      },
      "title": "皮皮虾:数据 API 实战",
      "text": "一条关于数据 API 的作品。",
      "created_at": "2026-09-16T11:20:00Z",
      "metrics": {
        "likes": 21000,
        "comments": 158,
        "shares": 74,
        "views": 780000
      },
      "attachments": [
        {
          "type": "photo",
          "url": "https://cdn.example.com/images/pipixia-9259000000001001-1.jpeg"
        },
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover/pipixia-9259000000001001.jpeg",
          "duration_ms": 45000
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "query": "数据",
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 300,
      "cache_hit": false
    }
  }
}
GET/v1/pipixia/hashtags/{tag}pipixia.hashtag

Get hashtag

ParameterLocationRequiredTypeDescription
tagpathRequiredstringPipixia hashtag id — forwarded as-is as the upstream hashtag_id query.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/pipixia/hashtags/trending"

Example response

{
  "data": {
    "id": "9257000000001001",
    "platform": "pipixia",
    "type": "hashtag",
    "name": "数据开放",
    "description": "皮皮虾话题面。",
    "metrics": {
      "views": 88000000,
      "posts": 123000
    },
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}
GET/v1/pipixia/hashtags/{tag}/postspipixia.hashtag_posts

List hashtag posts

ParameterLocationRequiredTypeDescription
tagpathRequiredstringPipixia hashtag id — forwarded as-is as the upstream hashtag_id query.
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/pipixia/hashtags/trending/posts"

Example response

{
  "data": [
    {
      "id": "9259000000001001",
      "platform": "pipixia",
      "type": "post",
      "author": {
        "id": "9255000122",
        "username": "皮皮虾数据站",
        "display_name": "皮皮虾数据站",
        "verified": false
      },
      "title": "皮皮虾:数据 API 实战",
      "text": "一条关于数据 API 的作品。",
      "created_at": "2026-09-16T11:20:00Z",
      "metrics": {
        "likes": 21000,
        "comments": 158,
        "shares": 74,
        "views": 780000
      },
      "attachments": [
        {
          "type": "photo",
          "url": "https://cdn.example.com/images/pipixia-9259000000001001-1.jpeg"
        },
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover/pipixia-9259000000001001.jpeg",
          "duration_ms": 45000
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/pipixia/homefeedpipixia.homefeed

List home feed

ParameterLocationRequiredTypeDescription
limitqueryOptionalinteger = 20Page size, 1–100 (default 20).
cursorqueryOptionalstringOpaque pagination cursor from a previous next_cursor.
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/pipixia/homefeed"

Example response

{
  "data": [
    {
      "id": "9259000000001001",
      "platform": "pipixia",
      "type": "post",
      "author": {
        "id": "9255000122",
        "username": "皮皮虾数据站",
        "display_name": "皮皮虾数据站",
        "verified": false
      },
      "title": "皮皮虾:数据 API 实战",
      "text": "一条关于数据 API 的作品。",
      "created_at": "2026-09-16T11:20:00Z",
      "metrics": {
        "likes": 21000,
        "comments": 158,
        "shares": 74,
        "views": 780000
      },
      "attachments": [
        {
          "type": "photo",
          "url": "https://cdn.example.com/images/pipixia-9259000000001001-1.jpeg"
        },
        {
          "type": "video",
          "preview_image_url": "https://cdn.example.com/cover/pipixia-9259000000001001.jpeg",
          "duration_ms": 45000
        }
      ],
      "fetched_at": "2026-09-21T09:00:00Z"
    }
  ],
  "next_cursor": null,
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 200,
      "cache_hit": false
    }
  }
}
GET/v1/pipixia/hot-searchpipixia.hot_search

Get hot search

ParameterLocationRequiredTypeDescription
max_agequeryOptionalintegerAccept data at most this many seconds old; overridden by freshness.
freshnessqueryOptionalcache | default | live = defaultFreshness mode: cache (never touches upstream), default, live (may cost extra).

Example request

curl -H "Authorization: Bearer $MESHDATA_API_KEY" \
  "https://api.fetchpi.com/v1/pipixia/hot-search"

Example response

{
  "data": {
    "platform": "pipixia",
    "type": "hot_search",
    "words": [
      {
        "word": "数据开放",
        "hot_value": 4821000
      },
      {
        "word": "实体层",
        "hot_value": 3120004
      }
    ],
    "fetched_at": "2026-09-21T09:00:00Z"
  },
  "meta": {
    "request_id": "req_01HTXQ8Z9HTQ",
    "freshness": {
      "mode": "default",
      "age_seconds": 0,
      "source_layer": "upstream",
      "stale": false
    },
    "billing": {
      "amount_credits": 100,
      "cache_hit": false
    }
  }
}