Docs
API reference and guides: authentication, error codes, pagination, freshness and the X endpoints.
OpenAPI 1.0.0
Quickstart
Quickstart in 5 minutes
Three steps from zero to your first structured response:
- Create an account — registration also creates your default workspace. Sign up
- Create an API key in the console. The secret is shown exactly once; store it securely. Create an API key
- 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"
}| Code | HTTP status | Description | Common triggers |
|---|---|---|---|
| UNAUTHENTICATED | 401 | Missing or invalid API key / session. | Data API called without a valid API key, or a console session missing/expired. |
| FORBIDDEN | 403 | Authenticated, 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_FOUND | 404 | The 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_FOUND | 404 | No 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). |
| VALIDATION | 400 | Request parameters failed validation; see error.details.fields. | Parameter validation failed: limit out of range, bad cursor, malformed id; see error.details.fields. |
| CONFLICT | 409 | Conflicting 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_EXCEEDED | 429 | Too 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_UNAVAILABLE | 503 | The 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_DISABLED | 403 | Direct 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_UNAVAILABLE | 404 | This 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_CREDITS | 402 | Not enough credits for this request. Recharge and retry. | Workspace credit balance is below the request price; details carry required/available Credits. |
| CREDITS_FROZEN | 403 | This 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_IMPLEMENTED | 501 | The capability is reserved but not implemented in V1. | Capability reserved but not implemented in V1. |
| UPSTREAM_ERROR | 502 | All eligible upstream data paths failed; the request is not billed. | All eligible upstream data paths failed; the request is not billed. |
| INTERNAL | default | Unexpected server error; quote the request_id when reporting it. | Unexpected server error; quote the request_id when reporting. |
| PAYMENT_AMOUNT_UNAVAILABLE | 402 | Every 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_DISABLED | 400 | The 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_LIMIT | 409 | The 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_RATE | 409 | This 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_STALE | 409 | The 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_AVAILABLE | 409 | This dataset is not accepting orders — it is collecting or paused (compliance). | The dataset is collecting or paused (compliance) and not accepting orders. |
| DATASET_DUPLICATE_ORDER | 409 | This 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_DISABLED | 400 | This payment provider is disabled or not configured. | The payment provider is disabled or not configured. |
| CUSTOM_REQUEST_LIMIT_EXCEEDED | 403 | Custom-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=eyJpZCI6MTAwfQnext_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:
| Field | Type | Required | Description |
|---|---|---|---|
| mode | cache | default | live | Required | Effective mode after merging param > max_age > source policy (D-004). |
| age_seconds | integer | null | Optional | Age of served data; null when unknown. |
| source_layer | cache | db | upstream | Required | Which layer served the response (PRD §10). |
| stale | boolean | Optional | True when stale data was served under stale_if_error / SWR (D-004). |
| billing.amount_credits | integer | Required | Micro-USD (1e-6 USD) actually charged for this request. |
| billing.cache_hit | boolean | Required | — |
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.
/v1/x/users/{username}x.profileX profile
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | X handle without leading @. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 404NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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
}
}
}/v1/x/users/{username}/postsx.user_postsX user posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | X handle without leading @. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown username.
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
}
}
}/v1/x/posts/{id}x.postX post detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | X post id (platform-native, numeric string). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Post not found in cache/DB/upstream.
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
}
}
}/v1/x/posts/{id}/commentsx.commentsX post comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | X post id (platform-native, numeric string). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Post not found.
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
}
}
}/v1/x/search/postsx.search_postsX search posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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
}
}
}/v1/x/users/{username}/followersx.user_followersList followers
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | X handle without leading @. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown username.
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
}
}
}/v1/x/users/{username}/followingx.user_followingList following
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | X handle without leading @. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown username.
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
}
}
}/v1/x/users/{username}/repliesx.user_repliesList user replies
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | X handle without leading @. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown username.
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
}
}
}/v1/x/users/{username}/mediax.user_mediaList user media
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | X handle without leading @. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown username.
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
}
}
}/v1/x/trendsx.trendsGet trends
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Optional | string | Country for the trends (optional). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/tiktok/users/{username}tiktok.profileTikTok profile
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | TikTok uniqueId handle without leading @. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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
}
}
}/v1/tiktok/users/{username}/poststiktok.user_postsTikTok user posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | TikTok uniqueId handle without leading @. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown username.
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
}
}
}/v1/tiktok/posts/{id}tiktok.postTikTok post detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | TikTok video id (platform-native, numeric string). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Post not found in cache/DB/upstream.
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
}
}
}/v1/tiktok/posts/{id}/commentstiktok.commentsTikTok post comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | TikTok video id (platform-native, numeric string). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Post not found.
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
}
}
}/v1/tiktok/search/poststiktok.search_postsTikTok search videos
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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
}
}
}/v1/tiktok/posts/{id}/comments/{comment_id}/repliestiktok.comment_repliesList comment replies
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | TikTok video id (platform-native, numeric string). |
| comment_id | path | Required | string | Parent comment id whose replies are listed. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Post not found.
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
}
}
}/v1/tiktok/users/{username}/followerstiktok.user_followersList followers
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | TikTok uniqueId handle without leading @. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown username.
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
}
}
}/v1/tiktok/users/{username}/followingtiktok.user_followingList following
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | TikTok uniqueId handle without leading @. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown username.
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
}
}
}/v1/tiktok/search/userstiktok.search_usersSearch users
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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/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
}
}
}/v1/tiktok/hashtags/{tag}tiktok.hashtagGet hashtag
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| tag | path | Required | string | TikTok hashtag name (without the #) or, on the posts list, the upstream challenge id forwarded as-is. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/tiktok/hashtags/{tag}/poststiktok.hashtag_postsList hashtag posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| tag | path | Required | string | TikTok hashtag name (without the #) or, on the posts list, the upstream challenge id forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/tiktok/musics/{id}tiktok.musicGet music
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | TikTok platform-native media id (music id on /musics, room id on /live, video id on /download). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/tiktok/live/{id}tiktok.live_roomGet live room
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | TikTok platform-native media id (music id on /musics, room id on /live, video id on /download). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/tiktok/search/livetiktok.live_searchSearch live rooms
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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/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
}
}
}/v1/tiktok/homefeedtiktok.homefeedGet home feed
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown username.
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
}
}
}/v1/tiktok/download/{id}tiktok.downloadResolve download
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | TikTok platform-native media id (music id on /musics, room id on /live, video id on /download). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/ig/users/{username}ig.profileInstagram profile
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Instagram username without leading @. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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
}
}
}/v1/ig/users/{username}/postsig.user_postsInstagram user posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Instagram username without leading @. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown username.
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
}
}
}/v1/ig/posts/{id}ig.postInstagram post detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Instagram post SHORTCODE (the /p/{code} addressing key). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Post not found in cache/DB/upstream.
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
}
}
}/v1/ig/posts/{id}/commentsig.commentsInstagram post comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Instagram post SHORTCODE (the /p/{code} addressing key). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Post not found.
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
}
}
}/v1/ig/search/postsig.search_postsInstagram search posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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
}
}
}/v1/ig/posts/{id}/comments/{comment_id}/repliesig.comment_repliesList comment replies
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Instagram post SHORTCODE (the /p/{code} addressing key). |
| comment_id | path | Required | string | Parent comment id whose replies are listed. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Post not found.
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
}
}
}/v1/ig/users/{username}/followersig.user_followersList followers
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Instagram username without leading @. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown username.
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
}
}
}/v1/ig/users/{username}/followingig.user_followingList following
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Instagram username without leading @. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown username.
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
}
}
}/v1/ig/search/usersig.search_usersSearch users
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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/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
}
}
}/v1/ig/users/{username}/storiesig.storiesList stories
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Instagram username without leading @. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown username.
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
}
}
}/v1/ig/users/{username}/highlightsig.highlightsList highlights
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Instagram username without leading @. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/ig/posts/{id}/likersig.post_likersList post likers
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Instagram post SHORTCODE (the /p/{code} addressing key). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Post not found in cache/DB/upstream.
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
}
}
}/v1/xhs/users/{username}xhs.profileXiaohongshu profile
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Xiaohongshu 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_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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
}
}
}/v1/xhs/users/{username}/postsxhs.user_postsXiaohongshu user posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Xiaohongshu 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). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown user.
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
}
}
}/v1/xhs/posts/{id}xhs.postXiaohongshu post detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Xiaohongshu note id. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Post not found in cache/DB/upstream.
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
}
}
}/v1/xhs/posts/{id}/commentsxhs.commentsXiaohongshu post comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Xiaohongshu note id. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Post not found.
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
}
}
}/v1/xhs/search/postsxhs.search_postsXiaohongshu search posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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
}
}
}/v1/xhs/posts/{id}/comments/{comment_id}/repliesxhs.comment_repliesList comment replies
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | TikTok video id (platform-native, numeric string). |
| comment_id | path | Required | string | Parent comment id whose sub-comments are listed. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Post not found.
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
}
}
}/v1/xhs/search/usersxhs.search_usersSearch users
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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/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
}
}
}/v1/xhs/homefeedxhs.homefeedGet home feed
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown username.
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
}
}
}/v1/youtube/users/{username}youtube.profileYouTube channel profile (a channel is the platform user)
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | YouTube 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_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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
}
}
}/v1/youtube/users/{username}/postsyoutube.user_postsYouTube channel videos
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | YouTube 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). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown channel.
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
}
}
}/v1/youtube/posts/{id}youtube.postYouTube post detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | YouTube video id. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Post not found in cache/DB/upstream.
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
}
}
}/v1/youtube/posts/{id}/commentsyoutube.commentsYouTube video comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | YouTube video id. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Post not found.
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
}
}
}/v1/youtube/search/postsyoutube.search_postsYouTube search videos
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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
}
}
}/v1/youtube/search/usersyoutube.search_usersSearch channels
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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/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
}
}
}/v1/reddit/users/{username}reddit.profileReddit profile
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Reddit username without u/. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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
}
}
}/v1/reddit/users/{username}/postsreddit.user_postsReddit user posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Reddit username without u/. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown username.
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
}
}
}/v1/reddit/posts/{id}reddit.postReddit post detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Reddit post id (t3 base36 without prefix). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Post not found in cache/DB/upstream.
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
}
}
}/v1/reddit/posts/{id}/commentsreddit.commentsReddit post comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Reddit post id (t3 base36 without prefix). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Post not found.
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
}
}
}/v1/reddit/search/postsreddit.search_postsReddit search posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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
}
}
}/v1/reddit/search/usersreddit.search_usersSearch users
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
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/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
}
}
}/v1/reddit/subreddits/{name}/postsreddit.subreddit_postsList subreddit posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| name | path | Required | string | Subreddit name without r/. |
| sort | query | Optional | hot | new | top = hot | Upstream feed order of the subreddit posts list. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/reddit/users/{username}/commentsreddit.user_commentsList user comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Reddit username without u/. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Unknown username.
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
}
}
}/v1/douyin/users/{username}douyin.profileDouyin profile
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Douyin 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_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/douyin/posts/{id}douyin.postDouyin post detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Douyin video id (platform-native aweme id; also the addressing key on /download). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/douyin/users/{username}/postsdouyin.user_postsDouyin user posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Douyin 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). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/douyin/posts/{id}/commentsdouyin.commentsDouyin post comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Douyin video id (platform-native aweme id; also the addressing key on /download). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/douyin/posts/{id}/comments/{comment_id}/repliesdouyin.comment_repliesDouyin comment replies
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Douyin video id (platform-native aweme id; also the addressing key on /download). |
| comment_id | path | Required | string | Parent comment id whose replies are listed. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/douyin/users/{username}/followersdouyin.user_followersDouyin user followers
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Douyin 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). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/douyin/users/{username}/followingdouyin.user_followingDouyin user following
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Douyin 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). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/douyin/hashtags/{tag}douyin.hashtagDouyin hashtag detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| tag | path | Required | string | Douyin hashtag addressing key: the upstream challenge id ch_id, forwarded as-is. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/douyin/hashtags/{tag}/postsdouyin.hashtag_postsDouyin hashtag posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| tag | path | Required | string | Douyin hashtag addressing key: the upstream challenge id ch_id, forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/douyin/musics/{id}douyin.musicDouyin music detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Douyin platform-native media id (music id on /musics, room id on /live). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/douyin/musics/{id}/postsdouyin.music_postsDouyin music posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Douyin platform-native media id (music id on /musics, room id on /live). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/douyin/live/{id}douyin.live_roomDouyin live room
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Douyin platform-native media id (music id on /musics, room id on /live). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/douyin/hot-searchdouyin.hot_searchDouyin hot search board
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/douyin/download/{id}douyin.downloadDouyin download URL
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Douyin video id (platform-native aweme id; also the addressing key on /download). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/kuaishou/users/{username}kuaishou.profileKuaishou profile
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Kuaishou user id — the upstream addresses users by numeric user_id, so the caller value is forwarded as-is. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/kuaishou/posts/{id}kuaishou.postKuaishou post detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Kuaishou photo id (platform-native photo_id). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/kuaishou/users/{username}/postskuaishou.user_postsKuaishou user posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Kuaishou user id — the upstream addresses users by numeric user_id, so the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/kuaishou/posts/{id}/commentskuaishou.commentsKuaishou post comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Kuaishou photo id (platform-native photo_id). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/kuaishou/search/postskuaishou.search_postsKuaishou search posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Search is unavailable in cache-only mode without results.
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
}
}
}/v1/kuaishou/posts/{id}/comments/{comment_id}/replieskuaishou.comment_repliesKuaishou comment replies
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Kuaishou photo id (platform-native photo_id). |
| comment_id | path | Required | string | Root comment id whose sub-comments are listed. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/kuaishou/search/userskuaishou.search_usersKuaishou search users
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Search is unavailable in cache-only mode without results.
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
}
}
}/v1/kuaishou/hashtags/{tag}/postskuaishou.hashtag_postsKuaishou hashtag posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| tag | path | Required | string | Kuaishou tag addressing key: the upstream general_tag_id, forwarded as-is (the pool has no tag-detail route). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/kuaishou/users/{username}/livekuaishou.live_roomKuaishou live room
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Kuaishou user id — the upstream addresses users by numeric user_id, so the caller value is forwarded as-is. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/xigua/users/{username}xigua.profileXigua Video profile
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Xigua user id — the upstream addresses users by numeric user_id, so the caller value is forwarded as-is. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/xigua/posts/{id}xigua.postXigua Video post detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Xigua video id (platform-native item id; also the addressing key on /download). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/xigua/users/{username}/postsxigua.user_postsXigua Video user posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Xigua user id — the upstream addresses users by numeric user_id, so the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/xigua/posts/{id}/commentsxigua.commentsXigua Video post comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Xigua video id (platform-native item id; also the addressing key on /download). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/xigua/search/postsxigua.search_postsXigua Video search posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Search is unavailable in cache-only mode without results.
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
}
}
}/v1/xigua/download/{id}xigua.downloadXigua Video download URL
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Xigua video id (platform-native item id; also the addressing key on /download). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/toutiao/users/{username}toutiao.profileToutiao profile
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Toutiao user id — the upstream addresses users by numeric user_id, so the caller value is forwarded as-is. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/toutiao/posts/{id}toutiao.postToutiao post detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Toutiao content id (platform-native group_id of the article). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/toutiao/posts/{id}/commentstoutiao.commentsToutiao post comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Toutiao content id (platform-native group_id of the article). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/lemon8/users/{username}lemon8.profileLemon8 profile
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Lemon8 user id — the upstream addresses users by user_id, so the caller value is forwarded as-is. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/lemon8/posts/{id}lemon8.postLemon8 post detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Lemon8 note id (platform-native item id). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/lemon8/search/postslemon8.search_postsLemon8 search posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Search is unavailable in cache-only mode without results.
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
}
}
}/v1/lemon8/users/{username}/followerslemon8.user_followersLemon8 user followers
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Lemon8 user id — the upstream addresses users by user_id, so the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/lemon8/users/{username}/followinglemon8.user_followingLemon8 user following
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Lemon8 user id — the upstream addresses users by user_id, so the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/lemon8/topics/{id}lemon8.topicLemon8 topic detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Lemon8 topic id (platform-native forum id). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/bilibili/users/{username}bilibili.profileBilibili profile
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Bilibili user addressing key (numeric uid) — the upstream addresses users by uid, so the caller value is forwarded as-is. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/bilibili/posts/{id}bilibili.postBilibili post detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Bilibili video id (platform-native BV id). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/bilibili/users/{username}/postsbilibili.user_postsBilibili user posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Bilibili user addressing key (numeric uid) — the upstream addresses users by uid, so the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/bilibili/posts/{id}/commentsbilibili.commentsBilibili post comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Bilibili video id (platform-native BV id). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/bilibili/posts/{id}/comments/{comment_id}/repliesbilibili.comment_repliesBilibili comment replies
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Bilibili video id (platform-native BV id). |
| comment_id | path | Required | string | Parent comment id (rpid) whose replies are listed. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/bilibili/search/postsbilibili.search_postsBilibili search videos
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Search is unavailable in cache-only mode without results.
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
}
}
}/v1/bilibili/popularbilibili.popularBilibili popular posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/bilibili/hot-searchbilibili.hot_searchBilibili hot search board
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/bilibili/live/{id}bilibili.live_roomBilibili live room
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Bilibili live room id (platform-native room_id). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/weibo/users/{username}weibo.profileWeibo profile
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Weibo user addressing key (numeric uid) — the upstream addresses users by uid, so the caller value is forwarded as-is. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/weibo/posts/{id}weibo.postWeibo post detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Weibo post id (platform-native status id). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/weibo/users/{username}/postsweibo.user_postsWeibo user posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Weibo user addressing key (numeric uid) — the upstream addresses users by uid, so the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/weibo/posts/{id}/commentsweibo.commentsWeibo post comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Weibo post id (platform-native status id). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/weibo/posts/{id}/comments/{comment_id}/repliesweibo.comment_repliesWeibo comment replies
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Weibo post id (platform-native status id). |
| comment_id | path | Required | string | Parent comment id (主评论 id) whose sub-comments are listed. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/weibo/posts/{id}/repostsweibo.post_repostsWeibo post reposts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Weibo post id (platform-native status id). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/weibo/posts/{id}/likersweibo.post_likersWeibo post likers
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Weibo post id (platform-native status id). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/weibo/users/{username}/followersweibo.user_followersWeibo user followers
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Weibo user addressing key (numeric uid) — the upstream addresses users by uid, so the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/weibo/users/{username}/followingweibo.user_followingWeibo user following
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Weibo user addressing key (numeric uid) — the upstream addresses users by uid, so the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/weibo/search/postsweibo.search_postsWeibo search posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Search is unavailable in cache-only mode without results.
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
}
}
}/v1/weibo/search/usersweibo.search_usersWeibo search users
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Search is unavailable in cache-only mode without results.
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
}
}
}/v1/weibo/hot-searchweibo.hot_searchWeibo hot search board
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/zhihu/users/{username}zhihu.profileZhihu profile
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Zhihu user addressing key (url_token) — the upstream addresses users by url_token, so the caller value is forwarded as-is. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/zhihu/answers/{id}zhihu.postZhihu answer detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Zhihu answer id (the canonical zhihu post surface). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/zhihu/articles/{id}zhihu.articleZhihu article detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Zhihu column article id. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/zhihu/questions/{id}zhihu.questionZhihu question detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Zhihu question id. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/zhihu/questions/{id}/answerszhihu.question_answersZhihu question answers
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Zhihu question id. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/zhihu/users/{username}/answerszhihu.user_answersZhihu user answers
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Zhihu user addressing key (url_token) — the upstream addresses users by url_token, so the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/zhihu/users/{username}/articleszhihu.user_articlesZhihu user articles
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Zhihu user addressing key (url_token) — the upstream addresses users by url_token, so the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/zhihu/answers/{id}/commentszhihu.commentsZhihu answer comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Zhihu answer id (the canonical zhihu post surface). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/zhihu/answers/{id}/comments/{comment_id}/replieszhihu.comment_repliesZhihu comment replies
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Zhihu answer id (the canonical zhihu post surface). |
| comment_id | path | Required | string | Parent comment id whose sub-comments are listed. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/zhihu/users/{username}/followerszhihu.user_followersZhihu user followers
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Zhihu user addressing key (url_token) — the upstream addresses users by url_token, so the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/zhihu/users/{username}/followingzhihu.user_followingZhihu user following
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Zhihu user addressing key (url_token) — the upstream addresses users by url_token, so the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/zhihu/search/postszhihu.search_postsZhihu search posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Search is unavailable in cache-only mode without results.
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
}
}
}/v1/zhihu/search/userszhihu.search_usersZhihu search users
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Search is unavailable in cache-only mode without results.
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
}
}
}/v1/zhihu/hot-listzhihu.hot_listZhihu hot list
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/threads/users/{username}threads.profileGet profile
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Threads user addressing key — profiles address by username, the lists by numeric user_id; the caller value is forwarded as-is. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/threads/posts/{id}threads.postGet post
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Threads post id (platform-native pk). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/threads/users/{username}/poststhreads.user_postsList user posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Threads user addressing key — profiles address by username, the lists by numeric user_id; the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/threads/users/{username}/repliesthreads.user_repliesList user replies
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Threads user addressing key — profiles address by username, the lists by numeric user_id; the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/threads/users/{username}/repoststhreads.user_repostsList user reposts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Threads user addressing key — profiles address by username, the lists by numeric user_id; the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/threads/posts/{id}/commentsthreads.commentsList post comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Threads post id (platform-native pk). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/threads/search/usersthreads.search_usersSearch users
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Search is unavailable in cache-only mode without results.
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
}
}
}/v1/linkedin/users/{username}linkedin.profileGet profile
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | LinkedIn member addressing key: the profile URL percent-encoded — forwarded as-is as the upstream url query. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/linkedin/users/{username}/postslinkedin.user_postsList user posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | LinkedIn member addressing key: the profile URL percent-encoded — forwarded as-is as the upstream url query. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/linkedin/companies/{username}linkedin.company_profileGet company profile
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | LinkedIn company addressing key: the company page URL percent-encoded — forwarded as-is as the upstream url query. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/linkedin/companies/{username}/postslinkedin.company_postsList company posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | LinkedIn company addressing key: the company page URL percent-encoded — forwarded as-is as the upstream url query. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/linkedin/posts/{id}linkedin.postGet post
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | LinkedIn post addressing key: the post URL percent-encoded — forwarded as-is as the upstream url query. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/linkedin/posts/{id}/commentslinkedin.post_commentsList post comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | LinkedIn share URN percent-encoded — forwarded as-is as the upstream urn query. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/linkedin/jobs/{id}linkedin.jobGet job detail
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | LinkedIn job addressing key: the job URL percent-encoded — forwarded as-is as the upstream url query. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/linkedin/search/jobslinkedin.search_jobsSearch jobs
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Search is unavailable in cache-only mode without results.
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
}
}
}/v1/telegram/channels/{username}telegram.profileGet channel info
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Telegram channel addressing key (the channel handle) — forwarded as-is as the upstream channel query. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/telegram/channels/{username}/poststelegram.user_postsList channel posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Telegram channel addressing key (the channel handle) — forwarded as-is as the upstream channel query. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/telegram/channels/{username}/posts/{id}telegram.postGet post
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Telegram channel addressing key (the channel handle) — forwarded as-is as the upstream channel query. |
| id | path | Required | string | Telegram message id (the upstream post_id query). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/telegram/channels/{username}/posts/{id}/commentstelegram.commentsList post comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Telegram channel addressing key (the channel handle) — forwarded as-is as the upstream channel query. |
| id | path | Required | string | Telegram message id (the upstream post_id query). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/telegram/channels/{username}/search/poststelegram.search_postsSearch channel posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Telegram channel addressing key (the channel handle) — forwarded as-is as the upstream channel query. |
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Search is unavailable in cache-only mode without results.
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
}
}
}/v1/telegram/channels/{username}/similartelegram.similar_channelsList similar channels
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Telegram channel addressing key (the channel handle) — forwarded as-is as the upstream channel query. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/pipixia/users/{username}pipixia.profileGet profile
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Pipixia user addressing key (numeric user_id) — the upstream addresses users by user_id, so the caller value is forwarded as-is. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/pipixia/users/{username}/postspipixia.user_postsList user posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Pipixia user addressing key (numeric user_id) — the upstream addresses users by user_id, so the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/pipixia/users/{username}/followerspipixia.user_followersList followers
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Pipixia user addressing key (numeric user_id) — the upstream addresses users by user_id, so the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/pipixia/users/{username}/followingpipixia.user_followingList following
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| username | path | Required | string | Pipixia user addressing key (numeric user_id) — the upstream addresses users by user_id, so the caller value is forwarded as-is. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/pipixia/posts/{id}pipixia.postGet post
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Pipixia work id (platform-native cell id). |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/pipixia/posts/{id}/commentspipixia.commentsList post comments
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| id | path | Required | string | Pipixia work id (platform-native cell id). |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/pipixia/search/postspipixia.search_postsSearch posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| q | query | Required | string | Search query text. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
- 400VALIDATION
- 401UNAUTHENTICATED
- 402INSUFFICIENT_CREDITS
- 403FORBIDDEN
- 403CREDITS_FROZEN
- 404DATA_NOT_FOUND
- 429RATE_LIMIT_EXCEEDED
- 502UPSTREAM_ERROR
- 503RATE_LIMITER_UNAVAILABLE
- defaultINTERNAL
404 — Search is unavailable in cache-only mode without results.
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
}
}
}/v1/pipixia/hashtags/{tag}pipixia.hashtagGet hashtag
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| tag | path | Required | string | Pipixia hashtag id — forwarded as-is as the upstream hashtag_id query. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/pipixia/hashtags/{tag}/postspipixia.hashtag_postsList hashtag posts
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| tag | path | Required | string | Pipixia hashtag id — forwarded as-is as the upstream hashtag_id query. |
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/pipixia/homefeedpipixia.homefeedList home feed
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| limit | query | Optional | integer = 20 | Page size, 1–100 (default 20). |
| cursor | query | Optional | string | Opaque pagination cursor from a previous next_cursor. |
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}/v1/pipixia/hot-searchpipixia.hot_searchGet hot search
| Parameter | Location | Required | Type | Description |
|---|---|---|---|---|
| max_age | query | Optional | integer | Accept data at most this many seconds old; overridden by freshness. |
| freshness | query | Optional | cache | default | live = default | Freshness mode: cache (never touches upstream), default, live (may cost extra). |
Responses
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
}
}
}