# Pagination (/docs/pagination)

Read pagination.next_cursor, send it back as cursor, stop when has_more is false. The same loop works on every list endpoint.



List endpoints return one page at a time. Walking a list is the same on every platform: take the cursor from the response, send it back, and stop when the response says there is nothing left.

## The rule [#the-rule]

**Send `pagination.next_cursor` back as the `cursor` query parameter. Stop when `pagination.has_more` is `false`.**

You never build a cursor or decode one. It is an opaque string that starts `v2c.`. Pass it back exactly as you received it, under the name `cursor`, with the same parameters as the first page, within 24 hours.

## The pagination block [#the-pagination-block]

A list response carries a `pagination` object next to `data`:

```json title="Response"
{
  "success": true,
  "platform": "tiktok",
  "endpoint": "/v1/tiktok/profile/videos",
  "schema_version": "2",
  "data": {
    "items": [ /* this page's videos, each { "post": { ... } } */ ],
    "total": null,
    "truncated": null
  },
  "pagination": {
    "next_cursor": "v2c.pvp_XLAfnPv6WqqWVPeenDzzgzIG5pSI…",
    "has_more": true,
    "page_size": 10
  },
  "unavailable": [],
  "credits_used": 10,
  "credits_remaining": 9490,
  "request_id": "req_1a2b3c4d5e6f",
  "cached": false,
  "idempotent_replay": false,
  "charge_reason": "miss",
  "free_call": false
}
```

