# How do I get comments on a TikTok video?

TikTok. Checked September 2026.

Call `GET /v1/tiktok/posts/{id}/comments`. Each request returns one page of public comments with the author, text, time, like count, and reply count, plus a cursor for the next page. Pinned comments are marked. For the replies under a comment, call `GET /v1/tiktok/posts/{id}/comments/{commentId}/replies`.

If you start from a video URL, pass it to the fetch endpoint first. It returns the video with its `id`. Short links from the app are expanded for you.

## GET /v1/tiktok/posts/{id}/comments

```bash
curl "https://api.openhandle.dev/v1/tiktok/posts/920100000000000001/comments" \
  -H "Authorization: Bearer $OPENHANDLE_API_KEY"
```

```ts
import { OpenHandle } from '@openhandle/sdk';

const openhandle = new OpenHandle({ apiKey: process.env.OPENHANDLE_API_KEY! });
let page = await openhandle.tiktok.post('920100000000000001').comments.list();

while (true) {
    for (const comment of page.data) console.log(comment.author?.handle, comment.text);
    const next = await page.next();
    if (!next) break;
    page = next;
}
```

200 OK:

```json
{
  "platform": "tiktok",
  "resource": "comment",
  "capturedAt": "2026-09-19T09:12:44Z",
  "source": "live",
  "data": [
    {
      "id": "920200000000000001",
      "postId": "920100000000000001",
      "text": "The loop is satisfyingly synthetic.",
      "createdAt": "2026-08-09T16:30:00Z",
      "isPinned": true,
      "author": { "id": "920000000020", "handle": "soft_signal_tt_test" },
      "metrics": { "likes": 12, "replies": 0 }
    },
    {
      "id": "920200000000000002",
      "postId": "920100000000000001",
      "text": "Safe data, stable result.",
      "createdAt": "2026-08-09T17:30:00Z",
      "isPinned": false,
      "author": { "id": "920000000020", "handle": "soft_signal_tt_test" },
      "metrics": { "likes": 11, "replies": 0 }
    }
  ],
  "meta": { "cursors": { "next": "b3BhcXVlLWN1cnNvcg" } }
}
```

Trimmed to two comments and the fields this question needs. The example video is a Test fixture with 24 comments over several pages, so you can test pagination on a free Test key.

## Why the official TikTok APIs do not do this

The Research API returns comments, for approved academic and non-profit researchers only. The Display API reads only the logged-in account and has no comments endpoint for other people’s videos. For a brand, an agency, or a product that listens to what people say under a video, comments are a public data API job.

## Paging, replies, and pins

- **One page per request.** Pass `meta.cursors.next` back as `cursor`. When it is `null`, you have every comment TikTok shows. Cursors are opaque and bound to this video and freshness.
- **Replies are separate.** A comment with `metrics.replies` above zero has a thread. Read it with the replies endpoint. Nested replies carry `parentId` and `rootCommentId`.
- **Pinned comments come first.** The creator can pin a comment. It is marked `isPinned: true` and sits at the top of the first page. `isLikedByCreator` marks comments the creator hearted.
- **Fresh videos.** A video posted minutes ago often shows no comments for a while. An empty page is an answer, not an error.

## Listen on a schedule

Read the first page of comments on each video you track every hour, store each comment `id`, and skip the ones you have. New comments land at the top under the pins. Store `capturedAt` with each row so a report can show when the comment was seen. Comments TikTok hides or the creator deletes stop appearing on the next read.

## When this does not work

These answers are definitive. Store them, do not retry them.

| Situation | Status | Code |
|---|---|---|
| The video is deleted or never existed | 404 | `POST_NOT_FOUND` |
| The account is private | 403 | `PROFILE_PRIVATE` |
| The cursor came from another video or freshness | 400 | `CURSOR_MISMATCH` |
| The identifier is malformed | 400 | `INVALID_IDENTIFIER` |

```json
{
  "error": {
    "code": "POST_NOT_FOUND",
    "message": "This post was not found.",
    "requestId": "req_01j8…",
    "retryable": false
  }
}
```

A creator can turn comments off. That video answers with an empty page, which bills as an answered request. Every new workspace starts with 100 free live requests, no card needed.

## Related

- [How do I get the view count of a TikTok video?](https://openhandle.dev/questions/how-do-i-get-the-view-count-of-a-tiktok-video): The same video, one request, real numbers.
- [Pagination](https://openhandle.dev/docs/concepts/pagination): Opaque cursors, one page per request, and what CURSOR_MISMATCH means.
- [Social listening use case](https://openhandle.dev/use-cases/social-listening): Comment streams built on scheduled reads.
