Pagination
One rule for every list endpoint. Send the next_cursor value back as cursor and stop when has_more is false. Identical on every paginated endpoint, every platform.
Every list endpoint on every platform paginates the same way. Learn it once and it works on all 216 paginatable endpoints: TikTok, Instagram, YouTube, Reddit, LinkedIn, Naver, all of them.
The one rule
Read pagination.next_cursor from the response, send it back as the cursor query parameter, and stop when pagination.has_more is false.
That is the entire contract. You never construct a cursor, decode a token, or look up a platform's native pagination param. The API hands you an opaque token and takes it straight back.
The response block
Every list response carries a top-level pagination block:
{
"success": true,
"platform": "tiktok",
"endpoint": "/v1/tiktok/profile/videos",
"data": {
"items": [ /* … this page of results … */ ],
"total": 1247
},
"credits_used": 1,
"credits_remaining": 98,
"request_id": "req-abc123",
"cached": false,
"pagination": {
"next_cursor": "sc.eyJ2IjoyLCJjIjoiNzM4…",
"has_more": true,
"page_size": 30
}
}| Field | Meaning |
|---|---|
pagination.next_cursor | Opaque token for the next page. Send it back as cursor. null at the end of the list. |
pagination.has_more | true while more pages exist, false on the last page. This is your stop signal. |
pagination.page_size | How many items came back in data.items on this page. |
The token is a single sc. string that works identically for cursor-, page-, and offset-style upstreams, so your loop is byte-for-byte the same everywhere. (data.total, when present, is the upstream's own result count, useful for a progress bar, but never use it to decide when to stop; has_more is the only always-correct signal.)
A worked round-trip
Request page 1 (no cursor):
curl "https://www.socialcrawl.dev/v1/tiktok/profile/videos?handle=mrbeast" \
-H "x-api-key: YOUR_API_KEY"The response comes back with "pagination": { "next_cursor": "sc.eyJ2Ijoy…", "has_more": true, "page_size": 30 }.
Request page 2 (pass that next_cursor back as cursor):
curl "https://www.socialcrawl.dev/v1/tiktok/profile/videos?handle=mrbeast&cursor=sc.eyJ2Ijoy…" \
-H "x-api-key: YOUR_API_KEY"Keep going until a response returns "has_more": false (and "next_cursor": null). Swap tiktok/profile/videos for any list endpoint in the table below and this is unchanged.
The loop
Identical for every list endpoint on every platform:
async function* paginate(path: string, params: Record<string, string>) {
let cursor: string | null = null;
do {
const url = new URL(`https://www.socialcrawl.dev/v1/${path}`);
for (const [k, v] of Object.entries(params)) url.searchParams.set(k, v);
if (cursor) url.searchParams.set("cursor", cursor); // <-- always "cursor"
const res = await fetch(url, {
headers: { "x-api-key": process.env.SOCIALCRAWL_KEY! },
});
const json = await res.json();
for (const item of json.data.items) yield item;
cursor = json.pagination.next_cursor; // <-- send back verbatim next round
} while (cursor); // <-- pagination.has_more === false ends the loop
}
// Usage: same call shape for TikTok, Instagram, YouTube, Reddit, …
for await (const video of paginate("tiktok/profile/videos", { handle: "mrbeast" })) {
// … handle each item
}Two things to get right:
- Send
next_cursorback as the EXACT string you received, under the keycursor. Don't decode, trim, or re-encode it; it's an opaque token. - Stop when
has_moreisfalse(equivalently, whennext_cursorisnull). Don't infer the end from an empty page or fromtotal.
Recipe: drain a full account safely
The real-world loop is "pull every post/comment/follower an account has" without burning credits or tripping limits. Walk pages until has_more is false, and keep three things in mind:
// Drain every video for a handle, then stop.
async function drain(path: string, params: Record<string, string>) {
const all: unknown[] = [];
let cursor: string | null = null;
let pages = 0;
do {
const url = new URL(`https://www.socialcrawl.dev/v1/${path}`);
for (const [k, v] of Object.entries(params)) url.searchParams.set(k, v);
if (cursor) url.searchParams.set("cursor", cursor);
const res = await fetch(url, {
headers: { "x-api-key": process.env.SOCIALCRAWL_KEY! },
});
// Respect backpressure: on 429 (CONCURRENCY_LIMIT) or 503 back off and retry
// the SAME cursor; never advance past a page you didn't successfully read.
if (res.status === 429 || res.status === 503) {
const wait = Number(res.headers.get("retry-after") ?? "2") * 1000;
await new Promise((r) => setTimeout(r, wait));
continue;
}
const json = await res.json();
all.push(...json.data.items);
cursor = json.pagination.next_cursor;
pages += 1;
} while (cursor);
return { items: all, pages };
}- Concurrency. You can drain many accounts in parallel, but a single API key allows at most 50 concurrent requests. Exceed it and you get a
429 CONCURRENCY_LIMIT(0 credits charged). Cap your worker pool well under 50; within one account, pages are inherently sequential (each needs the previousnext_cursor). - Credit budget. Each page is a normal billed request: one page of a 1-credit endpoint costs 1 credit, so draining a 50-page feed costs about 50 credits. Multiply pages by the endpoint's per-call cost (see Endpoint pricing) before you loop, and cap
pagesif you only need the most recent N results. Cache hits on re-runs cost 0 credits. - Bounded depth. Page- and offset-style endpoints (Naver, LinkedIn, the app stores) have a finite maximum depth;
has_moreflips tofalsewhen you reach it. Cursor-style feeds end when the upstream runs out of items.
Incremental sync
A poller that checks a creator every day only needs the posts published since its last run. Eight creator post lists take two parameters that end the walk where your last poll stopped, so you pay for the pages with new posts and no more:
| Platform | Endpoint |
|---|---|
GET /v1/facebook/profile/posts | |
GET /v1/instagram/profile/posts, GET /v1/instagram/profile/reels | |
| Threads | GET /v1/threads/user/posts |
| TikTok | GET /v1/tiktok/profile/videos |
| Twitter/X | GET /v1/twitter/user/tweets |
| YouTube | GET /v1/youtube/channel/shorts, GET /v1/youtube/channel/videos |
| Parameter | Send | What happens |
|---|---|---|
stop_at_id | The post.id or post.url of the newest post you already hold | The page stops just before that post. That post and every post after it are left off, next_cursor is not returned, and pagination.stopped_at is known_id. If the post is not on this page, the page comes back in full with its cursor, so keep walking. |
since | A date (YYYY-MM-DD, read as midnight UTC) or an ISO 8601 timestamp | Posts published before it are left off, and the page that reaches one ends the walk with pagination.stopped_at set to since. A post with no date is kept. |
curl "https://www.socialcrawl.dev/v1/instagram/profile/posts?handle=nasa&stop_at_id=3990495229280545049" \
-H "x-api-key: YOUR_API_KEY"When you send either parameter, the pagination block carries one more field:
"pagination": {
"next_cursor": null,
"has_more": false,
"page_size": 5,
"stopped_at": "known_id"
}stopped_at | Meaning |
|---|---|
known_id | The walk reached the post you named in stop_at_id. |
since | The walk reached a post published before since. |
end | The list ran out before either boundary. |
null | This page did not reach a boundary. Send next_cursor back as cursor and keep walking. |
stopped_at is absent when you sent neither parameter, and a call without them is unchanged. The one rule still holds: stop when has_more is false.
A daily poll
Send the same stop_at_id (or since) on every page of the walk, then keep the newest post you received for the next run:
// Fetch only the posts published since the last poll.
async function pollNewPosts(
path: string,
params: Record<string, string>,
newestHeldId: string | null,
) {
const fresh: any[] = [];
let cursor: string | null = null;
do {
const url = new URL(`https://www.socialcrawl.dev/v1/${path}`);
for (const [k, v] of Object.entries(params)) url.searchParams.set(k, v);
// First run: bound the walk by date. Every later run: by the newest post held.
if (newestHeldId) url.searchParams.set("stop_at_id", newestHeldId);
else url.searchParams.set("since", "2026-09-01");
if (cursor) url.searchParams.set("cursor", cursor);
const res = await fetch(url, {
headers: { "x-api-key": process.env.SOCIALCRAWL_KEY! },
});
const json = await res.json();
fresh.push(...json.data.items);
cursor = json.pagination.next_cursor; // null once the walk has stopped
} while (cursor);
// Pinned posts sit out of date order, so never keep one as the newest.
const newest = fresh.find((row) => row.post.flags?.pinned !== true);
return { fresh, newestHeldId: newest?.post.id ?? newestHeldId };
}
// savedId is the newestHeldId you stored after the previous run, or null.
const result = await pollNewPosts("tiktok/profile/videos", { handle: "mrbeast" }, savedId);Three details decide whether a poll is correct and cheap:
- Pinned posts never end the walk. A profile opens with the posts its owner pinned, and those can be years old. A pinned post never counts as the boundary. If it is older than
since, or it is the post you named instop_at_id, it is left off the page and the walk goes on. - The price does not change. Each page costs what a page of that endpoint costs, 1 credit on all eight. A daily poll that finds your newest post on page 1 pays for page 1 and stops there. A
sincethat is not a date, or astop_at_idlonger than 512 characters, is a400 INVALID_REQUESTand costs nothing. - YouTube needs newest first. A stop only means something on a list in date order, so either parameter sets
sort=latestonchannel/videosandsort=newestonchannel/shortswhen you leavesortout, andsort=popularwith either is a400. YouTube list dates are estimated from labels such as "4 months ago", so usestop_at_idthere for an exact stop.
Date window on every list
Every list whose rows carry a date takes since and until: posts, comments, replies, reviews and news articles, on every platform. The window is applied to each page before it is returned, so every dated row you receive is inside it.
| Parameter | Send | What happens |
|---|---|---|
since | A date (YYYY-MM-DD, read as midnight UTC) or an ISO 8601 timestamp | Rows published before it are left off the page. |
until | A date (YYYY-MM-DD, the whole UTC day is included) or an ISO 8601 timestamp | Rows published after it are left off the page. |
curl "https://www.socialcrawl.dev/v1/youtube/video/comments?url=https://www.youtube.com/watch?v=dQw4w9WgXcQ&since=2025-10-07" \
-H "x-api-key: YOUR_API_KEY"How far a walk goes depends on whether the list is in date order:
- Lists in date order stop at
since. On these listssincesets the newest-first sort when you leave it out, and the page that reaches an older row ends the walk withpagination.stopped_atset tosince, exactly like Incremental sync. Another sort value withsinceis a400. They are the creator feeds above andapp_store/app-reviews(sort_by=most_recent),google_play/app-reviews(sort_by=newest),instagram/post/comments(sort=recent),linkedin/company/posts(sort_by=recent),linkedin/post/comments(sort_order=recent),naver/news/search(sort=date),reddit/profile/posts(sort=new),reddit/search(sort=new),reddit/search/comments(sort=new),reddit/subreddit(sort=new),tiktok/post/comments(sort=recent),tripadvisor/reviews(sort_by=most_recent),trustpilot/reviews(sort=recency),twitter/search/tweets(sort=latest),youtube/video/comments(order=newest). - Every other list filters each page and keeps its cursor. Comments in relevance order, keyword search and most reviews are not in date order, so an old row on page 1 says nothing about page 2. Keep following
next_cursor; a page can come back with no rows and a cursor when every row on it was outside the window. - The price does not change. Each page costs what a page of that endpoint costs, whether or not rows were left off. A row with no date is kept. A
sinceoruntilthat is not a date, or asincelater thanuntil, is a400 INVALID_REQUESTand costs nothing. - Other spellings are read as the window.
published_after,start_date,from_dateanddate_fromare applied assince, andpublished_before,end_date,to_dateanddate_toasuntil, on any list that does not take them under its own name. A named window (publish_timeordate_postedset toyesterday,this-week,this-month,last-3-monthsorlast-6-months) and a day count (max_age_days=730) become asincethat far back. A list that has its own date filter keeps it:youtube/search/advancedstill takespublished_after, and Threads search still takesstart_date. - A list whose rows carry no date refuses a date. Profile lists, product lists and suggestions return
400 INVALID_REQUESTwitherror.details.reasonset tounsupported_date_filter, before any credit is charged, so a date key is never silently ignored.
Sending the wrong param is a 400, not a silent bug
You never need a platform's native pagination param name: always send cursor. If you do send a foreign cursor param (say you copy max_id off an Instagram response onto a TikTok endpoint), you get a 400 INVALID_REQUEST with a did_you_mean: "cursor" hint and zero credits charged, instead of silently receiving page 1 again.
Stale or malformed cursors
If you pass a cursor the upstream rejects (expired, hand-edited, copied across endpoints), you'll get a 502 UPSTREAM_ERROR or 400 INVALID_REQUEST envelope. Credits are refunded on upstream errors (see Credits → When are credits refunded?). Start over with no cursor.
Three kinds of limit
limit means one of three different things depending on the endpoint, and the difference changes both how many requests you make and what you pay. The limit behaviour column in the tables below tells you which one you have.
Page size: caps a single upstream page. You still paginate yourself: one request returns one page, and you send cursor back for the next. The API maps limit to the upstream's native name (Naver display, GitHub per_page, and so on), capped at that endpoint's maximum. This is the common case.
Collect-until-N: the endpoint paginates for you. It walks upstream pages server-side until it has limit unique items (or the source runs dry), de-duplicates as it goes, and returns them in a single response. You are billed per page or window actually consumed, and the unused budget is refunded. This is how you get more than one window's worth of results in one call.
These endpoints collect until N:
| Endpoint | Max limit | What one call costs |
|---|---|---|
GET /v1/facebook/profile/reels/full | 50 | limit (1-50) walks upstream pages server-side until that many reels are collected, billing per page of 10 consumed (5 credits each, 5-25 total). It is not a page size. |
GET /v1/instagram/profile/posts/full | 50 | limit (1-50) walks upstream pages server-side until that many items are collected, billing per page of ~12 consumed (5 credits each, 5-25 total). It is not a page size. |
GET /v1/instagram/profile/reels/full | 50 | limit (1-50) walks upstream pages server-side until that many items are collected, billing per page of ~12 consumed (5 credits each, 5-25 total). It is not a page size. |
GET /v1/threads/search | 100 | limit (1-100) walks successive result windows server-side, de-duplicating posts as it goes, and bills 1 credit per window consumed with the unused window budget refunded. It is not a page size. |
Row cap: on a lane that can fill its own rows with include, limit takes the top N rows of the page the search returned and caps the extra credits the join can spend with them, so limit=5&include=… holds the page price plus 5. It is applied after the page arrives and does not change the page the upstream served, so the cursor still advances past the whole page: rows beyond N are not returned by the next page either. Use it to buy a cheaper join, not to walk a list in smaller steps.
An n/a in the column means no limit control at all: to get fewer items, slice client-side; to get more, paginate another page.
Two things that are not
limit:/v1/prism/commentstakes bothmaxandlimit:maxbounds how many pages it scans (and is what you pay for), whilelimitonly caps how many of the scanned comments come back, so it never changes the price. Andpagination.page_sizein the response is a report of what arrived, not a control.
Every paginatable endpoint
216 endpoints paginate today (128 cursor-based, 70 page-based, 18 offset-based). Every one of them takes the universal cursor input and returns the same pagination block (next_cursor / has_more / page_size): no per-platform special cases. The Style column is informational only; you always send cursor.
AliExpress
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Get similar AliExpress products | GET /v1/aliexpress/product/similar | cursor | page | n/a |
| Get AliExpress product reviews | GET /v1/aliexpress/reviews | cursor | page | n/a |
| Search AliExpress products | GET /v1/aliexpress/search | cursor | page | n/a |
| List hot AliExpress products | GET /v1/aliexpress/search/hot | cursor | page | n/a |
| List AliExpress products in a featured promotion | GET /v1/aliexpress/search/promo | cursor | page | n/a |
Amazon
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Get Amazon Best Sellers in a category | GET /v1/amazon/best-sellers | cursor | page | n/a |
| Search Amazon products by keyword | GET /v1/amazon/product-search | cursor | page | n/a |
Apple App Store
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Search the Apple App Store listings database (paginated) | GET /v1/app_store/app-listings-search | cursor | cursor | page size (limit) |
Content Analysis
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Search web citations of a keyword with per-mention sentiment | GET /v1/content_analysis/search | cursor | cursor | page size (limit) |
Douyin
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Get replies to a Douyin comment | GET /v1/douyin/comment/replies | cursor | cursor | page size (limit) |
| Search Douyin creators | GET /v1/douyin/search/users | cursor | cursor | page size (limit) |
eBay
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Search eBay listings | GET /v1/ebay/search | cursor | page | n/a |
Economy
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Search US federal contract awards | GET /v1/economy/government-contracts | cursor | page | page size (limit) |
Etsy
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| List products in an Etsy shop | GET /v1/etsy/shop/products | cursor | page | page size (limit) |
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| List Facebook Ad Library company ads | GET /v1/facebook/adlibrary/company/ads | cursor | cursor | n/a |
| Search Facebook Ad Library | GET /v1/facebook/adlibrary/search/ads | cursor | cursor | n/a |
| List Facebook events for a city | GET /v1/facebook/events | cursor | cursor | n/a |
| Search Facebook events by keyword | GET /v1/facebook/events/search | cursor | cursor | n/a |
| List Facebook group posts | GET /v1/facebook/group/posts | cursor | cursor | n/a |
| Search Facebook Marketplace listings | GET /v1/facebook/marketplace/search | cursor | cursor | page size (count) |
| List replies to a Facebook post comment | GET /v1/facebook/post/comment/replies | cursor | cursor | n/a |
| List Facebook post comments | GET /v1/facebook/post/comments | cursor | cursor | n/a |
| List a Facebook page's events | GET /v1/facebook/profile/events | cursor | cursor | n/a |
| Facebook profile, recent posts, and computed analytics in one call. | GET /v1/facebook/profile/full | cursor | cursor | n/a |
| List Facebook profile photos | GET /v1/facebook/profile/photos | cursor | cursor | n/a |
| List Facebook page posts | GET /v1/facebook/profile/posts | cursor | cursor | n/a |
| List Facebook profile reels | GET /v1/facebook/profile/reels | cursor | cursor | n/a |
| Facebook profile reels with exact views, likes, comments, and shares merged in, in one call. | GET /v1/facebook/profile/reels/full | cursor | cursor | collect-until-N (max 50) |
| Search Facebook groups by keyword | GET /v1/facebook/search/groups | cursor | page | n/a |
| Search Facebook pages by keyword | GET /v1/facebook/search/pages | cursor | cursor | n/a |
| Search Facebook people by keyword | GET /v1/facebook/search/people | cursor | cursor | n/a |
| Search Facebook posts by keyword | GET /v1/facebook/search/posts | cursor | cursor | n/a |
| Search Facebook videos by keyword | GET /v1/facebook/search/videos | cursor | cursor | n/a |
G2
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| List products in a G2 category | GET /v1/g2/category | cursor | page | n/a |
| List G2 product URLs | GET /v1/g2/product-index | cursor | page | n/a |
| Get G2 reviews for a product | GET /v1/g2/reviews | cursor | page | n/a |
| List products for a G2 seller | GET /v1/g2/seller/products | cursor | page | n/a |
GitHub
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Get comments on an issue or pull request | GET /v1/github/issue/comments | cursor | page | page size (per_page) |
| List a GitHub user's repositories | GET /v1/github/profile/repos | cursor | page | page size (per_page) |
| List a repository's issues (and PRs) | GET /v1/github/repo/issues | cursor | page | page size (per_page) |
| List a repository's releases | GET /v1/github/repo/releases | cursor | page | page size (per_page) |
| Search GitHub issues and pull requests | GET /v1/github/search | cursor | page | page size (per_page) |
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| List Google ads by company | GET /v1/google/company/ads | cursor | cursor | n/a |
| Google web search | GET /v1/google/search | cursor | page | n/a |
Google Play
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Search the Google Play listings database (paginated) | GET /v1/google_play/app-listings-search | cursor | cursor | page size (limit) |
Gumtree
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Search Gumtree UK listings | GET /v1/gumtree/search | cursor | page | n/a |
| List a Gumtree seller's active ads | GET /v1/gumtree/seller/listings | cursor | page | n/a |
H&M
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Search H&M products by keyword | GET /v1/hm/search | cursor | page | page size (limit) |
Hacker News
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Search Hacker News | GET /v1/hackernews/search | cursor | page | n/a |
Home Depot
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Search Home Depot products by keyword | GET /v1/home_depot/search | cursor | page | n/a |
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| List Instagram reels using an audio track | GET /v1/instagram/audio/reels | cursor | cursor | n/a |
| List Instagram followers | GET /v1/instagram/followers | cursor | cursor | n/a |
| List Instagram following | GET /v1/instagram/following | cursor | cursor | n/a |
| List recent posts at an Instagram location | GET /v1/instagram/location/posts | cursor | cursor | n/a |
| List replies under an Instagram comment | GET /v1/instagram/post/comment/replies | cursor | cursor | n/a |
| List Instagram post comments | GET /v1/instagram/post/comments | cursor | cursor | n/a |
| Instagram profile, recent posts, and computed analytics in one call. | GET /v1/instagram/profile/full | cursor | cursor | n/a |
| List Instagram user posts | GET /v1/instagram/profile/posts | cursor | cursor | n/a |
| Instagram posts with views, likes, comments, and per-post share counts where available, in one call. | GET /v1/instagram/profile/posts/full | cursor | cursor | collect-until-N (max 50) |
| List Instagram user reels | GET /v1/instagram/profile/reels | cursor | cursor | n/a |
| Instagram reels with views, likes, comments, and per-reel share counts where available, in one call. | GET /v1/instagram/profile/reels/full | cursor | cursor | collect-until-N (max 50) |
| Feed of a known hashtag, flat 5 credits (for keyword or topic discovery use instagram/search/reels) | GET /v1/instagram/search/hashtag | cursor | cursor | n/a |
| Search Instagram music | GET /v1/instagram/search/music | cursor | cursor | n/a |
| Search popular Instagram posts | GET /v1/instagram/search/popular | cursor | cursor | row cap (limit, top N of the page) |
| Search Instagram profiles by keyword | GET /v1/instagram/search/profiles | cursor | cursor | row cap (limit, top N of the page) |
| Search Instagram posts by keyword or topic: reels about a brand, phrase or subject, with view counts (1 credit a page) | GET /v1/instagram/search/reels | cursor | page | n/a |
| List posts an Instagram user is tagged in | GET /v1/instagram/tagged | cursor | cursor | n/a |
Jobs
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Search Bing job listings | GET /v1/jobs/bing/search | cursor | cursor | n/a |
| Search Indeed job listings | GET /v1/jobs/indeed/search | cursor | cursor | n/a |
| Search LinkedIn job listings | GET /v1/jobs/linkedin/search | cursor | cursor | n/a |
| Search Xing job listings | GET /v1/jobs/xing/search | cursor | cursor | n/a |
Klarna
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Browse Klarna products in a category | GET /v1/klarna/category | cursor | offset | n/a |
| Get Klarna user reviews for a product | GET /v1/klarna/reviews | cursor | cursor | page size (limit) |
| Get Klarna professional reviews for a product | GET /v1/klarna/reviews/pro | cursor | cursor | page size (limit) |
| List products from a Klarna store | GET /v1/klarna/store/products | cursor | offset | n/a |
| List Klarna shopping stores | GET /v1/klarna/stores | cursor | offset | n/a |
Kohl's
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Get Kohl's product questions and answers | GET /v1/kohls/questions | cursor | page | page size (limit) |
| Get Kohl's product reviews | GET /v1/kohls/reviews | cursor | page | page size (limit) |
| Search Kohl's products by keyword | GET /v1/kohls/search | cursor | page | page size (limit) |
Kwai
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| List a Kwai user's posts | GET /v1/kwai/user/posts | cursor | cursor | page size (count) |
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Search LinkedIn ads | GET /v1/linkedin/ads/search | cursor | cursor | n/a |
| List comments on a LinkedIn Pulse article | GET /v1/linkedin/article/comments | cursor | page | n/a |
| List reactors on a LinkedIn Pulse article | GET /v1/linkedin/article/reactions | cursor | page | n/a |
| List a company's job postings | GET /v1/linkedin/company/jobs | cursor | page | n/a |
| List people at a LinkedIn company | GET /v1/linkedin/company/people | cursor | page | row cap (limit, top N of the page) |
| List LinkedIn company posts | GET /v1/linkedin/company/posts | cursor | page | n/a |
| List posts in a LinkedIn group | GET /v1/linkedin/group/posts | cursor | page | n/a |
| Get LinkedIn post comments | GET /v1/linkedin/post/comments | cursor | page | n/a |
| List replies to a LinkedIn comment | GET /v1/linkedin/post/comments/replies | cursor | cursor | n/a |
| List reactors on a LinkedIn post | GET /v1/linkedin/post/reactions | cursor | page | row cap (limit, top N of the page) |
| List reposts of a LinkedIn post | GET /v1/linkedin/post/reposts | cursor | cursor | n/a |
| List Pulse articles a LinkedIn member published | GET /v1/linkedin/profile/articles | cursor | page | n/a |
| List a member's licenses and certifications | GET /v1/linkedin/profile/certifications | cursor | page | n/a |
| List a member's education history | GET /v1/linkedin/profile/educations | cursor | page | n/a |
| List a member's work experiences | GET /v1/linkedin/profile/experiences | cursor | page | n/a |
LinkedIn company profile, recent posts, and computed analytics in one call. Company pages only; a member's profile is /v1/linkedin/profile/all. | GET /v1/linkedin/profile/full | cursor | cursor | n/a |
| List a member's honors and awards | GET /v1/linkedin/profile/honors | cursor | page | n/a |
| List companies a member follows | GET /v1/linkedin/profile/interests/companies | cursor | page | n/a |
| List groups a member follows | GET /v1/linkedin/profile/interests/groups | cursor | page | n/a |
| List newsletters a LinkedIn member follows | GET /v1/linkedin/profile/interests/newsletters | cursor | page | n/a |
| List schools a LinkedIn member follows | GET /v1/linkedin/profile/interests/schools | cursor | page | n/a |
| Walk a LinkedIn member's COMPLETE post history, 100 posts a page, with exact publish times and share counts the other lanes cannot return. Metered: 5 credits per post returned, so try the cheaper /v1/linkedin/profile/posts first | GET /v1/linkedin/profile/posts/archive | cursor | cursor | page size (limit) |
| List a member's publications | GET /v1/linkedin/profile/publications | cursor | page | n/a |
| List recommendations for a member | GET /v1/linkedin/profile/recommendations | cursor | page | n/a |
| List a member's skills | GET /v1/linkedin/profile/skills | cursor | page | n/a |
| List a member's volunteer experiences | GET /v1/linkedin/profile/volunteers | cursor | page | n/a |
| Search LinkedIn company pages | GET /v1/linkedin/search/companies | cursor | page | n/a |
| Search LinkedIn jobs | GET /v1/linkedin/search/jobs | cursor | page | n/a |
| Search LinkedIn people | GET /v1/linkedin/search/people | cursor | page | row cap (limit, top N of the page) |
| Search public LinkedIn posts by keyword | GET /v1/linkedin/search/posts | cursor | page | page size (limit) |
| Search LinkedIn schools | GET /v1/linkedin/search/schools | cursor | page | n/a |
Naver
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Search Naver Blog | GET /v1/naver/blog/search | cursor | offset | page size (display) |
| One query across the Korean internet (5 Naver corpora) + optional digest. | GET /v1/naver/brief | cursor | cursor | page size (display) |
| Search Naver Cafe articles | GET /v1/naver/cafearticle/search | cursor | offset | page size (display) |
| Search Naver Encyclopedia | GET /v1/naver/encyc/search | cursor | offset | page size (display) |
| Search Naver Image | GET /v1/naver/image/search | cursor | offset | page size (display) |
| Search Naver KnowledgeiN (지식iN) | GET /v1/naver/kin/search | cursor | offset | page size (display) |
| Search Naver News | GET /v1/naver/news/search | cursor | offset | page size (display) |
| Search Naver Web (웹문서) | GET /v1/naver/webkr/search | cursor | offset | page size (display) |
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Get Pinterest board | GET /v1/pinterest/board | cursor | cursor | row cap (limit, top N of the page) |
| Search Pinterest pins | GET /v1/pinterest/search | cursor | cursor | row cap (limit, top N of the page) |
Prism
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Every comment on a post, replies nested, server-paginated to completion. | GET /v1/prism/comments | cursor | cursor | page size (limit) |
| Search many platforms for keywords or a description, keep a date window, judge every row and return the posts, in one call or as a background run. | GET /v1/prism/discover | cursor | cursor | page size (limit) |
| List the API key's background jobs, newest first. | GET /v1/prism/jobs | cursor | cursor | n/a |
| Status and results of one background job. | GET /v1/prism/jobs/{job_id} | cursor | cursor | n/a |
| A Truth Social handle's pulse: profile, recent posts, per-post detail drill, and the news echo, in one call. | GET /v1/prism/truthsocial-pulse | cursor | cursor | n/a |
| One person's public posts across X, Threads, Bluesky, and Truth Social, time-merged. | GET /v1/prism/voice | cursor | cursor | n/a |
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Reddit VoC sweep: one keyword → threads across all of Reddit with subreddit attribution and top comments inline. | GET /v1/reddit/omni-search | cursor | cursor | n/a |
| List Reddit post comments | GET /v1/reddit/post/comments | cursor | cursor | n/a |
| List a Reddit user's posts | GET /v1/reddit/profile/posts | cursor | cursor | n/a |
| Search Reddit posts | GET /v1/reddit/search | cursor | cursor | n/a |
| Search Reddit comments | GET /v1/reddit/search/comments | cursor | cursor | n/a |
| Search Reddit image and video posts | GET /v1/reddit/search/media | cursor | cursor | n/a |
| List Reddit subreddit posts | GET /v1/reddit/subreddit | cursor | cursor | n/a |
| Search within a subreddit | GET /v1/reddit/subreddit/search | cursor | cursor | n/a |
| Find subreddits by topic | GET /v1/reddit/subreddits/search | cursor | cursor | row cap (limit, top N of the page) |
Rumble
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| List videos for a Rumble channel | GET /v1/rumble/channel/videos | cursor | cursor | n/a |
| Search Rumble videos | GET /v1/rumble/search | cursor | cursor | n/a |
Sephora
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| List Sephora products for a brand | GET /v1/sephora/brand/products | cursor | page | n/a |
| Browse Sephora products in a category | GET /v1/sephora/category | cursor | page | n/a |
| Get Sephora product reviews | GET /v1/sephora/reviews | cursor | page | page size (limit) |
| Search Sephora products by keyword | GET /v1/sephora/search | cursor | page | n/a |
Snapchat
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| List comments on a Snapchat Spotlight | GET /v1/snapchat/spotlight/comments | cursor | cursor | n/a |
Spotify
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| List a Spotify podcast's episodes | GET /v1/spotify/podcast/episodes | cursor | cursor | n/a |
Target
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Browse Target products in a category | GET /v1/target/category | cursor | page | n/a |
| Get Target product reviews | GET /v1/target/reviews | cursor | page | n/a |
Telegram
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| List Telegram channel posts | GET /v1/telegram/profile/posts | cursor | cursor | n/a |
| Search Telegram channels by keyword | GET /v1/telegram/search | cursor | page | row cap (limit, top N of the page) |
Threads
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Search Threads posts | GET /v1/threads/search | cursor | cursor | collect-until-N (max 100) |
TikTok
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Search the TikTok Ad Library | GET /v1/tiktok/adlibrary/search | cursor | cursor | row cap (limit, top N of the page) |
| List videos in a TikTok collection | GET /v1/tiktok/collection/videos | cursor | cursor | n/a |
| List TikTok videos made with an effect | GET /v1/tiktok/effect/videos | cursor | cursor | n/a |
| List TikTok videos tagged at a place | GET /v1/tiktok/location/posts | cursor | cursor | n/a |
| List videos in a TikTok playlist | GET /v1/tiktok/playlist/videos | cursor | cursor | n/a |
| List TikTok post comments | GET /v1/tiktok/post/comments | cursor | cursor | n/a |
| TikTok profile, recent posts, and computed analytics in one call. | GET /v1/tiktok/profile/full | cursor | cursor | n/a |
| List TikTok user videos | GET /v1/tiktok/profile/videos | cursor | cursor | n/a |
| Search TikTok videos by keyword | GET /v1/tiktok/search | cursor | cursor | page size (limit) |
| Search TikTok by hashtag | GET /v1/tiktok/search/hashtag | cursor | cursor | n/a |
| Search TikTok sounds | GET /v1/tiktok/search/music | cursor | cursor | n/a |
| TikTok top search results | GET /v1/tiktok/search/top | cursor | cursor | n/a |
| Search TikTok users | GET /v1/tiktok/search/users | cursor | cursor | row cap (limit, top N of the page) |
| List TikTok videos using a song | GET /v1/tiktok/song/videos | cursor | cursor | n/a |
| List TikTok user followers | GET /v1/tiktok/user/followers | cursor | cursor | n/a |
| List TikTok user following | GET /v1/tiktok/user/following | cursor | cursor | n/a |
| List the videos a TikTok account has liked | GET /v1/tiktok/user/liked | cursor | cursor | n/a |
| List TikTok comment replies | GET /v1/tiktok/video/comment/replies | cursor | cursor | n/a |
TikTok Shop
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| List TikTok Shop product reviews | GET /v1/tiktokshop/product/reviews | cursor | page | n/a |
| List TikTok Shop products | GET /v1/tiktokshop/products | cursor | cursor | n/a |
| Search TikTok Shop products | GET /v1/tiktokshop/search | cursor | page | n/a |
| List TikTok user showcase products | GET /v1/tiktokshop/user/showcase | cursor | cursor | n/a |
Truth Social
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| List Truth Social user posts | GET /v1/truthsocial/user/posts | cursor | cursor | n/a |
Twitter/X
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| X (Twitter) profile, recent posts, and computed analytics in one call. | GET /v1/twitter/profile/full | cursor | cursor | n/a |
| Search Twitter tweets | GET /v1/twitter/search/tweets | cursor | cursor | n/a |
| Search Twitter users | GET /v1/twitter/search/users | cursor | cursor | n/a |
| List Twitter tweet replies | GET /v1/twitter/tweet/replies | cursor | cursor | n/a |
| List Twitter tweet retweeters | GET /v1/twitter/tweet/retweeters | cursor | cursor | n/a |
| List Twitter user followers | GET /v1/twitter/user/followers | cursor | cursor | n/a |
| List Twitter user following | GET /v1/twitter/user/following | cursor | cursor | n/a |
| List Twitter user media tweets | GET /v1/twitter/user/media | cursor | cursor | n/a |
| List Twitter user tweets | GET /v1/twitter/user/tweets | cursor | cursor | n/a |
US Congress Trades
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| List members of Congress who have disclosed trades | GET /v1/us_congress_trades/members | cursor | offset | page size (limit) |
| List trades for one politician | GET /v1/us_congress_trades/politician/trades | cursor | offset | page size (limit) |
| List trades from a state's congressional delegation | GET /v1/us_congress_trades/state/trades | cursor | offset | page size (limit) |
| Politicians ranked by late STOCK Act filings | GET /v1/us_congress_trades/stats/reporting-gaps | cursor | offset | page size (limit) |
| List congressional trades for a ticker | GET /v1/us_congress_trades/ticker/trades | cursor | offset | page size (limit) |
| Search US Congress stock trades | GET /v1/us_congress_trades/trades | cursor | offset | page size (limit) |
| Latest US Congress trades (48 hours) | GET /v1/us_congress_trades/trades/latest | cursor | offset | page size (limit) |
| Recent US Congress trades (7 days) | GET /v1/us_congress_trades/trades/recent | cursor | offset | page size (limit) |
Walmart
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Browse Walmart products in a category | GET /v1/walmart/category | cursor | page | page size (limit) |
| Get Walmart product reviews | GET /v1/walmart/reviews | cursor | page | page size (limit) |
| Search Walmart products by keyword | GET /v1/walmart/search | cursor | page | n/a |
Wayfair
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Get Wayfair product reviews | GET /v1/wayfair/reviews | cursor | page | n/a |
| Search Wayfair products | GET /v1/wayfair/search | cursor | page | n/a |
Web Scraping
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| List async web jobs | GET /v1/web/jobs | cursor | cursor | page size (limit) |
| List web monitors | GET /v1/web/monitors | cursor | cursor | page size (limit) |
Xiaohongshu
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Get Xiaohongshu note comments | GET /v1/xiaohongshu/post/comments | cursor | cursor | page size (limit) |
| List a Xiaohongshu creator's notes | GET /v1/xiaohongshu/profile/posts | cursor | cursor | page size (limit) |
| Search Xiaohongshu notes | GET /v1/xiaohongshu/search | cursor | cursor | page size (limit) |
Yelp
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| Get Yelp reviews for a business | GET /v1/yelp/business/reviews | cursor | cursor | n/a |
| Search Yelp businesses | GET /v1/yelp/search | cursor | cursor | n/a |
| Search Yelp businesses with full cards | GET /v1/yelp/search/full | cursor | cursor | n/a |
YouTube
| Endpoint | Path | Send back as | Style | limit behaviour |
|---|---|---|---|---|
| List a YouTube channel's community posts | GET /v1/youtube/channel/community-posts | cursor | cursor | n/a |
| List a YouTube channel's live streams | GET /v1/youtube/channel/lives | cursor | cursor | n/a |
| List a YouTube channel's playlists | GET /v1/youtube/channel/playlists | cursor | cursor | n/a |
| List YouTube channel shorts | GET /v1/youtube/channel/shorts | cursor | cursor | n/a |
| List YouTube channel videos | GET /v1/youtube/channel/videos | cursor | cursor | n/a |
| Get YouTube playlist | GET /v1/youtube/playlist | cursor | cursor | n/a |
| List the videos in a YouTube playlist | GET /v1/youtube/playlist/items | cursor | cursor | n/a |
| YouTube profile, recent posts, and computed analytics in one call. | GET /v1/youtube/profile/full | cursor | cursor | n/a |
| Search YouTube | GET /v1/youtube/search | cursor | cursor | n/a |
| Advanced YouTube video search | GET /v1/youtube/search/advanced | cursor | cursor | n/a |
| Search YouTube by hashtag | GET /v1/youtube/search/hashtag | cursor | cursor | n/a |
| List YouTube comment replies | GET /v1/youtube/video/comment/replies | cursor | cursor | n/a |
| List YouTube video comments | GET /v1/youtube/video/comments | cursor | cursor | n/a |
| Get trending YouTube videos | GET /v1/youtube/videos/trending | cursor | cursor | n/a |
See also
- Response schema → List endpoints: the envelope shape in one sentence.
- Quickstart: your first request in under a minute.
- Endpoint pricing: every endpoint and what each call costs.
- Error handling: refund rules for stale-cursor errors, and the concurrency limit.