| Field         | Meaning                                                                                |
| ------------- | -------------------------------------------------------------------------------------- |
| `next_cursor` | Token for the next page. Send it back as `cursor`. `null` on the last page.            |
| `has_more`    | `true` while there are more pages. &#x2A;*This is your stop signal.**                  |
| `page_size`   | How many items this page returned. It reports; it does not control.                    |
| `stopped_at`  | Only when you sent `since` or `stop_at_id`. See [Incremental sync](#incremental-sync). |

Do not use an empty page or a total count to decide you are done. `has_more` is the only reliable signal. `data.total`, when present, is the platform's own total (all comments on a post, for example), not the number of pages left.

The cursor is only in `pagination.next_cursor`. There is no copy inside `data`.

## A round trip [#a-round-trip]

Page 1, no cursor:

```bash title="cURL"
curl "https://api.insightsocial.app/v1/tiktok/profile/videos?handle=khaby.lame" \
  -H "x-api-key: $INSIGHTSOCIAL_API_KEY"
```

The response carries `"pagination": { "next_cursor": "v2c.pvp_XLAf…", "has_more": true, "page_size": 10 }`. Page 2 sends that value back, with the same `handle`:

```bash title="cURL"
curl "https://api.insightsocial.app/v1/tiktok/profile/videos?handle=khaby.lame&cursor=v2c.pvp_XLAf…" \
  -H "x-api-key: $INSIGHTSOCIAL_API_KEY"
```

Repeat until `has_more` is `false`. URL-encode the cursor if your HTTP client does not do it for you.

A cursor is bound to the request that produced it: the same endpoint and the same parameters. Only `limit`, `max_pages`, `dry_run` and `fresh` may change between pages. Change anything else, such as the `handle` or a filter, and the cursor is refused with `CURSOR_INVALID`; start a new walk instead.

## The loop [#the-loop]

<Tabs items="['cURL', 'Python', 'Node.js']">
  <Tab value="cURL">
    ```bash title="cURL"
    #!/usr/bin/env bash
    # Walk every page of a list and print each item as one JSON line. Needs jq.
    url="https://api.insightsocial.app/v1/tiktok/profile/videos"
    cursor=""

    while :; do
      if [ -n "$cursor" ]; then
        page=$(curl -sG "$url" --data-urlencode "handle=khaby.lame" \
          --data-urlencode "cursor=$cursor" -H "x-api-key: $INSIGHTSOCIAL_API_KEY")
      else
        page=$(curl -sG "$url" --data-urlencode "handle=khaby.lame" \
          -H "x-api-key: $INSIGHTSOCIAL_API_KEY")
      fi

      echo "$page" | jq -c '.data.items[]'
      [ "$(echo "$page" | jq -r '.pagination.has_more')" = "true" ] || break
      cursor=$(echo "$page" | jq -r '.pagination.next_cursor')
    done
    ```
  </Tab>

  <Tab value="Python">
    ```python title="Python"
    import os
    import requests

    BASE = "https://api.insightsocial.app/v1"
    HEADERS = {"x-api-key": os.environ["INSIGHTSOCIAL_API_KEY"]}


    def paginate(path, params):
        cursor = None
        while True:
            query = dict(params)
            if cursor:
                query["cursor"] = cursor  # always the parameter named "cursor"
            body = requests.get(f"{BASE}/{path}", params=query, headers=HEADERS).json()
            if not body["success"]:
                raise RuntimeError(f'{body["error"]["type"]}: {body["request_id"]}')

            yield from body["data"]["items"]

            page = body["pagination"]
            if not page["has_more"]:
                break
            cursor = page["next_cursor"]  # send it back unchanged


    for video in paginate("tiktok/profile/videos", {"handle": "khaby.lame"}):
        print(video["post"]["url"])
    ```
  </Tab>

  <Tab value="Node.js">
    ```ts title="Node.js"
    const BASE = "https://api.insightsocial.app/v1";

    async function* paginate(path: string, params: Record<string, string>) {
      let cursor: string | null = null;
      while (true) {
        const url = new URL(`${BASE}/${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.INSIGHTSOCIAL_API_KEY! },
        });
        const body = await res.json();
        if (!body.success) throw new Error(`${body.error.type}: ${body.request_id}`);

        yield* body.data.items;

        if (!body.pagination.has_more) return;
        cursor = body.pagination.next_cursor; // send it back unchanged
      }
    }

    for await (const video of paginate("tiktok/profile/videos", { handle: "khaby.lame" })) {
      console.log(video.post.url);
    }
    ```
  </Tab>
</Tabs>

Three things matter:

1. **Send the cursor back byte for byte, under the name `cursor`, with the same parameters.** Do not trim, decode or re-encode it.
2. **Stop on `has_more: false`**, which is also when `next_cursor` is `null`.
3. **Finish a walk within 24 hours.** An older cursor is refused with `CURSOR_EXPIRED`; start again from page 1.

## Draining a whole list [#draining-a-whole-list]

A full walk is a series of normal calls, so plan for three things.

* **Cost.** Every page is billed as one call to that endpoint. Fifty pages of a 10-credit endpoint cost about 500 credits. Multiply the page count by the price in [Endpoint pricing](/docs/endpoint-pricing) before you start, and cap the number of pages if you only need the most recent items. Re-walking the same pages is charged again, so keep the pages you already have.
* **Limits.** Pages of one list are sequential, since each needs the previous cursor. You can walk several lists in parallel, but one key allows 10 calls in flight and 60 calls per minute. Past that you get `429` (`CONCURRENCY_LIMIT` or `RATE_LIMITED`) with a `Retry-After` header, and nothing is charged.
* **Retries.** On a `429` or a `503`, wait and retry **the same cursor**. Never move past a page you did not read successfully.

```python title="Python"
import time

def get_page(path, query):
    for attempt in range(5):
        res = requests.get(f"{BASE}/{path}", params=query, headers=HEADERS)
        if res.status_code in (429, 503):
            time.sleep(float(res.headers.get("Retry-After", 2 ** attempt)))
            continue  # same query, same cursor
        return res.json()
    raise RuntimeError("gave up after 5 attempts")
```

## Several pages in one call: `max_pages` [#several-pages-in-one-call-max_pages]

Some endpoints take `max_pages` (1 to 5, default 1). The call walks up to that many pages itself and returns the rows from all of them in `data.items`. `pagination.next_cursor` continues from where it stopped, and `has_more` says whether there is more. The walk can stop before `max_pages` when the list runs out.

Each page walked is billed as one call. The walk itself is still one request, so it takes a single slot of your rate limit however many pages it covers. What we hold before the call is the most one page can cost with your parameters, times `max_pages`, and the call never costs more than that. See [Credits](/docs/credits#reserve-the-ceiling-settle-the-actual).

```bash title="cURL"
curl "https://api.insightsocial.app/v1/tiktok/search/top?query=basketball&max_pages=3" \
  -H "x-api-key: $INSIGHTSOCIAL_API_KEY"
