# List comments

> An account's recent posts and the comments on one of them.

Canonical: <https://www.tryadeli.com/docs/api/comments/list-comments>

`GET https://app.tryadeli.com/api/v1/comments`

Authorization: `Bearer <API key>` — see [Authentication](https://www.tryadeli.com/docs/authentication)

Returns the account's recent posts and the comments on one of them — the post
named by `postId`, or the newest post when it is omitted. Replies are returned
alongside top-level comments and carry `parentId`. Comments are newest first.

`posts` holds the account's newest 25 posts on Instagram and Facebook, and its
newest 20 on TikTok, and its newest 25 videos on YouTube. `postId` may name an
older post of the account's too.

YouTube sends no notice of new comments. While you keep reading a channel's
comments, Adeli checks the channel's newest comments across every video at most
every two minutes, and re-reads only the videos that have new ones.

The first time a post is read, Adeli fetches its newest comments from the
platform while you wait and the rest in the background, so that response has
`complete: false`. Read again a few seconds later for the remainder.

**Query parameters**

| Name        | Type                                                 | Required | Description                                                                       |
| ----------- | ---------------------------------------------------- | -------- | --------------------------------------------------------------------------------- |
| `platform`  | `"instagram" \| "facebook" \| "tiktok" \| "youtube"` | Yes      |                                                                                   |
| `accountId` | `uuid`                                               | Yes      | A connected account on that platform.                                             |
| `profileId` | `uuid`                                               |          | Optional, because accountId names its profile. If you pass both, they must agree. |
| `postId`    | `string`                                             |          | One of the account's posts. Defaults to the newest.                               |
| `cursor`    | `string`                                             |          | TikTok and YouTube only: the `nextCursor` of the previous page.                   |

**Comment fields**

| Name         | Type             | Required | Description                                                                                                                                                                  |
| ------------ | ---------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `isCreator`  | `boolean`        |          | Written by the connected account itself.                                                                                                                                     |
| `isHidden`   | `boolean`        |          | Hidden from everyone but its author. On YouTube, held for review or flagged as likely spam: visible only to the channel.                                                     |
| `liked`      | `boolean`        |          | TikTok only: the connected account has liked it.                                                                                                                             |
| `deletable`  | `boolean`        |          | TikTok and YouTube: false for comments TikTok will not delete. Always true on YouTube, where any comment can be removed.                                                     |
| `replyCount` | `number`         |          | TikTok and YouTube: how many replies the platform reports for the comment, which can exceed the replies returned so far.                                                     |
| `nextCursor` | `string \| null` |          | TikTok and YouTube: pass as cursor for the next page of comments, fetched live from the platform. Null once every thread is held, and always null on Instagram and Facebook. |
| `complete`   | `boolean`        |          | Whether every top-level comment on the post is held. False on a post's first read, and on a TikTok post Adeli has read only the newest page of.                              |
| `syncedAt`   | `string \| null` |          | When these comments were last refreshed from the platform.                                                                                                                   |

On TikTok each page holds up to 30 top-level comments. TikTok returns three
replies per thread inline; Adeli fetches the rest of a few threads with each
background refresh, so `replyCount` can briefly exceed the replies returned. A
`cursor` request is the exception to reading from Adeli's copy: it is fetched
from TikTok while you wait, and returns that page alone.

On YouTube each page holds up to 100 top-level comments, and YouTube returns up
to five replies per thread inline. `cursor` works the same way as on TikTok.

**Errors** — `401 unauthorized`, `400 invalid_request`, `404 account_not_found`,
`404 post_not_found`, `404 profile_not_found`, `409 page_not_selected`,
`422 connection_expired`, `422 not_supported`, `429 rate_limited`,
`429 quota_exhausted`, `502 provider_error`.

## Request examples

**cURL**

```bash
curl --fail-with-body "https://app.tryadeli.com/api/v1/comments?platform=tiktok&accountId=00000000-0000-0000-0000-000000000000&postId=7300000000000000000" \
  -H "Authorization: Bearer $ADELI_API_KEY"
```

**JavaScript**

```javascript
const response = await fetch("https://app.tryadeli.com/api/v1/comments?platform=tiktok&accountId=00000000-0000-0000-0000-000000000000&postId=7300000000000000000", {
  headers: {
    Authorization: `Bearer ${process.env.ADELI_API_KEY}`,
  },
});
console.log(await response.json());
```

**Python**

```python
import os

import requests

response = requests.get(
    "https://app.tryadeli.com/api/v1/comments",
    headers={"Authorization": f"Bearer {os.environ['ADELI_API_KEY']}"},
    params={
        "platform": "tiktok",
        "accountId": "00000000-0000-0000-0000-000000000000",
        "postId": "7300000000000000000",
    },
)
print(response.json())
```

## Responses

### 200

```json
{
  "platform": "tiktok",
  "accountId": "00000000-0000-0000-0000-000000000000",
  "profileId": "00000000-0000-4000-8000-000000000001",
  "postId": "7300000000000000000",
  "posts": [
    { "id": "7300000000000000000", "caption": "Backyard birds", "thumbnailUrl": "https://...", "permalink": "https://www.tiktok.com/@creator/video/7300000000000000000", "publishedAt": "2026-09-30T12:00:00.000Z", "commentsCount": 2 }
  ],
  "comments": [
    {
      "id": "7301000000000000001",
      "mediaId": "7300000000000000000",
      "parentId": null,
      "authorName": "Bird Fan",
      "authorFullName": "Bird Fan",
      "authorHandle": "birdfan",
      "avatarUrl": "https://...",
      "profileUrl": "https://www.tiktok.com/@birdfan",
      "body": "What a cardinal!",
      "likeCount": 3,
      "isCreator": false,
      "isHidden": false,
      "createdAt": "2026-09-30T13:00:00.000Z",
      "liked": false,
      "deletable": false
    },
    {
      "id": "7301000000000000002",
      "mediaId": "7300000000000000000",
      "parentId": "7301000000000000001",
      "authorName": "Creator",
      "authorFullName": "Creator",
      "authorHandle": "creator",
      "avatarUrl": null,
      "profileUrl": "https://www.tiktok.com/@creator",
      "body": "Thank you!",
      "likeCount": 0,
      "isCreator": true,
      "isHidden": false,
      "createdAt": "2026-09-30T13:05:00.000Z",
      "liked": false,
      "deletable": true
    }
  ],
  "nextCursor": "30",
  "complete": false,
  "syncedAt": "2026-09-30T13:06:00.000Z"
}
```

### 404

```json
{
  "error": {
    "code": "post_not_found",
    "message": "Post not found on this account"
  }
}
```
