# Pagination (/docs/pagination) {/* AUTO-GENERATED. The intro prose is hand-written (edit it in packages/social-api/src/docs/generate-pagination.ts, not on disk; the whole file is overwritten on every `pnpm -F @repo/social-api generate:docs` run). The per-platform coverage tables at the bottom are rebuilt from the registry. Source: packages/social-api/src/docs/generate-pagination.ts */} Pagination [#pagination] Every list endpoint on every platform paginates the same way. Learn it once and it works on all 132 paginatable endpoints: TikTok, Instagram, YouTube, Reddit, LinkedIn, Naver, all of them. The one rule [#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 [#the-response-block] Every list response carries a top-level `pagination` block: ```json { "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 [#a-worked-round-trip] **Request page 1** (no cursor): ```bash 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`): ```bash 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 [#the-loop] Identical for every list endpoint on every platform: ```ts async function* paginate(path: string, params: Record) { 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: 1. **Send `next_cursor` back as the EXACT string you received, under the key `cursor`.** Don't decode, trim, or re-encode it; it's an opaque token. 2. **Stop when `has_more` is `false`** (equivalently, when `next_cursor` is `null`). Don't infer the end from an empty page or from `total`. Recipe: drain a full account safely [#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: ```ts // Drain every video for a handle, then stop. async function drain(path: string, params: Record) { 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 previous `next_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](/docs/endpoint-pricing.md)) before you loop, and cap `pages` if 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_more` flips to `false` when you reach it. Cursor-style feeds end when the upstream runs out of items. Sending the wrong param is a 400, not a silent bug [#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 [#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?](/docs/credits.md#when-are-credits-refunded)). Start over with no cursor. Two kinds of `limit` [#two-kinds-of-limit] `limit` means one of two 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. | 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/comments` takes both `max` and `limit` — `max` bounds how many pages it scans (and is what you pay for), while `limit` only caps how many of the scanned comments come back, so it never changes the price. And `pagination.page_size` in the response is a *report* of what arrived, not a control. Every paginatable endpoint [#every-paginatable-endpoint] 132 endpoints paginate today (88 cursor-based, 37 page-based, 7 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`. Amazon [#amazon] | Endpoint | Path | Send back as | Style | `limit` behaviour | | --------------------------------------------------------------------- | ------------------------------- | ------------ | ----- | ----------------- | | [Search Amazon products by keyword](/platforms/amazon/product-search) | `GET /v1/amazon/product-search` | `cursor` | page | — | Apple App Store [#apple-app-store] | Endpoint | Path | Send back as | Style | `limit` behaviour | | ---------------------------------------------------------------------------------------------------- | --------------------------------------- | ------------ | ------ | ------------------- | | [Search the Apple App Store listings database (paginated)](/platforms/app_store/app-listings-search) | `GET /v1/app_store/app-listings-search` | `cursor` | cursor | page size (`limit`) | Content Analysis [#content-analysis] | Endpoint | Path | Send back as | Style | `limit` behaviour | | -------------------------------------------------------------------------------------------------- | --------------------------------- | ------------ | ------ | ------------------- | | [Search web citations of a keyword with per-mention sentiment](/platforms/content_analysis/search) | `GET /v1/content_analysis/search` | `cursor` | cursor | page size (`limit`) | eBay [#ebay] | Endpoint | Path | Send back as | Style | `limit` behaviour | | ---------------------------------------------- | --------------------- | ------------ | ----- | ----------------- | | [Search eBay listings](/platforms/ebay/search) | `GET /v1/ebay/search` | `cursor` | page | — | Facebook [#facebook] | Endpoint | Path | Send back as | Style | `limit` behaviour | | -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------- | ------------ | ------ | ------------------------ | | [List Facebook Ad Library company ads](/platforms/facebook/adlibrary-company-ads) | `GET /v1/facebook/adlibrary/company/ads` | `cursor` | cursor | — | | [Search Facebook Ad Library](/platforms/facebook/adlibrary-search-ads) | `GET /v1/facebook/adlibrary/search/ads` | `cursor` | cursor | — | | [List Facebook events for a city](/platforms/facebook/events) | `GET /v1/facebook/events` | `cursor` | cursor | — | | [Search Facebook events by keyword](/platforms/facebook/events-search) | `GET /v1/facebook/events/search` | `cursor` | cursor | — | | [Search Facebook Marketplace listings](/platforms/facebook/marketplace-search) | `GET /v1/facebook/marketplace/search` | `cursor` | cursor | page size (`count`) | | [List replies to a Facebook post comment](/platforms/facebook/post-comment-replies) | `GET /v1/facebook/post/comment/replies` | `cursor` | cursor | — | | [List Facebook post comments](/platforms/facebook/post-comments) | `GET /v1/facebook/post/comments` | `cursor` | cursor | — | | [List a Facebook page's events](/platforms/facebook/profile-events) | `GET /v1/facebook/profile/events` | `cursor` | cursor | — | | [Facebook profile, recent posts, and computed analytics in one call.](/platforms/facebook/profile-full) | `GET /v1/facebook/profile/full` | `cursor` | cursor | — | | [List Facebook profile photos](/platforms/facebook/profile-photos) | `GET /v1/facebook/profile/photos` | `cursor` | cursor | — | | [List Facebook page posts](/platforms/facebook/profile-posts) | `GET /v1/facebook/profile/posts` | `cursor` | cursor | — | | [List Facebook profile reels](/platforms/facebook/profile-reels) | `GET /v1/facebook/profile/reels` | `cursor` | cursor | — | | [Facebook profile reels with exact views, likes, comments, and shares merged in, in one call.](/platforms/facebook/profile-reels-full) | `GET /v1/facebook/profile/reels/full` | `cursor` | cursor | collect-until-N (max 50) | GitHub [#github] | Endpoint | Path | Send back as | Style | `limit` behaviour | | ---------------------------------------------------------------------------- | ------------------------------- | ------------ | ----- | ---------------------- | | [Get comments on an issue or pull request](/platforms/github/issue-comments) | `GET /v1/github/issue/comments` | `cursor` | page | page size (`per_page`) | | [List a GitHub user's repositories](/platforms/github/profile-repos) | `GET /v1/github/profile/repos` | `cursor` | page | page size (`per_page`) | | [List a repository's issues (and PRs)](/platforms/github/repo-issues) | `GET /v1/github/repo/issues` | `cursor` | page | page size (`per_page`) | | [List a repository's releases](/platforms/github/repo-releases) | `GET /v1/github/repo/releases` | `cursor` | page | page size (`per_page`) | | [Search GitHub issues and pull requests](/platforms/github/search) | `GET /v1/github/search` | `cursor` | page | page size (`per_page`) | Google [#google] | Endpoint | Path | Send back as | Style | `limit` behaviour | | ----------------------------------------------------------- | ---------------------------- | ------------ | ------ | ----------------- | | [List Google ads by company](/platforms/google/company-ads) | `GET /v1/google/company/ads` | `cursor` | cursor | — | | [Google web search](/platforms/google/search) | `GET /v1/google/search` | `cursor` | page | — | Google Play [#google-play] | Endpoint | Path | Send back as | Style | `limit` behaviour | | -------------------------------------------------------------------------------------------------- | ----------------------------------------- | ------------ | ------ | ------------------- | | [Search the Google Play listings database (paginated)](/platforms/google_play/app-listings-search) | `GET /v1/google_play/app-listings-search` | `cursor` | cursor | page size (`limit`) | Hacker News [#hacker-news] | Endpoint | Path | Send back as | Style | `limit` behaviour | | -------------------------------------------------- | --------------------------- | ------------ | ----- | ----------------- | | [Search Hacker News](/platforms/hackernews/search) | `GET /v1/hackernews/search` | `cursor` | page | — | Home Depot [#home-depot] | Endpoint | Path | Send back as | Style | `limit` behaviour | | --------------------------------------------------------------- | ---------------------------- | ------------ | ----- | ----------------- | | [Get Home Depot product reviews](/platforms/home_depot/reviews) | `GET /v1/home_depot/reviews` | `cursor` | page | — | Instagram [#instagram] | Endpoint | Path | Send back as | Style | `limit` behaviour | | ----------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------- | ------------ | ------ | ------------------------ | | [List Instagram reels using an audio track](/platforms/instagram/audio-reels) | `GET /v1/instagram/audio/reels` | `cursor` | cursor | — | | [List Instagram followers](/platforms/instagram/followers) | `GET /v1/instagram/followers` | `cursor` | cursor | — | | [List Instagram following](/platforms/instagram/following) | `GET /v1/instagram/following` | `cursor` | cursor | — | | [List replies under an Instagram comment](/platforms/instagram/post-comment-replies) | `GET /v1/instagram/post/comment/replies` | `cursor` | cursor | — | | [List Instagram post comments](/platforms/instagram/post-comments) | `GET /v1/instagram/post/comments` | `cursor` | cursor | — | | [Instagram profile, recent posts, and computed analytics in one call.](/platforms/instagram/profile-full) | `GET /v1/instagram/profile/full` | `cursor` | cursor | — | | [List Instagram user posts](/platforms/instagram/profile-posts) | `GET /v1/instagram/profile/posts` | `cursor` | cursor | — | | [Instagram posts with views, likes, comments, and per-post share counts where available, in one call.](/platforms/instagram/profile-posts-full) | `GET /v1/instagram/profile/posts/full` | `cursor` | cursor | collect-until-N (max 50) | | [List Instagram user reels](/platforms/instagram/profile-reels) | `GET /v1/instagram/profile/reels` | `cursor` | cursor | — | | [Instagram reels with views, likes, comments, and per-reel share counts where available, in one call.](/platforms/instagram/profile-reels-full) | `GET /v1/instagram/profile/reels/full` | `cursor` | cursor | collect-until-N (max 50) | | [Search Instagram posts by hashtag](/platforms/instagram/search-hashtag) | `GET /v1/instagram/search/hashtag` | `cursor` | cursor | — | | [Search Instagram music](/platforms/instagram/search-music) | `GET /v1/instagram/search/music` | `cursor` | cursor | — | | [Search popular Instagram posts](/platforms/instagram/search-popular) | `GET /v1/instagram/search/popular` | `cursor` | cursor | — | | [Search Instagram profiles by keyword](/platforms/instagram/search-profiles) | `GET /v1/instagram/search/profiles` | `cursor` | cursor | — | | [Search Instagram reels](/platforms/instagram/search-reels) | `GET /v1/instagram/search/reels` | `cursor` | page | — | | [List posts an Instagram user is tagged in](/platforms/instagram/tagged) | `GET /v1/instagram/tagged` | `cursor` | cursor | — | Kwai [#kwai] | Endpoint | Path | Send back as | Style | `limit` behaviour | | ------------------------------------------------------ | ------------------------- | ------------ | ------ | ------------------- | | [List a Kwai user's posts](/platforms/kwai/user-posts) | `GET /v1/kwai/user/posts` | `cursor` | cursor | page size (`count`) | LinkedIn [#linkedin] | Endpoint | Path | Send back as | Style | `limit` behaviour | | --------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | ------------ | ------ | ----------------- | | [Search LinkedIn ads](/platforms/linkedin/ads-search) | `GET /v1/linkedin/ads/search` | `cursor` | cursor | — | | [List a company's job postings](/platforms/linkedin/company-jobs) | `GET /v1/linkedin/company/jobs` | `cursor` | page | — | | [List people at a LinkedIn company](/platforms/linkedin/company-people) | `GET /v1/linkedin/company/people` | `cursor` | page | — | | [List LinkedIn company posts](/platforms/linkedin/company-posts) | `GET /v1/linkedin/company/posts` | `cursor` | page | — | | [List posts in a LinkedIn group](/platforms/linkedin/group-posts) | `GET /v1/linkedin/group/posts` | `cursor` | page | — | | [Get LinkedIn post comments](/platforms/linkedin/post-comments) | `GET /v1/linkedin/post/comments` | `cursor` | page | — | | [List replies to a LinkedIn comment](/platforms/linkedin/post-comments-replies) | `GET /v1/linkedin/post/comments/replies` | `cursor` | cursor | — | | [List reactors on a LinkedIn post](/platforms/linkedin/post-reactions) | `GET /v1/linkedin/post/reactions` | `cursor` | page | — | | [List reposts of a LinkedIn post](/platforms/linkedin/post-reposts) | `GET /v1/linkedin/post/reposts` | `cursor` | cursor | — | | [List a member's licenses and certifications](/platforms/linkedin/profile-certifications) | `GET /v1/linkedin/profile/certifications` | `cursor` | page | — | | [List a member's comments](/platforms/linkedin/profile-comments) | `GET /v1/linkedin/profile/comments` | `cursor` | cursor | — | | [List a member's education history](/platforms/linkedin/profile-educations) | `GET /v1/linkedin/profile/educations` | `cursor` | page | — | | [List a member's work experiences](/platforms/linkedin/profile-experiences) | `GET /v1/linkedin/profile/experiences` | `cursor` | page | — | | [LinkedIn company profile, recent posts, and computed analytics in one call.](/platforms/linkedin/profile-full) | `GET /v1/linkedin/profile/full` | `cursor` | cursor | — | | [List a member's honors and awards](/platforms/linkedin/profile-honors) | `GET /v1/linkedin/profile/honors` | `cursor` | page | — | | [List a member's image posts](/platforms/linkedin/profile-images) | `GET /v1/linkedin/profile/images` | `cursor` | cursor | — | | [List companies a member follows](/platforms/linkedin/profile-interests-companies) | `GET /v1/linkedin/profile/interests/companies` | `cursor` | page | — | | [List groups a member follows](/platforms/linkedin/profile-interests-groups) | `GET /v1/linkedin/profile/interests/groups` | `cursor` | page | — | | [List a LinkedIn member's posts](/platforms/linkedin/profile-posts) | `GET /v1/linkedin/profile/posts` | `cursor` | cursor | — | | [List a member's publications](/platforms/linkedin/profile-publications) | `GET /v1/linkedin/profile/publications` | `cursor` | page | — | | [List posts a LinkedIn member reacted to](/platforms/linkedin/profile-reactions) | `GET /v1/linkedin/profile/reactions` | `cursor` | cursor | — | | [List recommendations for a member](/platforms/linkedin/profile-recommendations) | `GET /v1/linkedin/profile/recommendations` | `cursor` | page | — | | [List a member's skills](/platforms/linkedin/profile-skills) | `GET /v1/linkedin/profile/skills` | `cursor` | page | — | | [List a member's video posts](/platforms/linkedin/profile-videos) | `GET /v1/linkedin/profile/videos` | `cursor` | cursor | — | | [List a member's volunteer experiences](/platforms/linkedin/profile-volunteers) | `GET /v1/linkedin/profile/volunteers` | `cursor` | page | — | | [Search LinkedIn jobs](/platforms/linkedin/search-jobs) | `GET /v1/linkedin/search/jobs` | `cursor` | page | — | | [Search LinkedIn people](/platforms/linkedin/search-people) | `GET /v1/linkedin/search/people` | `cursor` | page | — | | [Search public LinkedIn posts by keyword](/platforms/linkedin/search-posts) | `GET /v1/linkedin/search/posts` | `cursor` | page | — | | [Search LinkedIn schools](/platforms/linkedin/search-schools) | `GET /v1/linkedin/search/schools` | `cursor` | page | — | Naver [#naver] | Endpoint | Path | Send back as | Style | `limit` behaviour | | --------------------------------------------------------------------------------------------------- | ---------------------------------- | ------------ | ------ | --------------------- | | [Search Naver Blog](/platforms/naver/blog-search) | `GET /v1/naver/blog/search` | `cursor` | offset | page size (`display`) | | [One query across the Korean internet (5 Naver corpora) + optional digest.](/platforms/naver/brief) | `GET /v1/naver/brief` | `cursor` | cursor | page size (`display`) | | [Search Naver Cafe articles](/platforms/naver/cafearticle-search) | `GET /v1/naver/cafearticle/search` | `cursor` | offset | page size (`display`) | | [Search Naver Encyclopedia](/platforms/naver/encyc-search) | `GET /v1/naver/encyc/search` | `cursor` | offset | page size (`display`) | | [Search Naver Image](/platforms/naver/image-search) | `GET /v1/naver/image/search` | `cursor` | offset | page size (`display`) | | [Search Naver KnowledgeiN (지식iN)](/platforms/naver/kin-search) | `GET /v1/naver/kin/search` | `cursor` | offset | page size (`display`) | | [Search Naver News](/platforms/naver/news-search) | `GET /v1/naver/news/search` | `cursor` | offset | page size (`display`) | | [Search Naver Web (웹문서)](/platforms/naver/webkr-search) | `GET /v1/naver/webkr/search` | `cursor` | offset | page size (`display`) | Pinterest [#pinterest] | Endpoint | Path | Send back as | Style | `limit` behaviour | | ---------------------------------------------------- | -------------------------- | ------------ | ------ | ----------------- | | [Search Pinterest pins](/platforms/pinterest/search) | `GET /v1/pinterest/search` | `cursor` | cursor | — | Prism [#prism] | Endpoint | Path | Send back as | Style | `limit` behaviour | | --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ------------ | ------ | ------------------- | | [Every comment on a post, replies nested, server-paginated to completion.](/platforms/prism/comments) | `GET /v1/prism/comments` | `cursor` | cursor | page size (`limit`) | | [A Truth Social handle's pulse — profile, recent posts, per-post detail drill, and the news echo, in one call.](/platforms/prism/truthsocial-pulse) | `GET /v1/prism/truthsocial-pulse` | `cursor` | cursor | — | | [One person's public posts across X, Threads, Bluesky, and Truth Social, time-merged.](/platforms/prism/voice) | `GET /v1/prism/voice` | `cursor` | cursor | — | Reddit [#reddit] | 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.](/platforms/reddit/omni-search) | `GET /v1/reddit/omni-search` | `cursor` | cursor | — | | [List Reddit post comments](/platforms/reddit/post-comments) | `GET /v1/reddit/post/comments` | `cursor` | cursor | — | | [Search Reddit posts](/platforms/reddit/search) | `GET /v1/reddit/search` | `cursor` | cursor | — | | [List Reddit subreddit posts](/platforms/reddit/subreddit) | `GET /v1/reddit/subreddit` | `cursor` | cursor | — | | [Search within a subreddit](/platforms/reddit/subreddit-search) | `GET /v1/reddit/subreddit/search` | `cursor` | cursor | — | Rumble [#rumble] | Endpoint | Path | Send back as | Style | `limit` behaviour | | -------------------------------------------------------------------- | ------------------------------- | ------------ | ------ | ----------------- | | [List videos for a Rumble channel](/platforms/rumble/channel-videos) | `GET /v1/rumble/channel/videos` | `cursor` | cursor | — | | [Search Rumble videos](/platforms/rumble/search) | `GET /v1/rumble/search` | `cursor` | cursor | — | Snapchat [#snapchat] | Endpoint | Path | Send back as | Style | `limit` behaviour | | ------------------------------------------------------------------------------- | ------------------------------------- | ------------ | ------ | ----------------- | | [List comments on a Snapchat Spotlight](/platforms/snapchat/spotlight-comments) | `GET /v1/snapchat/spotlight/comments` | `cursor` | cursor | — | Spotify [#spotify] | Endpoint | Path | Send back as | Style | `limit` behaviour | | ------------------------------------------------------------------------ | ---------------------------------- | ------------ | ------ | ----------------- | | [List a Spotify podcast's episodes](/platforms/spotify/podcast-episodes) | `GET /v1/spotify/podcast/episodes` | `cursor` | cursor | — | Target [#target] | Endpoint | Path | Send back as | Style | `limit` behaviour | | ------------------------------------------------------------------ | ------------------------- | ------------ | ----- | ----------------- | | [Browse Target products in a category](/platforms/target/category) | `GET /v1/target/category` | `cursor` | page | — | | [Get Target product reviews](/platforms/target/reviews) | `GET /v1/target/reviews` | `cursor` | page | — | Threads [#threads] | Endpoint | Path | Send back as | Style | `limit` behaviour | | ------------------------------------------------- | ------------------------ | ------------ | ------ | ------------------------- | | [Search Threads posts](/platforms/threads/search) | `GET /v1/threads/search` | `cursor` | cursor | collect-until-N (max 100) | TikTok [#tiktok] | Endpoint | Path | Send back as | Style | `limit` behaviour | | --------------------------------------------------------------------------------------------------- | -------------------------------------- | ------------ | ------ | ----------------- | | [Search the TikTok Ad Library](/platforms/tiktok/adlibrary-search) | `GET /v1/tiktok/adlibrary/search` | `cursor` | cursor | — | | [List videos in a TikTok collection](/platforms/tiktok/collection-videos) | `GET /v1/tiktok/collection/videos` | `cursor` | cursor | — | | [List TikTok post comments](/platforms/tiktok/post-comments) | `GET /v1/tiktok/post/comments` | `cursor` | cursor | — | | [TikTok profile, recent posts, and computed analytics in one call.](/platforms/tiktok/profile-full) | `GET /v1/tiktok/profile/full` | `cursor` | cursor | — | | [List TikTok user videos](/platforms/tiktok/profile-videos) | `GET /v1/tiktok/profile/videos` | `cursor` | cursor | — | | [Search TikTok videos by keyword](/platforms/tiktok/search) | `GET /v1/tiktok/search` | `cursor` | cursor | — | | [Search TikTok by hashtag](/platforms/tiktok/search-hashtag) | `GET /v1/tiktok/search/hashtag` | `cursor` | cursor | — | | [TikTok top search results](/platforms/tiktok/search-top) | `GET /v1/tiktok/search/top` | `cursor` | cursor | — | | [Search TikTok users](/platforms/tiktok/search-users) | `GET /v1/tiktok/search/users` | `cursor` | cursor | — | | [List TikTok videos using a song](/platforms/tiktok/song-videos) | `GET /v1/tiktok/song/videos` | `cursor` | cursor | — | | [List TikTok user followers](/platforms/tiktok/user-followers) | `GET /v1/tiktok/user/followers` | `cursor` | cursor | — | | [List TikTok comment replies](/platforms/tiktok/video-comment-replies) | `GET /v1/tiktok/video/comment/replies` | `cursor` | cursor | — | TikTok Shop [#tiktok-shop] | Endpoint | Path | Send back as | Style | `limit` behaviour | | ------------------------------------------------------------------------- | ---------------------------------- | ------------ | ------ | ----------------- | | [Search TikTok Shop products](/platforms/tiktokshop/search) | `GET /v1/tiktokshop/search` | `cursor` | page | — | | [List TikTok user showcase products](/platforms/tiktokshop/user-showcase) | `GET /v1/tiktokshop/user/showcase` | `cursor` | cursor | — | Truth Social [#truth-social] | Endpoint | Path | Send back as | Style | `limit` behaviour | | ----------------------------------------------------------------- | -------------------------------- | ------------ | ------ | ----------------- | | [List Truth Social user posts](/platforms/truthsocial/user-posts) | `GET /v1/truthsocial/user/posts` | `cursor` | cursor | — | Twitter/X [#twitterx] | Endpoint | Path | Send back as | Style | `limit` behaviour | | --------------------------------------------------------------------------------------------------------- | ------------------------------ | ------------ | ------ | ----------------- | | [X (Twitter) profile, recent posts, and computed analytics in one call.](/platforms/twitter/profile-full) | `GET /v1/twitter/profile/full` | `cursor` | cursor | — | Walmart [#walmart] | Endpoint | Path | Send back as | Style | `limit` behaviour | | -------------------------------------------------------------------- | -------------------------- | ------------ | ----- | ------------------- | | [Browse Walmart products in a category](/platforms/walmart/category) | `GET /v1/walmart/category` | `cursor` | page | page size (`limit`) | | [Get Walmart product reviews](/platforms/walmart/reviews) | `GET /v1/walmart/reviews` | `cursor` | page | page size (`limit`) | | [Search Walmart products by keyword](/platforms/walmart/search) | `GET /v1/walmart/search` | `cursor` | page | — | Web Scraping [#web-scraping] | Endpoint | Path | Send back as | Style | `limit` behaviour | | -------------------------------------------- | ---------------------- | ------------ | ------ | ------------------- | | [List async web jobs](/platforms/web/jobs) | `GET /v1/web/jobs` | `cursor` | cursor | page size (`limit`) | | [List web monitors](/platforms/web/monitors) | `GET /v1/web/monitors` | `cursor` | cursor | page size (`limit`) | YouTube [#youtube] | Endpoint | Path | Send back as | Style | `limit` behaviour | | ----------------------------------------------------------------------------------------------------- | ----------------------------------------- | ------------ | ------ | ----------------- | | [List a YouTube channel's community posts](/platforms/youtube/channel-community-posts) | `GET /v1/youtube/channel/community-posts` | `cursor` | cursor | — | | [List a YouTube channel's live streams](/platforms/youtube/channel-lives) | `GET /v1/youtube/channel/lives` | `cursor` | cursor | — | | [List a YouTube channel's playlists](/platforms/youtube/channel-playlists) | `GET /v1/youtube/channel/playlists` | `cursor` | cursor | — | | [List YouTube channel shorts](/platforms/youtube/channel-shorts) | `GET /v1/youtube/channel/shorts` | `cursor` | cursor | — | | [List YouTube channel videos](/platforms/youtube/channel-videos) | `GET /v1/youtube/channel/videos` | `cursor` | cursor | — | | [Get YouTube playlist](/platforms/youtube/playlist) | `GET /v1/youtube/playlist` | `cursor` | cursor | — | | [List the videos in a YouTube playlist](/platforms/youtube/playlist-items) | `GET /v1/youtube/playlist/items` | `cursor` | cursor | — | | [YouTube profile, recent posts, and computed analytics in one call.](/platforms/youtube/profile-full) | `GET /v1/youtube/profile/full` | `cursor` | cursor | — | | [Search YouTube](/platforms/youtube/search) | `GET /v1/youtube/search` | `cursor` | cursor | — | | [Advanced YouTube video search](/platforms/youtube/search-advanced) | `GET /v1/youtube/search/advanced` | `cursor` | cursor | — | | [Search YouTube by hashtag](/platforms/youtube/search-hashtag) | `GET /v1/youtube/search/hashtag` | `cursor` | cursor | — | | [List YouTube comment replies](/platforms/youtube/video-comment-replies) | `GET /v1/youtube/video/comment/replies` | `cursor` | cursor | — | | [List YouTube video comments](/platforms/youtube/video-comments) | `GET /v1/youtube/video/comments` | `cursor` | cursor | — | | [Get trending YouTube videos](/platforms/youtube/videos-trending) | `GET /v1/youtube/videos/trending` | `cursor` | cursor | — | See also [#see-also] * [Response schema → List endpoints](/docs/response-schema.md#list-endpoints) — the envelope shape in one sentence. * [Quickstart](/docs/quickstart.md) — your first request in under a minute. * [Endpoint pricing](/docs/endpoint-pricing.md) — every endpoint and what each call costs. * [Error handling](/docs/errors.md) — refund rules for stale-cursor errors, and the concurrency limit.