```

This holds up to 30 credits (10 × 3) and charges for the pages actually walked. To see the hold before you run it, add `dry_run=1`: the response carries `data.dry_run` with `credits_min` and `credits_max`, and costs nothing.

## Incremental sync [#incremental-sync]

A daily poll only needs what was posted since the last run. Four creator feeds take two parameters that end the walk where your previous poll stopped, so you pay only for the pages that have new posts.

| Platform  | Endpoint                                                           |
| --------- | ------------------------------------------------------------------ |
| TikTok    | `GET /v1/tiktok/profile/videos`                                    |
| Twitter/X | `GET /v1/twitter/user/tweets`                                      |
| YouTube   | `GET /v1/youtube/channel/videos`, `GET /v1/youtube/channel/shorts` |

| Parameter    | Value                                                       | Effect                                                                                                                                                                                                                               |
| ------------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `stop_at_id` | `post.id` or `post.url` of the newest post you already have | The page ends just before that post. It and everything older are left off, no `next_cursor` is returned, and `stopped_at` is `known_id`. If the post is not on this page, the full page comes back with its cursor, so keep walking. |
| `since`      | `YYYY-MM-DD` (midnight UTC) or an ISO 8601 timestamp        | Older posts are left off. The page that reaches one ends the walk, with `stopped_at` set to `since`.                                                                                                                                 |

```bash title="cURL"
curl "https://api.insightsocial.app/v1/tiktok/profile/videos?handle=nasa&since=2026-09-01" \
  -H "x-api-key: $INSIGHTSOCIAL_API_KEY"
