Reference
API reference
Generated from the live spec at /openapi.json, so what is printed here is what the server serves. Every operation publishes its price as x-credit-cost.
Endpoints
173
Platforms
28
Cacheable
173
hits cost 0 credits
Batchable
168
usable in /v1/jobs/batch
Amazon
/v1/amazon/shop1 creditcacheablebatchableneeds proxiesAmazon Shop page
A creator's public Amazon storefront: their name, and the product links the page exposes.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Storefront URL (https://www.amazon.com/shop/<handle>) or just the handle |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/amazon/shop?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/amazon/shop?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/amazon/shop",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
Apple-music
/v1/apple-music/album1 creditcacheablebatchableAlbum details
Public Apple Music album: artist, release date, genre, copyright, artwork and total runtime. The full track listing is in raw — add include_raw=true.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | yes | Apple Music album id (1708308989) or a music.apple.com album URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/apple-music/album?id=%3Cid%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
id: '<id>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/apple-music/album?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/apple-music/album",
params={
"id": "<id>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/apple-music/artist1 creditcacheablebatchableArtist details
Public Apple Music artist page: editorial bio, artist image and genre. Apple publishes no follower or play counts, so those fields are null rather than guessed.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | yes | Apple Music artist id (159260351) or a music.apple.com artist URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/apple-music/artist?id=%3Cid%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
id: '<id>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/apple-music/artist?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/apple-music/artist",
params={
"id": "<id>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/apple-music/search1 creditcacheablebatchableSearch
Search the Apple Music catalogue for tracks, albums or artists. Tracks and albums come back as posts; artists come back as creators.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Search terms |
| type | track | album | artist | no | defaults to track |
| limit | number | no | defaults to 25 |
| country | string | no | Two-letter storefront, e.g. us, gb, dedefaults to us |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/apple-music/search?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/apple-music/search?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/apple-music/search",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/apple-music/track1 creditcacheablebatchableTrack details
Public Apple Music track: artist, album, duration, genre, release date and the 30-second preview URL.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | yes | Apple Music track id (1833328840), a /song/ URL, or an album URL with ?i=<track id> |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/apple-music/track?id=%3Cid%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
id: '<id>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/apple-music/track?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/apple-music/track",
params={
"id": "<id>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
Bluesky
/v1/bluesky/post1 creditcacheablebatchablePost
A single public Bluesky post with like, reply, repost and quote counts, plus any attached images or video.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Post URL (https://bsky.app/profile/<handle>/post/<id>) or an at:// URI |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/bluesky/post?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/bluesky/post?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/bluesky/post",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/bluesky/profile1 creditcacheablebatchableProfile
Public profile for a Bluesky account: followers, following, post count, bio, avatar, banner, and verification status.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (alice.bsky.social), a did:plc:… identifier, or a bsky.app profile URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/bluesky/profile?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/bluesky/profile?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/bluesky/profile",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/bluesky/user/posts1 creditcacheablebatchableUser posts
Recent public posts from a Bluesky account, newest first. Reposts are excluded by default so the feed reflects what the account actually wrote.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle, did, or bsky.app profile URL |
| count | number | no | defaults to 50 |
| cursor | string | no | pagination.cursor from a previous response |
| include_reposts | boolean | no | Include reposts of other accounts. Default false. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/bluesky/user/posts?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/bluesky/user/posts?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/bluesky/user/posts",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/ad-library/ad1 creditcacheablebatchableAd details
One ad from the Meta Ad Library by its archive id. Meta does not expose the archive as an addressable node for every ad; pass page_id as well and we find it by scanning that advertiser's archive instead.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | yes | Ad archive id, or an Ad Library URL containing ?id= |
| page_id | string | no | The advertiser's page id. Enables the archive-scan fallback. |
| country | string | no | Reached country used by the fallback scandefaults to US |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/ad-library/ad?id=%3Cid%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
id: '<id>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/ad-library/ad?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/ad-library/ad",
params={
"id": "<id>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/ad-library/advertisers1 creditcacheablebatchableFind advertisers running ads
Distinct advertisers whose ads match a search term, with the page_id needed by /v1/facebook/ad-library/page-ads. Derived from the official Ad Library search — Meta has no advertiser-search endpoint of its own.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Advertiser name or a term from their ad copy |
| country | string | no | defaults to US |
| status | active | inactive | all | no | defaults to active |
| limit | number | no | Ads sampled, 1-100. More ads means more advertisers. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/ad-library/advertisers?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/ad-library/advertisers?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/ad-library/advertisers",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/ad-library/page-ads2 creditscacheablebatchableAll ads for one advertiser
Every ad a specific Facebook page is running or has run, from Meta's official Ad Library API. This is the competitor-monitoring endpoint: page it with cursor to pull a full creative history.
| Parameter | Type | Required | Description |
|---|---|---|---|
| page_id | string | yes | Numeric page id, or an Ad Library URL containing view_all_page_id |
| country | string | no | ISO-3166 country code(s) the ad reached, comma-separated. Meta requires at least one.defaults to US |
| status | active | inactive | all | no | Delivery status at the time of the query.defaults to active |
| ad_type | all | political | housing | employment | credit | no | political unlocks Meta's spend, impression and demographic fields.defaults to all |
| media_type | all | image | meme | video | none | no | — |
| platform | string | no | Comma-separated: facebook, instagram, messenger, audience_network, threads, whatsapp, oculus |
| language | string | no | Comma-separated BCP-47 codes, e.g. "en,es" |
| start_date | string | no | Earliest delivery date, YYYY-MM-DD |
| end_date | string | no | Latest delivery date, YYYY-MM-DD |
| limit | number | no | Ads per page, 1-100. Default 25. |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/ad-library/page-ads?page_id=%3Cpage_id%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
page_id: '<page_id>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/ad-library/page-ads?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 2 credits, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/ad-library/page-ads",
params={
"page_id": "<page_id>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/ad-library/search2 creditscacheablebatchableSearch the Meta Ad Library
Every Facebook, Instagram, Messenger and Threads ad matching a search term, from Meta's official Ad Library API. Political and issue ads additionally carry spend and impression ranges.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Search term, matched against ad text and advertiser name |
| search_type | unordered | exact_phrase | no | exact_phrase matches the words in orderdefaults to unordered |
| country | string | no | ISO-3166 country code(s) the ad reached, comma-separated. Meta requires at least one.defaults to US |
| status | active | inactive | all | no | Delivery status at the time of the query.defaults to active |
| ad_type | all | political | housing | employment | credit | no | political unlocks Meta's spend, impression and demographic fields.defaults to all |
| media_type | all | image | meme | video | none | no | — |
| platform | string | no | Comma-separated: facebook, instagram, messenger, audience_network, threads, whatsapp, oculus |
| language | string | no | Comma-separated BCP-47 codes, e.g. "en,es" |
| start_date | string | no | Earliest delivery date, YYYY-MM-DD |
| end_date | string | no | Latest delivery date, YYYY-MM-DD |
| limit | number | no | Ads per page, 1-100. Default 25. |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/ad-library/search?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/ad-library/search?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 2 credits, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/ad-library/search",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/comment-replies1 creditcacheablebatchableneeds proxiesReplies to a comment
Replies under one comment on a public Facebook post. Pass the post URL and the comment id (the id of any item from /v1/facebook/post-comments).
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Full post URL the comment sits on |
| comment_id | string | yes | Numeric comment id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/comment-replies?url=8XkPqR2nLvE&comment_id=%3Ccomment_id%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
comment_id: '<comment_id>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/comment-replies?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/comment-replies",
params={
"url": "8XkPqR2nLvE",
"comment_id": "<comment_id>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/event1 creditcacheablebatchableneeds proxiesEvent details
Full details for one public Facebook event: description, start and end time, venue with coordinates, host and ticket price range.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Event URL or numeric event id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/event?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/event?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/event",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/events/search1 creditcacheablebatchableneeds proxiesSearch public events
Public Facebook events matching a search term. Results are ranked and location-biased by the exit IP, so the same query returns a different set from a different proxy — treat this as discovery, not as an enumerable list.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | What to search for, e.g. "jazz festival" |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/events/search?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/events/search?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/events/search",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/group1 creditcacheablebatchableneeds proxiesPublic group info
Name, member count, privacy setting and description for a public Facebook group. Member count lands in followerCount — it is a group's equivalent of an audience size — and the privacy setting in category. Facebook rounds that count on large groups ("12K members"); raw.memberCountIsApproximate says whether the number you got was rounded.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Group URL, group id, or group slug |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/group?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/group?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/group",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/group-posts1 creditcacheablebatchableneeds proxiesPublic group posts
Recent posts from a public Facebook group, with reaction, comment and share counts where Facebook renders them. Only the newest few stories render to a logged-out visitor, the same limit /v1/facebook/page-posts has. Private groups return an empty result — their posts are not public and we do not log in.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Group URL, group id, or group slug |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/group-posts?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/group-posts?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/group-posts",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/marketplace/item1 creditcacheablebatchableneeds proxiesMarketplace listing details
One public Facebook Marketplace listing: title, full description, price, location, delivery options and every photo. Facebook does not render the seller to a logged-out visitor, so seller identity is not returned.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Marketplace item URL or numeric listing id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/marketplace/item?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/marketplace/item?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/marketplace/item",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/marketplace/locations1 creditcacheablebatchableneeds proxiesFind a Marketplace location
Resolve a place name to the Marketplace location ids /v1/facebook/marketplace/search accepts, plus the neighbouring locations Facebook offers around it. Marketplace is city-scoped, so this is how you search a city you are not sitting in.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Place name, e.g. "London" or "San Francisco" |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/marketplace/locations?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/marketplace/locations?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/marketplace/locations",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/marketplace/search1 creditcacheablebatchableneeds proxiesSearch Marketplace listings
Public Facebook Marketplace listings matching a search term, with price, condition flags, location and photos. location takes a city slug or a location id from /v1/facebook/marketplace/locations; without one, Facebook picks the city its geolocation puts the request in, which means the proxy decides.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | What to search for, e.g. "mountain bike" |
| location | string | no | City slug ("nyc", "london") or a location id from /v1/facebook/marketplace/locations |
| min_price | number | no | Lowest price, in the location's currency |
| max_price | number | no | Highest price, in the location's currency |
| days_since_listed | number | no | Only listings posted in the last N days |
| radius_km | number | no | Search radius around the location, in kilometres |
| sort_by | best_match | creation_time_descend | price_ascend | price_descend | distance_ascend | no | Facebook's own sort keys |
| delivery_method | local_pick_up | shipping | no | Restrict to collection-only or shipped listings |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/marketplace/search?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/marketplace/search?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/marketplace/search",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/page-posts1 creditcacheablebatchableneeds proxiesPublic Page posts
Recent public posts from a Facebook Page, with text, reaction, comment and share counts, and the publish timestamp. Logged out, Facebook server-renders only the newest one to three stories and loads the rest on scroll behind an authenticated call — measured 2026-08-20 across four different Page URL shapes — so this returns the head of the feed, not its history. raw.hasMoreBehindCursor reports whether Facebook says there is more.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Page URL, @handle, slug, or numeric page id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/page-posts?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/page-posts?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/page-posts",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/page-reels1 creditcacheablebatchableneeds proxiesPublic Page videos and reels
Public videos and reels from a Facebook Page. Reads the Page's reels tab first and falls back to its video grid, which renders around twenty entries with titles, view counts and durations — so a Page with no reels returns its videos rather than an error. Items are keyed by video id and can be passed straight to /v1/facebook/post or /v1/facebook/post-transcript.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Page URL, @handle, slug, or numeric page id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/page-reels?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/page-reels?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/page-reels",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/post1 creditcacheablebatchableneeds proxiesSingle post, video, or reel
One public Facebook post, video or reel by URL, with its text and engagement counts.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Full post, video, or reel URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/post?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/post?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/post",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/post-comments1 creditcacheablebatchableneeds proxiesComments on a post
Top-level comments on a public Facebook post, with author, reaction count and reply count. Logged out, Facebook renders the "Most relevant" head of the thread (roughly the first ten comments) rather than the whole thread — the post's full comment total is on /v1/facebook/post. Use /v1/facebook/comment-replies for the replies under one comment. likeCount is only as precise as Facebook publishes it: comment reactions ship in abbreviated form ("2.4K") with no exact figure anywhere in the payload, so counts above about a thousand are rounded at source.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Full post, video, or reel URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/post-comments?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/post-comments?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/post-comments",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/post-transcript1 creditcacheablebatchableneeds proxiesVideo transcript
Transcript for a public Facebook video or reel, as one text block plus timed cues. Reads the caption track Facebook publishes for the video — auto-generated when the uploader added none. Videos with captions disabled return an empty result and are not charged.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Full video or reel URL |
| language | string | no | Preferred caption locale, e.g. "en" or "en_US" |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/post-transcript?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/post-transcript?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/post-transcript",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/profile1 creditcacheablebatchableneeds proxiesPublic Page profile
Name, category, follower and like counts, description, banner and outbound links for a public Facebook Page. followerCount is as precise as Facebook renders it — exact on a small Page ("498 followers"), rounded on a large one ("28M followers", so ±500,000). raw.followerCountIsApproximate says which you got, and raw.likeCount carries the exact like figure Facebook always prints.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Page URL, @handle, slug, or numeric page id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/profile?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/profile?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/profile",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/profile-events1 creditcacheablebatchableneeds proxiesEvents on a Page
Events hosted by a public Facebook Page — upcoming ones first, with past events where Facebook still lists them. Each carries start time, place, host and the cover photo.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Page URL, @handle, slug, or numeric page id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/profile-events?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/profile-events?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/profile-events",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/facebook/profile-photos1 creditcacheablebatchableneeds proxiesPhotos on a Page
Photos from a public Facebook Page's photo grid. Facebook exposes each photo's accessibility caption rather than the text of the post it came from, so that is what lands in title.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Page URL, @handle, slug, or numeric page id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/facebook/profile-photos?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/facebook/profile-photos?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/facebook/profile-photos",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
Github
/v1/github/repository1 creditcacheablebatchableRepository details
Public details for a repository: stars, forks, open issues, topics, language and licence. Stars map to likeCount, forks to shareCount.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | "owner/repo" or a github.com repository URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/github/repository?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/github/repository?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/github/repository",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/github/trending/developers1 creditcacheableTrending developers
The public github.com/trending/developers board. Counts are null: the board renders names and popular repositories, not follower numbers.
| Parameter | Type | Required | Description |
|---|---|---|---|
| language | string | no | Language slug, e.g. "rust" |
| since | daily | weekly | monthly | no | defaults to daily |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/github/trending/developers?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/github/trending/developers?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/github/trending/developers",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/github/trending/repositories1 creditcacheableTrending repositories
The public github.com/trending board. likeCount is total stars and shareCount total forks; the stars gained in the period are in raw.
| Parameter | Type | Required | Description |
|---|---|---|---|
| language | string | no | Language slug, e.g. "typescript" |
| since | daily | weekly | monthly | no | defaults to daily |
| spoken_language_code | string | no | Two-letter code, e.g. "en" |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/github/trending/repositories?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/github/trending/repositories?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/github/trending/repositories",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/github/user1 creditcacheablebatchableUser or organisation profile
Public profile for a GitHub user or organisation: followers, public repo count, bio, company, location and links. **Required:** Pass either handle or url.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | no | Username, e.g. "torvalds" |
| url | string | no | Profile URL, e.g. https://github.com/torvalds |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/github/user?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/github/user?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/github/user",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/github/user/activity1 creditcacheablebatchablePublic activity
Public events for a user — pushes, pull requests, issues, stars, forks and releases. GitHub caps this feed at 300 events / 90 days regardless of paging. **Required:** Pass either handle or url.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | no | Username, e.g. "torvalds" |
| url | string | no | Profile URL, e.g. https://github.com/torvalds |
| cursor | string | no | Page number from the previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/github/user/activity?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/github/user/activity?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/github/user/activity",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/github/user/contributions1 creditcacheablebatchableContributions calendar
The contribution graph for one calendar year: a per-day count plus GitHub's 0–4 intensity level, and the annual total. **Required:** Pass either handle or url.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | no | Username, e.g. "torvalds" |
| url | string | no | Profile URL, e.g. https://github.com/torvalds |
| year | string | no | Calendar year, e.g. "2025". Defaults to the current year. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/github/user/contributions?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/github/user/contributions?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/github/user/contributions",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/github/user/followers1 creditcacheablebatchableFollowers
Accounts following this user, 30 per page. GitHub serves a reduced user payload here, so per-account counts are null. **Required:** Pass either handle or url.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | no | Username, e.g. "torvalds" |
| url | string | no | Profile URL, e.g. https://github.com/torvalds |
| cursor | string | no | Page number from the previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/github/user/followers?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/github/user/followers?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/github/user/followers",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/github/user/following1 creditcacheablebatchableFollowing
Accounts this user follows, 30 per page. GitHub serves a reduced user payload here, so per-account counts are null. **Required:** Pass either handle or url.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | no | Username, e.g. "torvalds" |
| url | string | no | Profile URL, e.g. https://github.com/torvalds |
| cursor | string | no | Page number from the previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/github/user/following?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/github/user/following?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/github/user/following",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/github/user/pull-requests1 creditcacheablebatchablePull requests by a user
Pull requests authored by a user across all public repositories, newest first. since / until filter on creation date.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Username, e.g. "gaearon" |
| since | string | no | Only PRs created on or after this date (YYYY-MM-DD) |
| until | string | no | Only PRs created on or before this date (YYYY-MM-DD) |
| cursor | string | no | Page number from the previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/github/user/pull-requests?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/github/user/pull-requests?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/github/user/pull-requests",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/github/user/repositories1 creditcacheablebatchableUser repositories
Public repositories owned by a user or organisation, 30 per page. **Required:** Pass either handle or url.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | no | Username, e.g. "torvalds" |
| url | string | no | Profile URL, e.g. https://github.com/torvalds |
| type | all | owner | member | no | defaults to owner |
| sort | created | updated | pushed | full_name | no | defaults to updated |
| direction | asc | desc | no | defaults to desc |
| cursor | string | no | Page number from the previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/github/user/repositories?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/github/user/repositories?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/github/user/repositories",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/google/ad-library/ad1 creditcacheablebatchableAd details
One creative from the Ads Transparency Centre, with every rendering variant and the per-country dates it ran.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Creative URL, e.g. https://adstransparency.google.com/advertiser/AR.../creative/CR...?region=US |
| region | string | no | Overrides the region in the URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/google/ad-library/ad?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/google/ad-library/ad?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/google/ad-library/ad",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/google/ad-library/advertiser-ads2 creditscacheablebatchableAds run by an advertiser or domain
Creatives in the Ads Transparency Centre for one advertiser id or one verified domain, with first-shown and last-shown dates. Pass the cursor from the previous response to page. **Required:** Pass either domain or advertiser_id.
| Parameter | Type | Required | Description |
|---|---|---|---|
| domain | string | no | Verified advertiser domain, e.g. "nike.com" |
| advertiser_id | string | no | Advertiser id from /ad-library/advertisers, e.g. "AR167..." |
| region | string | no | Two-letter country code (US, GB, DE, IN, ...) or a Google geo criteria iddefaults to US |
| cursor | string | no | Continuation token from the previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/google/ad-library/advertiser-ads?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/google/ad-library/advertiser-ads?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 2 credits, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/google/ad-library/advertiser-ads",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/google/ad-library/advertisers1 creditcacheablebatchableFind advertisers in the Ads Transparency Centre
Advertisers matching a name, with the advertiser id that /v1/google/ad-library/advertiser-ads needs, plus the verified domains Google suggests for the same term.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Advertiser or brand name, e.g. "nike" |
| region | string | no | Two-letter country code (US, GB, DE, IN, ...) or a Google geo criteria iddefaults to US |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/google/ad-library/advertisers?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/google/ad-library/advertisers?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/google/ad-library/advertisers",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/google/search1 creditcacheablebatchableneeds proxiesWeb search results
Organic Google results for a query. Requires residential proxies or the scraper API — Google refuses a datacenter IP.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | — |
| region | string | no | Two-letter country code (US, GB, DE, IN, ...) or a Google geo criteria iddefaults to US |
| date_posted | hour | day | week | month | year | no | — |
| page | string | no | 1-based page number |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/google/search?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/google/search?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/google/search",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
Inference
/v1/detect-age-gender1 creditcacheablebatchableexperimentalEstimate age and gender from an image
Apparent age and gender estimated from a public image URL. This is a model ESTIMATE, not measured platform data, and every response is labelled as such. Requires an inference provider to be configured on the deployment.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Public image URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/detect-age-gender?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/detect-age-gender?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/detect-age-gender",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/audio-reels1 creditcacheablebatchableneeds proxiesexperimentalReels using a sound
Reels built on one audio track — the "N reels using this audio" list. Takes the numeric audio id or a /reels/audio/ URL. Falls back to the server-rendered audio page, which returns the first grid only.
| Parameter | Type | Required | Description |
|---|---|---|---|
| audio_id | string | yes | Numeric audio id, or a /reels/audio/<id>/ URL |
| cursor | string | no | pagination.cursor from a previous response |
| count | number | no | Reels per page, 1-50. Default 12. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/audio-reels?audio_id=%3Caudio_id%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
audio_id: '<audio_id>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/audio-reels?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/audio-reels",
params={
"audio_id": "<audio_id>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/basic-profile1 creditcacheablebatchableneeds proxiesexperimentalProfile by numeric id
The lightweight profile payload, addressed by numeric user id. Use this when you already hold an id — it skips the handle lookup and returns a smaller object than /v1/instagram/profile, which stays the right call when you have a handle and want everything. **Required:** Pass either handle or user_id.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | no | Handle (@nike), or a full instagram.com profile URL. Optional if user_id is given. |
| user_id | string | no | Numeric user id. Skips a lookup — take it from data.items[].authorId. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/basic-profile?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/basic-profile?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/basic-profile",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/comment-replies1 creditcacheableneeds proxiesexperimentalReplies under one comment
The full reply thread under a single comment. Take comment_id from data.items[].id on /v1/instagram/post-comments; the post URL is still required because Instagram addresses replies through the media that carries them.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Post, reel or IGTV URL, or a bare shortcode |
| comment_id | string | yes | data.items[].id from /v1/instagram/post-comments |
| cursor | string | no | pagination.cursor from a previous response |
| count | number | no | Replies per page, 1-50. Default 24. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/comment-replies?url=8XkPqR2nLvE&comment_id=%3Ccomment_id%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
comment_id: '<comment_id>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/comment-replies?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/comment-replies",
params={
"url": "8XkPqR2nLvE",
"comment_id": "<comment_id>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/hashtag-posts1 creditcacheablebatchableneeds proxiesexperimentalPosts under a hashtag
Posts carrying a hashtag. tab=top is Instagram's ranking (one fixed page, no cursor); tab=recent is chronological and paginates. Falls back to the server-rendered tag page when the JSON surface declines, which returns the top grid only.
| Parameter | Type | Required | Description |
|---|---|---|---|
| hashtag | string | yes | Hashtag (#nasa or nasa), or an /explore/tags/ URL |
| tab | top | recent | no | Instagram's ranking, or chronologicaldefaults to top |
| cursor | string | no | pagination.cursor from a previous response — recent only |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/hashtag-posts?hashtag=%3Chashtag%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
hashtag: '<hashtag>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/hashtag-posts?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/hashtag-posts",
params={
"hashtag": "<hashtag>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/highlight1 creditcacheablebatchableneeds proxiesexperimentalStories inside a highlight
Every story in one highlight reel, oldest first, with its media URLs. Takes the id from /v1/instagram/user-highlights, a bare numeric id, or a /stories/highlights/ URL.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | yes | Highlight id ("highlight:17…" or the bare number), or a /stories/highlights/ URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/highlight?id=%3Cid%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
id: '<id>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/highlight?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/highlight",
params={
"id": "<id>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/popular-search1 creditcacheablebatchableneeds proxiesexperimentalTop posts for a keyword
Instagram's keyword results across every media type — reels, images and carousels together. The same surface as /v1/instagram/reels-search without the clips filter.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Keyword to search for |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/popular-search?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/popular-search?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/popular-search",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/post1 creditcacheablebatchableneeds proxiesexperimentalPost or reel details
One public post, reel or carousel with its caption, media URLs and engagement counts. Falls back to Instagram's public embed payload when the web client's persisted query is unavailable, so a Meta client release degrades this rather than breaking it.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Post, reel or IGTV URL, or a bare shortcode |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/post?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/post?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/post",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/post-comments1 creditcacheablebatchableneeds proxiesexperimentalComments on a post or reel
Top-level comments, newest first. Set include_replies=true to also return any replies Instagram shipped inline with their parent — for the full reply thread under one comment, use /v1/instagram/comment-replies.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Post, reel or IGTV URL, or a bare shortcode |
| cursor | string | no | pagination.cursor from a previous response |
| count | number | no | Comments per page, 1-50. Default 24. |
| include_replies | boolean | no | Include replies that arrived inline with their parent comment |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/post-comments?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/post-comments?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/post-comments",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/profile1 creditcacheablebatchableneeds proxiesexperimentalProfile details
Public profile for an Instagram account: followers, following, post count, bio, links and business category. Private accounts return their public shell with isPrivate: true rather than an error — that is a real answer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@nike), or a full instagram.com profile URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/profile?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/profile?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/profile",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/profile-search1 creditcacheablebatchableneeds proxiesexperimentalSearch accounts
Accounts matching a query, as unified Creators. The follower counts on a search result are Instagram's own summary and are thinner than /v1/instagram/profile — fetch that for one account you care about. One page only; this surface has no cursor.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Handle or name to search for |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/profile-search?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/profile-search?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/profile-search",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/reels-search1 creditcacheablebatchableneeds proxiesexperimentalSearch reels by keyword
Reels matching a keyword, from Instagram's own keyword search rather than its hashtag index — the two return genuinely different sets, so this never quietly substitutes one for the other. Results are whatever Instagram ranked for the query at that moment.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Keyword to search for |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/reels-search?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/reels-search?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/reels-search",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/search1 creditcacheablebatchableneeds proxiesexperimentalSearch accounts, hashtags and places
Instagram's blended search — the one behind the search box. Returns three buckets: users as unified Creators, plus hashtags and places, which have no unified equivalent and keep Instagram's own shape. One page only; this surface has no cursor.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | What to search for |
| type | all | users | hashtags | places | no | Restrict to one kind of resultdefaults to all |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/search?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/search?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/search",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/transcript1 creditcacheablebatchableneeds proxiesexperimentalReel or video transcript
The caption track Instagram published for a reel or video, as one text block plus timed cues. We return Instagram's own track and never transcribe the audio ourselves, so a transcript here is always what the platform said rather than what a model guessed. **Read this before relying on it:** checked against 12 real reel payloads, none carried a caption track in any form — no inline transcript, and DASH manifests with video and audio tracks only. On current evidence Instagram publishes none, so this returns empty_result (free, never charged) rather than a transcript. It is shipped as experimental so the shape is stable if that changes.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Reel, post or IGTV URL, or a bare shortcode |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/transcript?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/transcript?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/transcript",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/trending-reels1 creditcacheableneeds proxiesexperimentalReels trending on Explore
Reels off Instagram's public Explore grid. Worth knowing what this is and is not: Explore is region-shaped, so what comes back depends on where the request exits, and it is Instagram's editorial surface rather than a global chart. There is no public trending feed on Instagram; this is the closest one that exists.
| Parameter | Type | Required | Description |
|---|---|---|---|
| cursor | string | no | pagination.cursor from a previous response |
| count | number | no | Reels per page, 1-50. Default 24. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/trending-reels?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/trending-reels?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/trending-reels",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/user-embed1 creditcacheablebatchableneeds proxiesexperimentalProfile via the public embed card
A profile read off Instagram's public embed card, with the embed HTML in raw.html for anyone who wants to render it. Instagram publishes embeds so third parties can display them, which makes this the profile path it has the least reason to gate — the same reasoning that puts the post embed on /v1/instagram/post's fallback. It carries fewer fields than /v1/instagram/profile; reach for it when that one is blocked, or when you want the markup.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@nike), or a full instagram.com profile URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/user-embed?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/user-embed?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/user-embed",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/user-highlights1 creditcacheablebatchableneeds proxiesexperimentalStory highlight covers
The highlight reels pinned to a profile: title, cover, and how many stories each holds. Pass an id from here to /v1/instagram/highlight for the stories inside one. Highlights are the only Instagram stories that stay public indefinitely — live stories expire in 24 hours and are not served logged-out. **Required:** Pass either handle or user_id.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | no | Handle (@nike), or a full instagram.com profile URL. Optional if user_id is given. |
| user_id | string | no | Numeric user id. Skips a lookup — take it from data.items[].authorId. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/user-highlights?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/user-highlights?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/user-highlights",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/user-posts1 creditcacheablebatchableneeds proxiesexperimentalPosts and reels from a profile
A profile grid, newest first. The first page comes from the same payload as the profile and is the reliable one; pass cursor (and ideally user_id) for older pages, which Instagram serves far less consistently to logged-out callers.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@nike), or a full instagram.com profile URL |
| cursor | string | no | pagination.cursor from a previous response |
| user_id | string | no | Numeric user id. Saves a round trip when paginating; take it from data.items[].authorId. |
| count | number | no | Posts per page when paginating, 1-50. Default 12. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/user-posts?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/user-posts?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/user-posts",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/user-reels1 creditcacheablebatchableneeds proxiesexperimentalReels from a profile
A profile's reels, newest first. Primary path is the reels tab's own feed; if Instagram declines it, this falls back to filtering the profile grid down to clips, so the endpoint degrades in density rather than going dark. raw.via says which answered. **Required:** Pass either handle or user_id.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | no | Handle (@nike), or a full instagram.com profile URL. Optional if user_id is given. |
| user_id | string | no | Numeric user id. Skips a lookup — take it from data.items[].authorId. |
| cursor | string | no | pagination.cursor from a previous response |
| count | number | no | Reels per page, 1-50. Default 12. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/user-reels?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/user-reels?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/user-reels",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/instagram/user-tagged-posts1 creditcacheablebatchableneeds proxiesexperimentalPosts a profile is tagged in
Public posts by other accounts that tagged this user — the "Tagged" tab. Note this is other people's content: authorHandle is the poster, not the tagged account. Users can hide the tab, which returns empty_result. **Required:** Pass either handle or user_id.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | no | Handle (@nike), or a full instagram.com profile URL. Optional if user_id is given. |
| user_id | string | no | Numeric user id. Skips a lookup — take it from data.items[].authorId. |
| cursor | string | no | pagination.cursor from a previous response |
| count | number | no | Posts per page, 1-50. Default 12. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/instagram/user-tagged-posts?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/instagram/user-tagged-posts?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/instagram/user-tagged-posts",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
Kick
/v1/kick/clip1 creditcacheablebatchableneeds proxiesClip
A public Kick clip: title, creator, channel, duration, view count, and media URL.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Clip URL (https://kick.com/<channel>?clip=clip_XXXX or /clips/clip_XXXX) or a clip id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/kick/clip?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/kick/clip?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/kick/clip",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
Komi
/v1/komi1 creditcacheablebatchableKomi page
Public Komi page as a creator profile: display name, bio, avatar, and every outbound link in order.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Page URL (https://komi.io/<username>) or just the username |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/komi?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/komi?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/komi",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
Kwai
/v1/kwai/post1 creditcacheablebatchablePost
A single public Kwai video with its view, like, comment and forward counts.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Video URL (https://www.kwai.com/@<handle>/video/<photo_id>) |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/kwai/post?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/kwai/post?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/kwai/post",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/kwai/profile1 creditcacheablebatchableProfile
Public Kwai profile: follower and following counts, public video count, bio, avatar, and creator category.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@carlinhos) or a kwai.com profile URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/kwai/profile?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/kwai/profile?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/kwai/profile",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/kwai/user/posts1 creditcacheablebatchableUser posts
Recent public videos from a Kwai profile, with view, like, comment and forward counts.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@carlinhos) or a kwai.com profile URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/kwai/user/posts?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/kwai/user/posts?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/kwai/user/posts",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
Linkbio
/v1/linkbio1 creditcacheablebatchableLnk.Bio page
Public Lnk.Bio page as a creator profile: display name, bio, avatar, and every outbound link in order.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Page URL (https://lnk.bio/<username>) or just the username |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/linkbio?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/linkbio?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/linkbio",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/linkedin/ad1 creditcacheablebatchableAd details
One ad from LinkedIn's public Ad Library: creative, copy, advertiser, and the paying entity. Ads covered by EU disclosure rules also carry run dates, target countries and impression bands; ads outside those rules do not, and those fields come back null rather than guessed.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Ad Library URL (linkedin.com/ad-library/detail/...) or the numeric ad id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/linkedin/ad?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/linkedin/ad?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/linkedin/ad",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/linkedin/ads/search1 creditcacheablebatchableSearch ads
Search LinkedIn's public Ad Library by advertiser or keyword. Pass company (a company page slug or numeric id) to list one advertiser's ads, keyword to search copy, or both. Returns the first page LinkedIn server-renders — about 25 ads; the total number of matches is in raw.totalMatches. **Required:** Pass company, keyword, or both — the Ad Library will not return an unfiltered archive.
| Parameter | Type | Required | Description |
|---|---|---|---|
| company | string | no | Company page slug ("microsoft") or numeric company id ("1035") |
| keyword | string | no | Words to match in the ad copy |
| countries | string | no | Comma-separated ISO-3166 country codes the ad reached, e.g. "US,GB" |
| start_date | string | no | Earliest run date, YYYY-MM-DD |
| end_date | string | no | Latest run date, YYYY-MM-DD |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/linkedin/ads/search?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/linkedin/ads/search?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/linkedin/ads/search",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/linkedin/company1 creditcacheablebatchableneeds proxiesCompany page
A LinkedIn company page: description, follower count, headquarters, employee count and logo. Also works for school and showcase pages.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Company URL (linkedin.com/company/...) or the company slug |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/linkedin/company?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/linkedin/company?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/linkedin/company",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/linkedin/company/posts1 creditcacheablebatchableneeds proxiesCompany posts
Recent posts from a company page, with reaction and comment counts. Read from the company page itself: LinkedIn's dedicated /posts/ tab is behind the sign-in wall, but the same updates render on the public page. That caps the result at roughly the last ten posts — there is no logged-out pagination, so hasMore is always false. publishedAt is an absolute timestamp for the posts LinkedIn describes in structured data and a relative age ("3w") for the rest; raw.withAbsoluteDates says how many got the former. Use linkedin.post on any id for an exact time.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Company URL (linkedin.com/company/...) or the company slug |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/linkedin/company/posts?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/linkedin/company/posts?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/linkedin/company/posts",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/linkedin/post1 creditcacheablebatchableneeds proxiesPost details
One LinkedIn post: full text, media, author, publication time, reactions and comment count. Top-level comments LinkedIn publishes on the page ride along in raw.comments.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Post URL (linkedin.com/posts/... or /feed/update/urn:li:activity:...) or the numeric id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/linkedin/post?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/linkedin/post?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/linkedin/post",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/linkedin/post/transcript1 creditcacheablebatchableneeds proxiesexperimentalPost transcript
Captions for a LinkedIn video post, as one text block plus timed cues. Only returns data where the poster attached a caption track AND LinkedIn exposes it to logged-out viewers — probed 2026-08-20, native video posts ship mp4 sources and a poster frame with no caption track, so expect this to come back empty for most posts. Empty results are never charged.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Post URL or the numeric activity id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/linkedin/post/transcript?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/linkedin/post/transcript?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/linkedin/post/transcript",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/linkedin/profile1 creditcacheablebatchableneeds proxiesPerson's profile
A LinkedIn member's public profile: name, headline, location, follower count, avatar, current employers and education. LinkedIn masks parts of a logged-out profile with asterisks; masked values are dropped rather than returned as ****.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Profile URL (linkedin.com/in/...) or the profile slug |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/linkedin/profile?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/linkedin/profile?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/linkedin/profile",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/linkedin/search/posts1 creditcacheableneeds proxiesexperimentalSearch posts
Keyword search over LinkedIn posts. LinkedIn gates content search behind sign-in for every logged-out caller — verified 2026-08-20, /search/results/content/ redirects to /uas/login regardless of origin IP — and we do not scrape authenticated sessions, so this endpoint reports the gate rather than pretending to be broken. It is shipped so callers get one clear, unbilled answer instead of a 404 on a documented route.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Search terms |
| date_posted | past-24h | past-week | past-month | no | Restrict to recent posts |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/linkedin/search/posts?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/linkedin/search/posts?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/linkedin/search/posts",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
Linkme
/v1/linkme1 creditcacheablebatchableneeds proxiesLinkMe page
Public LinkMe page as a creator profile: display name, bio, avatar, and every outbound link in order.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Page URL (https://linkme.bio/<username>) or just the username |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/linkme?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/linkme?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/linkme",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
Linktree
/v1/linktree1 creditcacheablebatchableLinktree page
Public Linktree page as a creator profile: display name, bio, avatar, and every outbound link in order.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Page URL (https://linktr.ee/<username>) or just the username |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/linktree?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/linktree?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/linktree",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
Pillar
/v1/pillar1 creditcacheablebatchableneeds proxiesPillar page
Public Pillar page as a creator profile: display name, bio, avatar, and every outbound link in order.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Page URL (https://pillar.io/<username>) or just the username |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/pillar?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/pillar?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/pillar",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/pinterest/board1 creditcacheablebatchableBoard and its pins
Board metadata plus a page of its pins. Pass the cursor from the previous response to page through the board.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Board URL, e.g. https://www.pinterest.com/pinterest/spice-up-your-dinner-plans/ |
| cursor | string | no | Bookmark from the previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/pinterest/board?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/pinterest/board?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/pinterest/board",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/pinterest/pin1 creditcacheablebatchablePin details
Public details for a pin: title, description, destination link, saves, reactions and full-resolution media. Saves map to shareCount.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Pin URL, e.g. https://www.pinterest.com/pin/1130122100248990600/ |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/pinterest/pin?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/pinterest/pin?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/pinterest/pin",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/pinterest/search1 creditcacheablebatchableSearch pins
Public Pinterest search results for a query, as unified posts.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Search terms, e.g. "minimalist kitchen" |
| cursor | string | no | Bookmark from the previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/pinterest/search?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/pinterest/search?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/pinterest/search",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/pinterest/user/boards1 creditcacheablebatchableBoards owned by a user
Public boards on a profile, most recently pinned-to first, with pin and follower counts.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Username, e.g. "pinterest" |
| cursor | string | no | Bookmark from the previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/pinterest/user/boards?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/pinterest/user/boards?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/pinterest/user/boards",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/reddit/post1 creditcacheablebatchableneeds proxiesPost details
One Reddit post with its score, comment count, body text and media. Use reddit.postComments for the comment tree — they are separate endpoints so a post with no comments is still a paid, cached result rather than an empty one.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Post URL (reddit.com/r/.../comments/...) or a post id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/reddit/post?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/reddit/post?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/reddit/post",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/reddit/post/comment/replies1 creditcacheablebatchableneeds proxiesComment replies
The reply thread under a single comment — the continuation behind Reddit's "load more comments". Takes a comment permalink, or "postId:commentId".
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Comment permalink (.../comments/{post}/{slug}/{comment}/) or "postId:commentId" |
| depth | number | no | Reply levels below the comment, 1-10. Default 6. |
| sort | confidence | top | new | controversial | old | qa | no | defaults to confidence |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/reddit/post/comment/replies?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/reddit/post/comment/replies?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/reddit/post/comment/replies",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/reddit/post/comments1 creditcacheablebatchableneeds proxiesPost comments
A post's comment tree, flattened into reading order with parentId preserved so callers can rebuild it. Reddit collapses deep threads behind continuation stubs; fetch those with reddit.commentReplies.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Post URL (reddit.com/r/.../comments/...) or a post id |
| sort | confidence | top | new | controversial | old | qa | no | Reddit's comment sorts. "confidence" is the site default ("Best").defaults to confidence |
| depth | number | no | Reply levels to walk, 1-10. Default 4. |
| limit | number | no | Top-level comments to request, 1-500. Default 100. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/reddit/post/comments?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/reddit/post/comments?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/reddit/post/comments",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/reddit/search1 creditcacheablebatchableSearch posts
Reddit post search, site-wide or restricted to one subreddit with subreddit. Falls back to the Atom feed when the JSON surface is blocked.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Search terms. Reddit's own syntax works, e.g. flair:"news". |
| subreddit | string | no | Restrict to one subreddit |
| sort | relevance | hot | top | new | comments | no | defaults to relevance |
| timeframe | hour | day | week | month | year | all | no | Window for the search. Default "all". |
| limit | number | no | Results per page, 1-100. Default 25. |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/reddit/search?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/reddit/search?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/reddit/search",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/reddit/subreddit1 creditcacheablebatchableneeds proxiesSubreddit posts
Posts from a subreddit, sorted the way Reddit sorts them. sort=top and sort=controversial accept a timeframe. Falls back to Reddit's Atom feed when the JSON surface is blocked — raw.via says which answered, and the Atom path returns no scores or comment counts.
| Parameter | Type | Required | Description |
|---|---|---|---|
| subreddit | string | yes | Subreddit name ("aww", "r/aww") or a full reddit.com/r/... URL |
| sort | hot | new | top | rising | controversial | no | defaults to hot |
| timeframe | hour | day | week | month | year | all | no | Window for sort=top / sort=controversial. Default "day". |
| limit | number | no | Posts per page, 1-100. Default 25. |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/reddit/subreddit?subreddit=%3Csubreddit%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
subreddit: '<subreddit>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/reddit/subreddit?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/reddit/subreddit",
params={
"subreddit": "<subreddit>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/reddit/subreddit/details1 creditcacheablebatchableneeds proxiesSubreddit details
Public metadata for a subreddit: subscribers, people online now, description, icons, creation date, and whether it is private or restricted.
| Parameter | Type | Required | Description |
|---|---|---|---|
| subreddit | string | yes | Subreddit name ("aww", "r/aww") or a full reddit.com/r/... URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/reddit/subreddit/details?subreddit=%3Csubreddit%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
subreddit: '<subreddit>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/reddit/subreddit/details?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/reddit/subreddit/details",
params={
"subreddit": "<subreddit>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/reddit/user1 creditcacheablebatchableneeds proxiesUser profile
A Reddit account's public profile: display name, description, avatar, account age, and karma (returned under raw.karma, since the unified schema has no karma field).
| Parameter | Type | Required | Description |
|---|---|---|---|
| username | string | yes | Username ("spez", "u/spez") or a reddit.com/user/... URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/reddit/user?username=%3Cusername%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
username: '<username>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/reddit/user?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/reddit/user",
params={
"username": "<username>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/reddit/user/posts1 creditcacheablebatchableneeds proxiesUser posts
Posts submitted by a Reddit account, newest first by default. Falls back to the account's Atom feed when the JSON surface is blocked.
| Parameter | Type | Required | Description |
|---|---|---|---|
| username | string | yes | Username ("spez", "u/spez") or a reddit.com/user/... URL |
| sort | new | hot | top | no | defaults to new |
| timeframe | hour | day | week | month | year | all | no | Window for sort=top. Default "all". |
| limit | number | no | Posts per page, 1-100. Default 25. |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/reddit/user/posts?username=%3Cusername%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
username: '<username>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/reddit/user/posts?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/reddit/user/posts",
params={
"username": "<username>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
Rumble
/v1/rumble/channel/videos1 creditcacheablebatchableneeds proxiesChannel videos
A Rumble channel's public uploads, newest first, 25 per page. Pass the cursor from the previous response to page.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Channel handle (Asmongold), c/Handle, user/Handle, or a full rumble.com URL |
| cursor | string | no | pagination.cursor from the previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/rumble/channel/videos?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/rumble/channel/videos?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/rumble/channel/videos",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/rumble/search1 creditcacheablebatchableneeds proxiesSearch videos
Public Rumble video search results, 25 per page.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Search terms |
| sort | relevance | views | date | no | defaults to relevance |
| cursor | string | no | pagination.cursor from the previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/rumble/search?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/rumble/search?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/rumble/search",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/rumble/video1 creditcacheablebatchableneeds proxiesVideo details
Public metadata for a Rumble video: exact view count, likes and dislikes, comment count, duration, upload date, channel and follower count.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Rumble watch URL (rumble.com/v7e9i52-slug.html) or a bare permalink id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/rumble/video?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/rumble/video?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/rumble/video",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/rumble/video/comments1 creditcacheablebatchableneeds proxiesVideo comments
Public comments on a Rumble video, including replies. Rumble hides comments behind a login on some videos; when it does, this returns an unbilled empty result rather than logging in.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Rumble watch URL (rumble.com/v7e9i52-slug.html) or a bare permalink id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/rumble/video/comments?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/rumble/video/comments?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/rumble/video/comments",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/rumble/video/transcript1 creditcacheablebatchableneeds proxiesVideo transcript
A Rumble video's captions as one text block plus timed cues. Returns the requested language when the video has it, otherwise the default track.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Rumble watch URL (rumble.com/v7e9i52-slug.html) or a bare permalink id |
| language | string | no | Language code, e.g. "en" |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/rumble/video/transcript?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/rumble/video/transcript?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/rumble/video/transcript",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
Snapchat
/v1/snapchat/profile1 creditcacheablebatchableUser profile
Public Snapchat profile. Creator and business accounts return subscriber count, bio, website and avatar; personal accounts return only the handle and display name, which is all Snapchat publishes for them.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (teamsnapchat) or a snapchat.com/add/<handle> URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/snapchat/profile?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/snapchat/profile?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/snapchat/profile",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/snapchat/spotlight1 creditcacheablebatchableSpotlight by link
A public Snapchat Spotlight video: view count, duration, creator, thumbnail, media URL, and the auto-generated transcript when Snapchat has one.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Spotlight URL (https://www.snapchat.com/spotlight/<id>) |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/snapchat/spotlight?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/snapchat/spotlight?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/snapchat/spotlight",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/snapchat/spotlight/comments1 creditcacheablebatchableSpotlight comments by link
Public comments on a Snapchat Spotlight, ranked the way Snapchat ranks them, with reaction and threaded-reply counts.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Spotlight URL (https://www.snapchat.com/spotlight/<id>) |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/snapchat/spotlight/comments?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/snapchat/spotlight/comments?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/snapchat/spotlight/comments",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
Soundcloud
/v1/soundcloud/artist1 creditcacheablebatchableArtist profile
Public SoundCloud profile: followers, following, track count, bio, avatar and header image.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (flume), or a full soundcloud.com profile URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/soundcloud/artist?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/soundcloud/artist?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/soundcloud/artist",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/soundcloud/artist/tracks1 creditcacheablebatchableArtist tracks
An artist's public uploads, newest first. Pass the cursor from the previous response to page.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (flume), or a full soundcloud.com profile URL |
| limit | number | no | defaults to 50 |
| cursor | string | no | pagination.cursor from the previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/soundcloud/artist/tracks?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/soundcloud/artist/tracks?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/soundcloud/artist/tracks",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/soundcloud/track1 creditcacheablebatchableTrack details
Public metadata for a SoundCloud track: plays, likes, reposts, comments, duration, genre and publisher metadata (ISRC, label, writers).
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Track URL, or "user/track-slug" |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/soundcloud/track?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/soundcloud/track?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/soundcloud/track",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
Spotify
/v1/spotify/album1 creditcacheablebatchableAlbum details
Public Spotify album: title, artist, artwork and total runtime. The full track listing is in raw — add include_raw=true.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | yes | Spotify album id, spotify:album: URI, or open.spotify.com album URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/spotify/album?id=%3Cid%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
id: '<id>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/spotify/album?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/spotify/album",
params={
"id": "<id>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/spotify/artist1 creditcacheablebatchableArtist details
Public Spotify artist: name, artwork and current top tracks (in raw). Follower counts are not in Spotify's public embed payload and are returned as null unless SPOTIFY_CLIENT_ID/SECRET are configured — see /v1/spotify/search, which reads the official API.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | yes | Spotify artist id, spotify:artist: URI, or open.spotify.com artist URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/spotify/artist?id=%3Cid%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
id: '<id>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/spotify/artist?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/spotify/artist",
params={
"id": "<id>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/spotify/podcast1 creditcacheablebatchablePodcast details
A Spotify podcast: title, publisher, description, artwork and episode count. Uses Spotify's official Web API — the public embed for a show resolves to that show's latest EPISODE, not to the show itself, so there is no keyless route to this data.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | yes | Spotify show id, spotify:show: URI, or open.spotify.com show URL |
| market | string | no | ISO 3166-1 alpha-2 market codedefaults to US |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/spotify/podcast?id=%3Cid%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
id: '<id>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/spotify/podcast?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/spotify/podcast",
params={
"id": "<id>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/spotify/podcast/episodes1 creditcacheablebatchablePodcast episodes
Episodes for a Spotify podcast, newest first. Pass the cursor from the previous response to page.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | yes | Spotify show id, spotify:show: URI, or open.spotify.com show URL |
| limit | number | no | defaults to 50 |
| cursor | string | no | pagination.cursor from the previous response |
| market | string | no | ISO 3166-1 alpha-2 market codedefaults to US |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/spotify/podcast/episodes?id=%3Cid%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
id: '<id>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/spotify/podcast/episodes?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/spotify/podcast/episodes",
params={
"id": "<id>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/spotify/search1 creditcacheablebatchableSearch
Search Spotify's catalogue for tracks, albums, artists, podcasts or episodes. Uses Spotify's official Web API, so this endpoint needs app credentials; everything else on this platform is keyless.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Search terms |
| type | track | album | artist | show | episode | no | defaults to track |
| limit | number | no | defaults to 20 |
| market | string | no | ISO 3166-1 alpha-2 market codedefaults to US |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/spotify/search?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/spotify/search?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/spotify/search",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/spotify/track1 creditcacheablebatchableTrack details
Public Spotify track: title, artists, artwork, duration, release date, explicit flag, and the preview clip URL.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | yes | Spotify track id, spotify:track: URI, or open.spotify.com track URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/spotify/track?id=%3Cid%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
id: '<id>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/spotify/track?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/spotify/track",
params={
"id": "<id>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
Threads
/v1/threads/post1 creditcacheablebatchablePost
A single public Threads post with like count, reply count, and any attached media.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Post URL (https://www.threads.com/@handle/post/ABC) or a shortcode |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/threads/post?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/threads/post?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/threads/post",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/threads/profile1 creditcacheablebatchableProfile
Public Threads profile: follower count, bio, bio links, avatar, and verification status.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@zuck) or a threads.com profile URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/threads/profile?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/threads/profile?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/threads/profile",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/threads/search1 creditcacheablebatchableneeds proxiesSearch posts by keyword
Public Threads posts matching a keyword.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Keyword to search for |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/threads/search?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/threads/search?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/threads/search",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/threads/search/users1 creditcacheablebatchableneeds proxiesSearch users
Public Threads accounts matching a keyword.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Keyword or partial handle |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/threads/search/users?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/threads/search/users?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/threads/search/users",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/threads/user/posts1 creditcacheablebatchableUser posts
Recent public posts from a Threads profile, with like and reply counts.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@zuck) or a threads.com profile URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/threads/user/posts?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/threads/user/posts?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/threads/user/posts",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
TikTok
/v1/tiktok/collection/videos1 creditcacheablebatchableneeds proxiesexperimentalCollection videos
Videos in a public TikTok collection — a creator-curated playlist of other people's posts as well as their own. Requires a configured TikTok signer. **Required:** Pass either url or collection_id.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | no | Collection URL, e.g. https://www.tiktok.com/@nasa/collection/Artemis-7123… |
| collection_id | string | no | Numeric collection id |
| count | number | no | Items per page (default 20, max 30) |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/collection/videos?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/collection/videos?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/collection/videos",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/comment-replies1 creditcacheablebatchableneeds proxiesexperimentalReplies to a comment
The reply thread under one TikTok comment. parentId on each reply points back at the comment it answers, so nested threads reconstruct cleanly. Requires a configured TikTok signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| comment_id | string | yes | id of the parent comment, from tiktok.comments |
| url | string | yes | The video the comment is on — URL, share link, or numeric id |
| count | number | no | Items per page (default 20, max 50) |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/comment-replies?comment_id=%3Ccomment_id%3E&url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
comment_id: '<comment_id>',
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/comment-replies?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/comment-replies",
params={
"comment_id": "<comment_id>",
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/comments1 creditcacheablebatchableneeds proxiesexperimentalComments on a video
Top-level comments on a TikTok, with like counts, reply counts, pinned status and a flag for the creator's own replies. Use tiktok.commentReplies to expand a thread. Requires a configured TikTok signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Video URL (preferred), share link, or numeric video id |
| count | number | no | Items per page (default 20, max 50) |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/comments?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/comments?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/comments",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/creators/popular1 creditcacheablebatchableneeds proxiesexperimentalPopular creators
Creators trending in a market, from TikTok's own Creative Center leaderboard. Filter by country, follower band and category.
| Parameter | Type | Required | Description |
|---|---|---|---|
| region | string | no | Two-letter market code (US, GB, ID…). TikTok feeds and catalogues are per-market. |
| period | 7 | 30 | 120 | no | Trailing window in days: 7, 30 or 120defaults to 7 |
| follower_band | 1k-10k | 10k-100k | 100k-1m | 1m+ | no | Restrict to creators in this follower range |
| count | number | no | Items per page (default 20, max 50) |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/creators/popular?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/creators/popular?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/creators/popular",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/followers1 creditcacheablebatchableneeds proxiesexperimentalAccounts following a creator
The public follower list for a TikTok account, newest first. TikTok caps how deep this list can be walked regardless of paging. Requires a configured TikTok signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@nike), or a full tiktok.com profile URL |
| count | number | no | Items per page (default 30, max 50) |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/followers?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/followers?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/followers",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/following1 creditcacheablebatchableneeds proxiesexperimentalAccounts a creator follows
The accounts a TikTok creator follows, newest first. Hidden entirely when the creator has set their following list to private. Requires a configured TikTok signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@nike), or a full tiktok.com profile URL |
| count | number | no | Items per page (default 30, max 50) |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/following?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/following?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/following",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/hashtag1 creditcacheablebatchableneeds proxiesexperimentalHashtag details
Stats for a TikTok hashtag: total videos and total views, plus its description and cover. Read straight off the tag page, so it needs no signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| hashtag | string | yes | Tag without the # (fyp), or a full /tag/ URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/hashtag?hashtag=%3Chashtag%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
hashtag: '<hashtag>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/hashtag?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/hashtag",
params={
"hashtag": "<hashtag>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/hashtag-videos1 creditcacheablebatchableneeds proxiesexperimentalVideos using a hashtag
TikToks carrying a given hashtag, in TikTok's own feed order. Resolves the tag to its numeric id from the tag page, then pages the feed — which needs a configured TikTok signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| hashtag | string | yes | Tag without the # (fyp), or a full /tag/ URL |
| count | number | no | Items per page (default 30, max 30) |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/hashtag-videos?hashtag=%3Chashtag%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
hashtag: '<hashtag>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/hashtag-videos?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/hashtag-videos",
params={
"hashtag": "<hashtag>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/live1 creditcacheablebatchableneeds proxiesexperimentalLive stream info
Details of a creator's stream while they are live: room id, title, cover, current viewers and start time. A creator who is not live returns empty_result, which is a real answer and costs nothing — that makes this usable as a cheap "are they live?" poll.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@nike), or a full tiktok.com profile URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/live?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/live?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/live",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/playlist-videos1 creditcacheablebatchableneeds proxiesexperimentalVideos in a playlist
The videos inside one TikTok playlist, in the creator's chosen order. Requires a configured TikTok signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| playlist_id | string | yes | id from tiktok.playlists, or a /playlist/ URL |
| count | number | no | Items per page (default 30, max 30) |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/playlist-videos?playlist_id=%3Cplaylist_id%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
playlist_id: '<playlist_id>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/playlist-videos?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/playlist-videos",
params={
"playlist_id": "<playlist_id>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/playlists1 creditcacheablebatchableneeds proxiesexperimentalA creator's playlists
The playlists (TikTok calls them "mixes") a creator has organised their videos into. Pair with tiktok.playlistVideos to walk one. Requires a configured TikTok signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@nike), or a full tiktok.com profile URL |
| count | number | no | Items per page (default 20, max 30) |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/playlists?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/playlists?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/playlists",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/product1 creditcacheablebatchableneeds proxiesexperimentalProduct details
A single TikTok Shop product: title, price, images, rating, review and sales counts, and the seller. Read from the server-rendered product page, so it needs no signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Product id, or a tiktok.com/view/product/… URL |
| region | string | no | Two-letter market code (US, GB, ID…). TikTok feeds and catalogues are per-market. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/product?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/product?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/product",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/profile1 creditcacheablebatchableneeds proxiesexperimentalProfile details
Public profile for a TikTok account: followers, following, video count, bio, bio link, verification and account region. Private accounts return their public shell with isPrivate: true rather than an error — that is a real answer, not a failure. Total likes received (TikTok's "hearts") is in raw, since it is a like total rather than the lifetime view count viewCount means elsewhere in the schema.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@nike), or a full tiktok.com profile URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/profile?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/profile?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/profile",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/profile/region1 creditcacheablebatchableneeds proxiesexperimentalCreator region
The market TikTok assigns a creator's account. Read from TikTok's own region field — on the profile where TikTok publishes one, otherwise from the region stamped on the creator's recent posts. Never inferred from language, timezone or content. **Required:** Pass either handle or url.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | no | Creator handle, e.g. @nasa |
| url | string | no | Profile URL, e.g. https://www.tiktok.com/@nasa |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/profile/region?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/profile/region?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/profile/region",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/search/keyword1 creditcacheablebatchableneeds proxiesexperimentalSearch videos by keyword
TikToks matching a search term, with the same normalised engagement fields as every other post endpoint. sort_by and date_posted map onto TikTok's own search filters. Requires a configured TikTok signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Search term |
| sort_by | relevance | most_liked | no | TikTok's own two search orderingsdefaults to relevance |
| date_posted | all | yesterday | week | month | three_months | six_months | no | Restrict to videos posted within this windowdefaults to all |
| count | number | no | Items per page (default 12, max 30) |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/search/keyword?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/search/keyword?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/search/keyword",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/search/suggestions1 creditcacheablebatchableneeds proxiesexperimentalSearch suggestions
TikTok's typeahead completions for a partial query — what the platform thinks people are looking for. Useful for keyword research.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Partial search term |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/search/suggestions?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/search/suggestions?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/search/suggestions",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/search/top1 creditcacheablebatchableneeds proxiesexperimentalTop (blended) search
TikTok's blended "Top" search tab: the highest-ranked videos AND accounts for a query, returned as two typed lists. Requires a configured TikTok signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Search terms |
| count | number | no | Items per page (default 12, max 30) |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/search/top?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/search/top?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/search/top",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/search/users1 creditcacheablebatchableneeds proxiesexperimentalSearch creators
TikTok accounts matching a query, with follower counts and verification. Requires a configured TikTok signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Search term |
| count | number | no | Items per page (default 12, max 30) |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/search/users?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/search/users?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/search/users",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/shop/product/reviews1 creditcacheablebatchableneeds proxiesexperimentalProduct reviews
Public reviews on a TikTok Shop product, with star rating, reviewer, photos and the purchased variant. Requires a configured TikTok signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Product id, or a tiktok.com/view/product/… URL |
| count | number | no | Items per page (default 20, max 50) |
| cursor | string | no | pagination.cursor from a previous response |
| region | string | no | Two-letter market code (US, GB, ID…). TikTok feeds and catalogues are per-market. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/shop/product/reviews?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/shop/product/reviews?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/shop/product/reviews",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/shop/products1 creditcacheablebatchableneeds proxiesexperimentalSeller's product catalogue
Products listed by a TikTok Shop seller. Pass the seller's handle or a shop URL. Requires a configured TikTok signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Seller handle (@shopname) or a TikTok shop URL |
| count | number | no | Items per page (default 20, max 50) |
| cursor | string | no | pagination.cursor from a previous response |
| region | string | no | Two-letter market code (US, GB, ID…). TikTok feeds and catalogues are per-market. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/shop/products?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/shop/products?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/shop/products",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/shop/search1 creditcacheablebatchableneeds proxiesexperimentalSearch TikTok Shop
Product search across TikTok Shop. Requires a configured TikTok signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Search terms |
| count | number | no | Items per page (default 20, max 50) |
| cursor | string | no | pagination.cursor from a previous response |
| region | string | no | Two-letter market code (US, GB, ID…). TikTok feeds and catalogues are per-market. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/shop/search?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/shop/search?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/shop/search",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/song1 creditcacheablebatchableneeds proxiesexperimentalSound / song details
Details for a TikTok sound: title, artist, album, cover, clip length, and how many videos use it. Read from the music page, so it needs no signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| song | string | yes | Music id, or a full tiktok.com/music/… URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/song?song=%3Csong%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
song: '<song>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/song?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/song",
params={
"song": "<song>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/song-videos1 creditcacheablebatchableneeds proxiesexperimentalVideos using a sound
TikToks built on a given sound — the endpoint behind "who is using my track". Requires a configured TikTok signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| song | string | yes | Music id, or a full tiktok.com/music/… URL |
| count | number | no | Items per page (default 30, max 30) |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/song-videos?song=%3Csong%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
song: '<song>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/song-videos?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/song-videos",
params={
"song": "<song>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/songs/popular1 creditcacheablebatchableneeds proxiesexperimentalPopular songs
Sounds trending in a market — the endpoint behind music A&R and sync-licensing research. From TikTok's Creative Center.
| Parameter | Type | Required | Description |
|---|---|---|---|
| region | string | no | Two-letter market code (US, GB, ID…). TikTok feeds and catalogues are per-market. |
| period | 7 | 30 | 120 | no | Trailing window in days: 7, 30 or 120defaults to 7 |
| count | number | no | Items per page (default 20, max 50) |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/songs/popular?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/songs/popular?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/songs/popular",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/transcript1 creditcacheablebatchableneeds proxiesexperimentalVideo transcript
The spoken transcript of a TikTok, as one text block plus timed cues. Returns the ORIGINAL spoken-language track by default rather than whichever track TikTok lists first, so the text reflects what was actually said. Pass language for a specific track — a miss is an error listing what is available, never a silent substitution into another language.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Video URL (preferred), share link, or numeric video id |
| language | string | no | BCP-47 or ISO-639 code, e.g. "en", "es", "pt-BR". Omit for the original spoken track. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/transcript?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/transcript?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/transcript",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/trending1 creditcacheablebatchableneeds proxiesexperimentalTrending feed
TikTok's logged-out For You feed for a region — what the platform is pushing to a brand-new visitor right now. Not a ranking anyone can reproduce: TikTok personalises even the anonymous feed, so two calls a second apart return different videos. Requires a configured TikTok signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| region | string | no | Two-letter country code, e.g. US, GB, DEdefaults to US |
| count | number | no | Items per page (default 30, max 30) |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/trending?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/trending?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/trending",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/user-videos1 creditcacheablebatchableneeds proxiesexperimentalVideos posted by a creator
A creator's public posts, newest first, with view/like/comment/share counts. Photo posts are included and typed as image or carousel. Paging past the first response requires a configured TikTok signer; without one the first page still returns from the profile page itself, and raw.via says which path answered.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@nike), or a full tiktok.com profile URL |
| count | number | no | Items per page (default 35, max 35) |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/user-videos?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/user-videos?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/user-videos",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/user/showcase1 creditcacheablebatchableneeds proxiesexperimentalCreator's product showcase
Products a creator has pinned to their profile showcase — what they are actually promoting, as opposed to what they sell. Requires a configured TikTok signer.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Creator handle, e.g. @charlidamelio |
| count | number | no | Items per page (default 20, max 50) |
| cursor | string | no | pagination.cursor from a previous response |
| region | string | no | Two-letter market code (US, GB, ID…). TikTok feeds and catalogues are per-market. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/user/showcase?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/user/showcase?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/user/showcase",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/video1 creditcacheablebatchableneeds proxiesexperimentalVideo or photo-post details
Full public metadata for one TikTok: caption, hashtags, mentions, author, sound, duration, and view/like/comment/share counts. Photo posts return every image in mediaUrls. Accepts a full URL, a share link (vm.tiktok.com), or a numeric video id.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Video URL (preferred), share link, or numeric video id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/video?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/video?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/video",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/tiktok/videos/popular1 creditcacheablebatchableneeds proxiesexperimentalPopular videos
Videos trending in a market over a trailing window, from TikTok's Creative Center. Distinct from /v1/tiktok/trending, which is the personalised For You feed.
| Parameter | Type | Required | Description |
|---|---|---|---|
| region | string | no | Two-letter market code (US, GB, ID…). TikTok feeds and catalogues are per-market. |
| period | 7 | 30 | 120 | no | Trailing window in days: 7, 30 or 120defaults to 7 |
| count | number | no | Items per page (default 20, max 50) |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/tiktok/videos/popular?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/videos/popular?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/videos/popular",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
Twitch
/v1/twitch/clip1 creditcacheablebatchableClip details
Public metadata for a Twitch clip: views, duration, creator, broadcaster, category, and the offset into the source VOD.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Clip URL (twitch.tv/<channel>/clip/<slug> or clips.twitch.tv/<slug>) or a bare slug |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/twitch/clip?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/twitch/clip?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/twitch/clip",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/twitch/profile1 creditcacheablebatchableChannel profile
Public Twitch channel: followers, partner/affiliate status, bio, avatar, banner, account age, and whether the channel is live right now.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Channel login (shroud), or a twitch.tv URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/twitch/profile?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/twitch/profile?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/twitch/profile",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/twitch/user/schedule1 creditcacheablebatchableStream schedule
A channel's published schedule for the current week, plus the next upcoming segment. Segments are returned as posts of type live whose publishedAt is the scheduled start time.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Channel login (hasanabi), or a twitch.tv URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/twitch/user/schedule?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/twitch/user/schedule?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/twitch/user/schedule",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/twitch/user/videos1 creditcacheablebatchableChannel videos
A channel's public VODs, highlights or uploads. Returns up to 100 per call — Twitch gates deeper pages behind a browser integrity challenge, and we do not run browser sessions.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Channel login (shroud), or a twitch.tv URL |
| filter_by | archive | highlight | upload | no | archive = past broadcasts, highlight = clipped highlights, upload = uploaded videosdefaults to archive |
| sort_by | time | views | no | defaults to time |
| limit | number | no | defaults to 30 |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/twitch/user/videos?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/twitch/user/videos?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/twitch/user/videos",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
X / Twitter
/v1/twitter/community1 creditcacheablebatchableneeds proxiesCommunity details
Public details for an X Community: name, description, member count, topic, join policy, banner and the creator's handle. Read from the server-rendered community page, which X still serves to logged-out callers.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Community URL (x.com/i/communities/...) or the numeric id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/twitter/community?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/twitter/community?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/twitter/community",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/twitter/community/tweets1 creditcacheablebatchableneeds proxiesCommunity posts
Recent posts in an X Community, with likes, retweets, replies and **view counts** — the community page publishes metrics X's embed CDN does not. One page only: X serves logged-out callers a single rendered batch and no continuation token, so hasMore is always false.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Community URL (x.com/i/communities/...) or the numeric id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/twitter/community/tweets?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/twitter/community/tweets?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/twitter/community/tweets",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/twitter/profile1 creditcacheablebatchableneeds proxiesProfile details
Public profile for an X account. With TWITTER_BEARER_TOKEN set this is the full profile — bio, location, follower/following/post counts, join date. Without one, X exposes only handle, id, display name, avatar and verified status to logged-out callers, and the call is refunded to 0 credits because that is not worth charging for.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@jack), or a full x.com profile URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/twitter/profile?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/twitter/profile?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/twitter/profile",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/twitter/tweet1 creditcacheablebatchablePost details
One public post with its text, media and engagement. Served from X's embed CDN, which is the most durable logged-out surface X still operates; with TWITTER_BEARER_TOKEN set it uses the official API instead and adds retweet, quote and impression counts.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Post URL (x.com/user/status/123...) or a bare post id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/twitter/tweet?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/twitter/tweet?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/twitter/tweet",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/twitter/tweet/transcript1 creditcacheablebatchableexperimentalPost transcript
Captions for a video post on X, as one text block plus timed cues. Sourced from the caption track in the video's HLS playlist, which is the only transcript X exposes to logged-out callers — posts whose author never attached captions return an empty result and are not charged.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Post URL (x.com/user/status/123...) or a bare post id |
| language | string | no | BCP-47 code, e.g. "en". Defaults to the first track. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/twitter/tweet/transcript?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/twitter/tweet/transcript?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/twitter/tweet/transcript",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/twitter/user-tweets1 creditcacheablebatchableneeds proxiesRecent posts from an account
An account's recent public posts. With TWITTER_BEARER_TOKEN this pages through the timeline with real engagement metrics; without one it returns the single page X's embedded timeline exposes (roughly 20 posts, likes and replies only).
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@jack), or a full x.com profile URL |
| count | number | no | Posts per page, 5-100. Default 20. Official API only. |
| cursor | string | no | pagination.cursor from a previous response. Official API only. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/twitter/user-tweets?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/twitter/user-tweets?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/twitter/user-tweets",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
YouTube
/v1/youtube/channel1 creditcacheablebatchableChannel details
Public details for a YouTube channel: subscribers, video count, description, links.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@mrbeast), channel id (UC...), or full URL |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/youtube/channel?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/youtube/channel?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/youtube/channel",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/youtube/channel-videos1 creditcacheablebatchableChannel videos
Recent public uploads for a channel. Use tab to switch between videos and shorts.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@mrbeast), channel id, or full URL |
| tab | videos | shorts | streams | no | defaults to videos |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/youtube/channel-videos?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/youtube/channel-videos?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/youtube/channel-videos",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/youtube/channel/community-posts1 creditcacheablebatchableChannel community posts
A channel's Posts tab (what YouTube used to call Community). Images, multi-image carousels, shared videos and polls all come back as posts; poll options are under raw.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@mrbeast), channel id (UC…), or full URL |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/youtube/channel/community-posts?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/youtube/channel/community-posts?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/youtube/channel/community-posts",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/youtube/channel/lives1 creditcacheablebatchableChannel live streams
A channel's Live tab: streams that are live now, scheduled, or finished and still on the tab. viewCount is concurrent viewers while a stream is live and total views once it ends — YouTube swaps the label, and we surface whichever it gave us.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@mrbeast), channel id (UC…), or full URL |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/youtube/channel/lives?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/youtube/channel/lives?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/youtube/channel/lives",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/youtube/channel/playlists1 creditcacheablebatchableChannel playlists
Playlists a channel has made public. Pass an id from here to /v1/youtube/playlist for the videos in it.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@mrbeast), channel id (UC…), or full URL |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/youtube/channel/playlists?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/youtube/channel/playlists?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/youtube/channel/playlists",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/youtube/channel/shorts1 creditcacheablebatchableChannel shorts
A channel's Shorts grid, newest first, about 48 per page. Shorts carry no duration or publish date on this surface — YouTube does not render either — so both are null rather than guessed.
| Parameter | Type | Required | Description |
|---|---|---|---|
| handle | string | yes | Handle (@mrbeast), channel id (UC…), or full URL |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/youtube/channel/shorts?handle=%40mkbhd&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
handle: '@mkbhd',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/youtube/channel/shorts?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/youtube/channel/shorts",
params={
"handle": "@mkbhd",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/youtube/community-post1 creditcacheablebatchableCommunity post details
One community post by id or permalink, with its full text, attachments and like count. Poll questions and options are under raw. commentCount is null on this surface: the standalone post page does not render one, while /v1/youtube/channel/community-posts does.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Post URL (youtube.com/post/Ugk…) or bare post id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/youtube/community-post?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/youtube/community-post?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/youtube/community-post",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/youtube/playlist1 creditcacheablebatchablePlaylist contents
The videos in a public playlist, in playlist order, 100 per page. Playlist metadata (title, description, owner) comes back alongside the items.
| Parameter | Type | Required | Description |
|---|---|---|---|
| playlist_id | string | yes | Playlist id (PL…), or any URL containing list= |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/youtube/playlist?playlist_id=%3Cplaylist_id%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
playlist_id: '<playlist_id>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/youtube/playlist?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/youtube/playlist",
params={
"playlist_id": "<playlist_id>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/youtube/search1 creditcacheablebatchableSearch videos
Public YouTube search results for a query.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | — |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/youtube/search?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/youtube/search?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/youtube/search",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/youtube/search/hashtag1 creditcacheablebatchableSearch by hashtag
Videos or Shorts carrying a hashtag, as YouTube ranks them on the hashtag landing page. type=shorts switches to the Shorts tab, which is a different result set rather than a filter over the same one.
| Parameter | Type | Required | Description |
|---|---|---|---|
| hashtag | string | yes | Hashtag, with or without the leading # |
| type | all | shorts | no | defaults to all |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/youtube/search/hashtag?hashtag=%3Chashtag%3E&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
hashtag: '<hashtag>',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/youtube/search/hashtag?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/youtube/search/hashtag",
params={
"hashtag": "<hashtag>",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/youtube/search/typeahead1 creditcacheablebatchableSearch typeahead
YouTube's own search suggestions for a partial query — the autocomplete list the search box shows. Useful as a keyword-research signal: these are ranked by what people actually search for.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | yes | Partial search query |
| region | string | no | ISO 3166-1 alpha-2 country codedefaults to US |
| language | string | no | Interface languagedefaults to en |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/youtube/search/typeahead?query=ai%20agents&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
query: 'ai agents',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/youtube/search/typeahead?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/youtube/search/typeahead",
params={
"query": "ai agents",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/youtube/shorts/trending1 creditcacheablebatchableTrending shorts
Shorts YouTube is currently surfacing, by region. Note that YouTube retired the global Trending feed — /feed/trending now serves the ordinary home feed — so this reads the ranked Shorts surface instead, which is what still exists. Results differ per request; it is deliberately not subscribable.
| Parameter | Type | Required | Description |
|---|---|---|---|
| region | string | no | ISO 3166-1 alpha-2 country codedefaults to US |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/youtube/shorts/trending?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/youtube/shorts/trending?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/youtube/shorts/trending",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/youtube/transcript1 creditcacheablebatchableVideo transcript
Full transcript for a YouTube video, as one text block plus timed cues. Returns the requested language when available, otherwise the default track.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Video URL or 11-character video id |
| language | string | no | BCP-47 language code, e.g. "en", "es" |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/youtube/transcript?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/youtube/transcript?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/youtube/transcript",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/youtube/video1 creditcacheablebatchableVideo or Short details
Public metadata for a YouTube video or Short, including view/like counts.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Video URL or 11-character video id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/youtube/video?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/youtube/video?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/youtube/video",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/youtube/video/comment-replies1 creditcacheablebatchableComment replies
Replies to one comment thread. Takes a cursor from the replyCursors list on /v1/youtube/video/comments, or — as a convenience — a video url plus comment_id, in which case we locate the thread on the first comment page for you. **Required:** Pass either cursor (from replyCursors on /v1/youtube/video/comments), or both url and comment_id.
| Parameter | Type | Required | Description |
|---|---|---|---|
| cursor | string | no | Reply cursor from /v1/youtube/video/comments, or pagination.cursor to page deeper |
| url | string | no | Video URL or id — required only when using comment_id |
| comment_id | string | no | Top-level comment id (Ugx…) to fetch replies for |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/youtube/video/comment-replies?cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/youtube/video/comment-replies?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/youtube/video/comment-replies",
params={
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/youtube/video/comments1 creditcacheablebatchableVideo comments
Top-level comments on a video, about 20 per page. Pass pagination.cursor back as cursor for the next page. Each item that has replies also appears in replyCursors; feed that cursor to /v1/youtube/video/comment-replies. Use order=newest when polling for new comments — top is re-ranked by YouTube and will churn.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Video URL or 11-character video id |
| order | top | newest | no | defaults to top |
| cursor | string | no | pagination.cursor from a previous response |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/youtube/video/comments?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/youtube/video/comments?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/youtube/video/comments",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |
/v1/youtube/video/sponsors1 creditcacheablebatchableexperimentalVideo sponsors (inferred)
Brands, promo codes and affiliate links inferred from a video's description, plus YouTube's own paid-promotion disclosure. Every signal carries the description line it was read from and a confidence, because this is inference over prose — YouTube publishes no structured sponsor data. Experimental: expect to check evidence before acting on low confidence.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Video URL or 11-character video id |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl "$API/v1/youtube/video/sponsors?url=8XkPqR2nLvE&cache_max_age=7d" \
-H "x-api-key: $KEY"const query = new URLSearchParams({
url: '8XkPqR2nLvE',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/youtube/video/sponsors?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/youtube/video/sponsors",
params={
"url": "8XkPqR2nLvE",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Response codes
| 200 | Success |
| 400 | invalid_request — not charged |
| 401 | missing_api_key / invalid_api_key / revoked_api_key — never a billing error |
| 402 | insufficient_credits — the key is valid, the balance is not |
| 429 | daily_cap_exceeded or upstream_rate_limited — not charged |
| 501 | not_configured — server is missing credentials or proxies |
| 502 | upstream_blocked / upstream_schema_drift — not charged |
| 504 | upstream_timeout — not charged |