```

```json title="Response"
"pagination": {
  "next_cursor": null,
  "has_more": false,
  "page_size": 6,
  "stopped_at": "since"
}
```

| `stopped_at` | Meaning                                                               |
| ------------ | --------------------------------------------------------------------- |
| `known_id`   | The walk reached the post named in `stop_at_id`.                      |
| `since`      | The walk reached a post older than `since`.                           |
| `end`        | The list ran out before either boundary.                              |
| `null`       | No boundary on this page yet. Send `next_cursor` back and keep going. |

Send the same `stop_at_id` or `since` on every page of the walk, and store the newest post you received for the next run.

### Date filters on other lists [#date-filters-on-other-lists]

About eighty more lists of posts and comments take `since` and `until` as filters, in the same formats (`until` includes its whole UTC day), and the feeds above take `until` too. Each endpoint's reference shows whether it has them. On nine of them `since` also ends the walk as above and sorts the list newest first: comments on LinkedIn, TikTok and YouTube posts, LinkedIn company posts, X search, and Reddit search, subreddits and user posts. Elsewhere the list is not in date order, so rows outside the window are left off each page but the walk does not stop: keep following `next_cursor`. A page is charged even when every row on it was filtered out. A row with no date is kept.

<Callout type="info" title="Pinned posts">
  Pinned posts sit out of date order. They never end the walk and are never taken as the stop point, so do not store a pinned post as your newest.
</Callout>

These parameters do not change what a page costs. What they save is the pages you never fetch: if the post you already have shows up on the first page, the walk ends there and that first page is the whole bill.

## Native paging parameters [#native-paging-parameters]

Every endpoint pages with `cursor` and nothing else, with one exception. `/v1/youtube/video/comment/replies` requires `continuationToken`, and its value is not a page token: it is the `id` of a top-level comment from `/v1/youtube/video/comments`, which names the thread to open. Page through that thread's replies with `cursor` like any other list.

A response never hands you a platform page token: the only cursor it carries is `pagination.next_cursor`. Sending `next_cursor` under any other name, such as `continuationToken`, or a cursor from the previous schema (`is.` or `is2.`), is refused with `CURSOR_INVALID` instead of quietly returning page 1 again.

A few search endpoints also take `page`, a page number. It picks the page a walk starts on; it is not a token. Walk on from there with `cursor`.

## Bad or stale cursors [#bad-or-stale-cursors]

A bad cursor is refused before anything is fetched, with `error.param` naming the parameter that carried it. Errors are never charged.

| `error.type`     | Cause                                                                                                                                                                  | What to do                                                                                                  |
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| `CURSOR_INVALID` | The cursor was edited or truncated, was not issued by this API, was sent under a name other than `cursor`, or belongs to a different endpoint or different parameters. | Send `pagination.next_cursor` back unchanged with the original parameters, or start again without a cursor. |
| `CURSOR_EXPIRED` | The cursor is more than 24 hours old.                                                                                                                                  | Start again without a cursor.                                                                               |

```json title="Response"
{
  "success": false,
  "error": {
    "type": "CURSOR_INVALID",
    "message": "This cursor was not issued by this API. Send `pagination.next_cursor` back unchanged. Nothing was charged.",
    "param": "cursor"
  },
  "request_id": "req_a7f5ccf4ce56",
  "credits_used": 0,
  "credits_remaining": null
}
```

## `limit` is not always a page size [#limit-is-not-always-a-page-size]

What `limit` does depends on the endpoint. Read its description on the endpoint page before you rely on it.

* **Page size or row cap.** It trims one page. On `GET /v1/linkedin/search/people`, `limit` takes the top rows of a page and the cursor still moves past the whole page, so the skipped rows do not reappear on the next one.

`pagination.page_size` in the response is a report of what arrived, never a control.

## Every paginated endpoint [#every-paginated-endpoint]

These 102 endpoints return the `pagination` block and take `cursor`. Each page is one call at the price shown; a range means the endpoint is metered. Every price is also on [Endpoint pricing](/docs/endpoint-pricing).

### TikTok [#tiktok]

| Endpoint                                                                            | Credits per call | Also takes            |
| ----------------------------------------------------------------------------------- | ---------------- | --------------------- |
| [`/tiktok/profile/videos`](/docs/api-reference/tiktok/profile-videos)               | 10               | `since`, `stop_at_id` |
| [`/tiktok/post/comments`](/docs/api-reference/tiktok/post-comments)                 | 10–30            | —                     |
| [`/tiktok/video/comment/replies`](/docs/api-reference/tiktok/video-comment-replies) | 10               | —                     |
| [`/tiktok/search`](/docs/api-reference/tiktok/search)                               | 10–370           | `max_pages`           |
| [`/tiktok/search/hashtag`](/docs/api-reference/tiktok/search-hashtag)               | 10               | `max_pages`           |
| [`/tiktok/search/top`](/docs/api-reference/tiktok/search-top)                       | 10               | `max_pages`           |
| [`/tiktok/search/users`](/docs/api-reference/tiktok/search-users)                   | 10–1,310         | —                     |
| [`/tiktok/user/followers`](/docs/api-reference/tiktok/user-followers)               | 10               | —                     |
| [`/tiktok/user/following`](/docs/api-reference/tiktok/user-following)               | 10               | —                     |
| [`/tiktok/song/videos`](/docs/api-reference/tiktok/song-videos)                     | 10               | —                     |
| [`/tiktok/adlibrary/search`](/docs/api-reference/tiktok/adlibrary-search)           | 50–170           | —                     |
| [`/tiktok/collection/videos`](/docs/api-reference/tiktok/collection-videos)         | 10               | —                     |
| [`/tiktok/playlist/videos`](/docs/api-reference/tiktok/playlist-videos)             | 10               | —                     |
| [`/tiktok/user/liked`](/docs/api-reference/tiktok/user-liked)                       | 10               | —                     |
| [`/tiktok/location/posts`](/docs/api-reference/tiktok/location-posts)               | 10               | —                     |
| [`/tiktok/effect/videos`](/docs/api-reference/tiktok/effect-videos)                 | 10               | —                     |
| [`/tiktok/search/music`](/docs/api-reference/tiktok/search-music)                   | 10               | —                     |
| [`/tiktok/profile/full`](/docs/api-reference/tiktok/profile-full)                   | 50               | —                     |

### LinkedIn [#linkedin]

| Endpoint                                                                                                | Credits per call | Also takes |
| ------------------------------------------------------------------------------------------------------- | ---------------- | ---------- |
| [`/linkedin/search/companies`](/docs/api-reference/linkedin/search-companies)                           | 100              | —          |
| [`/linkedin/profile/articles`](/docs/api-reference/linkedin/profile-articles)                           | 50               | —          |
| [`/linkedin/article/comments`](/docs/api-reference/linkedin/article-comments)                           | 50               | —          |
| [`/linkedin/article/reactions`](/docs/api-reference/linkedin/article-reactions)                         | 50               | —          |
| [`/linkedin/profile/interests/schools`](/docs/api-reference/linkedin/profile-interests-schools)         | 50               | —          |
| [`/linkedin/profile/interests/newsletters`](/docs/api-reference/linkedin/profile-interests-newsletters) | 50               | —          |
| [`/linkedin/search/people`](/docs/api-reference/linkedin/search-people)                                 | 100–500          | —          |
| [`/linkedin/company/people`](/docs/api-reference/linkedin/company-people)                               | 100–500          | —          |
| [`/linkedin/post/comments`](/docs/api-reference/linkedin/post-comments)                                 | 50               | —          |
| [`/linkedin/post/reposts`](/docs/api-reference/linkedin/post-reposts)                                   | 50               | —          |
| [`/linkedin/group/posts`](/docs/api-reference/linkedin/group-posts)                                     | 50               | —          |
| [`/linkedin/post/comments/replies`](/docs/api-reference/linkedin/post-comments-replies)                 | 50               | —          |
| [`/linkedin/profile/experiences`](/docs/api-reference/linkedin/profile-experiences)                     | 50               | —          |
| [`/linkedin/profile/educations`](/docs/api-reference/linkedin/profile-educations)                       | 50               | —          |
| [`/linkedin/profile/skills`](/docs/api-reference/linkedin/profile-skills)                               | 50               | —          |
| [`/linkedin/profile/honors`](/docs/api-reference/linkedin/profile-honors)                               | 50               | —          |
| [`/linkedin/profile/certifications`](/docs/api-reference/linkedin/profile-certifications)               | 50               | —          |
| [`/linkedin/profile/publications`](/docs/api-reference/linkedin/profile-publications)                   | 50               | —          |
| [`/linkedin/profile/volunteers`](/docs/api-reference/linkedin/profile-volunteers)                       | 50               | —          |
| [`/linkedin/profile/recommendations`](/docs/api-reference/linkedin/profile-recommendations)             | 50               | —          |
| [`/linkedin/profile/interests/companies`](/docs/api-reference/linkedin/profile-interests-companies)     | 50               | —          |
| [`/linkedin/profile/interests/groups`](/docs/api-reference/linkedin/profile-interests-groups)           | 50               | —          |
| [`/linkedin/post/reactions`](/docs/api-reference/linkedin/post-reactions)                               | 100–500          | —          |
| [`/linkedin/company/jobs`](/docs/api-reference/linkedin/company-jobs)                                   | 100              | —          |
| [`/linkedin/search/jobs`](/docs/api-reference/linkedin/search-jobs)                                     | 100              | —          |
| [`/linkedin/search/schools`](/docs/api-reference/linkedin/search-schools)                               | 10               | —          |
| [`/linkedin/company/posts`](/docs/api-reference/linkedin/company-posts)                                 | 50               | —          |
| [`/linkedin/ads/search`](/docs/api-reference/linkedin/ads-search)                                       | 50               | —          |
| [`/linkedin/profile/posts/archive`](/docs/api-reference/linkedin/profile-posts-archive)                 | 50–5,000         | —          |
| [`/linkedin/search/posts`](/docs/api-reference/linkedin/search-posts)                                   | 10–480           | —          |
| [`/linkedin/profile/full`](/docs/api-reference/linkedin/profile-full)                                   | 50               | —          |

### Twitter/X [#twitterx]

| Endpoint                                                                    | Credits per call | Also takes            |
| --------------------------------------------------------------------------- | ---------------- | --------------------- |
| [`/twitter/user/tweets`](/docs/api-reference/twitter/user-tweets)           | 10               | `since`, `stop_at_id` |
| [`/twitter/search/tweets`](/docs/api-reference/twitter/search-tweets)       | 10–50            | `max_pages`           |
| [`/twitter/tweet/replies`](/docs/api-reference/twitter/tweet-replies)       | 10               | —                     |
| [`/twitter/user/media`](/docs/api-reference/twitter/user-media)             | 10               | —                     |
| [`/twitter/user/followers`](/docs/api-reference/twitter/user-followers)     | 10               | —                     |
| [`/twitter/user/following`](/docs/api-reference/twitter/user-following)     | 10               | —                     |
| [`/twitter/tweet/retweeters`](/docs/api-reference/twitter/tweet-retweeters) | 10               | —                     |
| [`/twitter/search/users`](/docs/api-reference/twitter/search-users)         | 10               | —                     |
| [`/twitter/profile/full`](/docs/api-reference/twitter/profile-full)         | 50               | —                     |

### YouTube [#youtube]

| Endpoint                                                                                  | Credits per call | Also takes            |
| ----------------------------------------------------------------------------------------- | ---------------- | --------------------- |
| [`/youtube/channel/videos`](/docs/api-reference/youtube/channel-videos)                   | 10–20            | `since`, `stop_at_id` |
| [`/youtube/video/comments`](/docs/api-reference/youtube/video-comments)                   | 10               | —                     |
| [`/youtube/video/comment/replies`](/docs/api-reference/youtube/video-comment-replies)     | 10               | —                     |
| [`/youtube/search`](/docs/api-reference/youtube/search)                                   | 10–150           | `max_pages`           |
| [`/youtube/channel/shorts`](/docs/api-reference/youtube/channel-shorts)                   | 10–20            | `since`, `stop_at_id` |
| [`/youtube/playlist`](/docs/api-reference/youtube/playlist)                               | 10–110           | —                     |
| [`/youtube/search/hashtag`](/docs/api-reference/youtube/search-hashtag)                   | 10–110           | `max_pages`           |
| [`/youtube/channel/playlists`](/docs/api-reference/youtube/channel-playlists)             | 10               | —                     |
| [`/youtube/channel/lives`](/docs/api-reference/youtube/channel-lives)                     | 10–70            | —                     |
| [`/youtube/channel/community-posts`](/docs/api-reference/youtube/channel-community-posts) | 10               | —                     |
| [`/youtube/videos/trending`](/docs/api-reference/youtube/videos-trending)                 | 10–60            | —                     |
| [`/youtube/playlist/items`](/docs/api-reference/youtube/playlist-items)                   | 10–110           | —                     |
| [`/youtube/search/advanced`](/docs/api-reference/youtube/search-advanced)                 | 10–110           | `max_pages`           |
| [`/youtube/profile/full`](/docs/api-reference/youtube/profile-full)                       | 50               | —                     |

### Reddit [#reddit]

| Endpoint                                                                    | Credits per call | Also takes  |
| --------------------------------------------------------------------------- | ---------------- | ----------- |
| [`/reddit/subreddit`](/docs/api-reference/reddit/subreddit)                 | 10               | —           |
| [`/reddit/search`](/docs/api-reference/reddit/search)                       | 10–300           | `max_pages` |
| [`/reddit/post/comments`](/docs/api-reference/reddit/post-comments)         | 50               | —           |
| [`/reddit/subreddit/search`](/docs/api-reference/reddit/subreddit-search)   | 10–260           | —           |
| [`/reddit/profile/posts`](/docs/api-reference/reddit/profile-posts)         | 10               | —           |
| [`/reddit/search/comments`](/docs/api-reference/reddit/search-comments)     | 10               | —           |
| [`/reddit/subreddits/search`](/docs/api-reference/reddit/subreddits-search) | 10–260           | —           |
| [`/reddit/search/media`](/docs/api-reference/reddit/search-media)           | 10               | —           |
| [`/reddit/omni-search`](/docs/api-reference/reddit/omni-search)             | 50–90            | —           |

### Pinterest [#pinterest]

| Endpoint                                                    | Credits per call | Also takes |
| ----------------------------------------------------------- | ---------------- | ---------- |
| [`/pinterest/search`](/docs/api-reference/pinterest/search) | 10–260           | —          |
| [`/pinterest/board`](/docs/api-reference/pinterest/board)   | 10–160           | —          |

### Truth Social [#truth-social]

| Endpoint                                                                | Credits per call | Also takes |
| ----------------------------------------------------------------------- | ---------------- | ---------- |
| [`/truthsocial/user/posts`](/docs/api-reference/truthsocial/user-posts) | 10               | —          |

### Snapchat [#snapchat]

| Endpoint                                                                          | Credits per call | Also takes |
| --------------------------------------------------------------------------------- | ---------------- | ---------- |
| [`/snapchat/spotlight/comments`](/docs/api-reference/snapchat/spotlight-comments) | 10               | —          |

### Telegram [#telegram]

| Endpoint                                                                | Credits per call | Also takes |
| ----------------------------------------------------------------------- | ---------------- | ---------- |
| [`/telegram/profile/posts`](/docs/api-reference/telegram/profile-posts) | 10               | —          |

### Rumble [#rumble]

| Endpoint                                                              | Credits per call | Also takes |
| --------------------------------------------------------------------- | ---------------- | ---------- |
| [`/rumble/search`](/docs/api-reference/rumble/search)                 | 10               | —          |
| [`/rumble/channel/videos`](/docs/api-reference/rumble/channel-videos) | 10               | —          |

### Kwai [#kwai]

| Endpoint                                                  | Credits per call | Also takes |
| --------------------------------------------------------- | ---------------- | ---------- |
| [`/kwai/user/posts`](/docs/api-reference/kwai/user-posts) | 10               | —          |

### Douyin [#douyin]

| Endpoint                                                                | Credits per call | Also takes |
| ----------------------------------------------------------------------- | ---------------- | ---------- |
| [`/douyin/comment/replies`](/docs/api-reference/douyin/comment-replies) | 50–2,500         | —          |
| [`/douyin/search/users`](/docs/api-reference/douyin/search-users)       | 50–1,250         | —          |

### Xiaohongshu (RedNote) [#xiaohongshu-rednote]

| Endpoint                                                                      | Credits per call | Also takes |
| ----------------------------------------------------------------------------- | ---------------- | ---------- |
| [`/xiaohongshu/search`](/docs/api-reference/xiaohongshu/search)               | 50–1,000         | —          |
| [`/xiaohongshu/profile/posts`](/docs/api-reference/xiaohongshu/profile-posts) | 50–1,000         | —          |
| [`/xiaohongshu/post/comments`](/docs/api-reference/xiaohongshu/post-comments) | 50–1,000         | —          |

### TikTok Shop [#tiktok-shop]

| Endpoint                                                                        | Credits per call | Also takes |
| ------------------------------------------------------------------------------- | ---------------- | ---------- |
| [`/tiktokshop/product/reviews`](/docs/api-reference/tiktokshop/product-reviews) | 10               | —          |
| [`/tiktokshop/products`](/docs/api-reference/tiktokshop/products)               | 10               | —          |
| [`/tiktokshop/search`](/docs/api-reference/tiktokshop/search)                   | 10               | —          |
| [`/tiktokshop/user/showcase`](/docs/api-reference/tiktokshop/user-showcase)     | 10               | —          |

### Weibo [#weibo]

| Endpoint                                                          | Credits per call | Also takes |
| ----------------------------------------------------------------- | ---------------- | ---------- |
| [`/weibo/user/posts`](/docs/api-reference/weibo/user-posts)       | 10               | —          |
| [`/weibo/post/comments`](/docs/api-reference/weibo/post-comments) | 10               | —          |
| [`/weibo/search`](/docs/api-reference/weibo/search)               | 10               | —          |

### Zhihu [#zhihu]

| Endpoint                                                              | Credits per call | Also takes |
| --------------------------------------------------------------------- | ---------------- | ---------- |
| [`/zhihu/search/articles`](/docs/api-reference/zhihu/search-articles) | 10               | —          |

## See also [#see-also]

<Cards>
  <Card title="Credits" href="/docs/credits">
    How each page is held and charged.
  </Card>

  <Card title="Caching" href="/docs/caching">
    Shared-cache hits and forcing a fresh fetch.
  </Card>

  <Card title="Endpoint pricing" href="/docs/endpoint-pricing">
    The price of every endpoint.
  </Card>

  <Card title="Production checklist" href="/docs/production-checklist">
    Retries, idempotency and rate limits for long walks.
  </Card>
</Cards>

