Comments
Moderate the comments on your customer's own posts: read them, reply, hide the ones that should not be seen, and delete.
Reads come from Adeli's copy; writes go to the platform. Adeli keeps each
connected account's recent posts and their comments, so listing comments
answers immediately instead of waiting on the platform. The copy is refreshed
from the platform in the background whenever it is read and is more than a
minute old (ten minutes on YouTube, whose quota is shared by every Adeli
customer), and Adeli updates it as soon as you reply, hide, like, or delete
through this API. Every response says when its comments were last refreshed
(syncedAt) and whether every thread is held yet (complete). Changes made
outside Adeli, such as a comment hidden in the Instagram app, appear after the
next refresh.
The four platforms do not allow the same things:
| TikTok | YouTube | |||
|---|---|---|---|---|
| List comments and replies | Yes | Yes | Yes, paged with cursor | Yes, paged with cursor |
| Reply to a comment | Yes | Yes | Yes | Yes |
| Comment on the account's own post | No | Yes | Yes | Yes |
| Hide and unhide | Yes | Yes | Yes | Yes, by holding for review |
| Like and unlike | No | No | Yes | No |
| Delete | Any comment on the account's posts | Any comment on the Page's posts | Only comments the account wrote | The channel's own; anyone else's is rejected, optionally banning its author |
Comment ids and post ids are the provider's own: numeric strings everywhere but
YouTube, whose ids are URL-safe base64 (a reply's is {parent}.{reply}). Post ids
come from GET /api/v1/posts (providerId), or from the
posts this endpoint returns.
GET/api/v1/commentsList comments
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
platform"instagram" | "facebook" | "tiktok" | "youtube"RequiredaccountIduuidRequired- A connected account on that platform.
profileIduuid- Defaults to your key's profile.
postIdstring- One of the account's posts. Defaults to the newest.
cursorstring- TikTok and YouTube only: the
nextCursorof the previous page.
curl --fail-with-body \
"$ADELI_URL/api/v1/comments?platform=tiktok&accountId=$ACCOUNT_ID&postId=7300000000000000000" \
-H "Authorization: Bearer $ADELI_API_KEY"{
"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"
}Comment fields
isCreatorboolean- Written by the connected account itself.
isHiddenboolean- Hidden from everyone but its author. On YouTube, held for review or flagged as likely spam: visible only to the channel.
likedboolean- TikTok only: the connected account has liked it.
deletableboolean- TikTok and YouTube: false for comments TikTok will not delete. Always true on YouTube, where any comment can be removed.
replyCountnumber- TikTok and YouTube: how many replies the platform reports for the comment, which can exceed the replies returned so far.
nextCursorstring | 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.
completeboolean- 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.
syncedAtstring | 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.
POST/api/v1/commentsReply or comment
Send parentId to reply to a comment, or postId alone to comment on one of
the account's own posts. Instagram supports replies only. TikTok and YouTube
need postId for a reply too. Comments are public as soon as the provider accepts them.
Body
platform"instagram" | "facebook" | "tiktok" | "youtube"RequiredaccountIduuidRequiredprofileIduuid- Defaults to your key's profile.
postIdstring- The post. Required for a top-level comment, and for any TikTok or YouTube comment.
parentIdstring- The comment being replied to. Required on Instagram.
messagestringRequired- Up to 2,200 characters on Instagram, 1,200 on TikTok, 8,000 on Facebook, 10,000 on YouTube.
curl --fail-with-body -X POST "$ADELI_URL/api/v1/comments" \
-H "Authorization: Bearer $ADELI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platform": "tiktok",
"accountId": "'"$ACCOUNT_ID"'",
"postId": "7300000000000000000",
"parentId": "7301000000000000001",
"message": "Thank you!"
}'Returns 201 with { platform, accountId, profileId, comment }. On TikTok and
YouTube comment is the full comment in the shape above; Instagram and Facebook return
the new comment's id.
Errors — 401 unauthorized, 400 invalid_request, 404 account_not_found,
409 page_not_selected, 422 connection_expired, 429 rate_limited,
429 quota_exhausted, 502 provider_error.
PATCH/api/v1/comments/{commentId}Hide or like a comment
Body
platform"instagram" | "facebook" | "tiktok" | "youtube"RequiredaccountIduuidRequiredprofileIduuid- Defaults to your key's profile.
hiddenboolean- Hide (true) or unhide (false).
likedboolean- TikTok only. Like (true) or unlike (false).
postIdstring- TikTok only, required with hidden: the post the comment is on.
On YouTube, hidden: true holds the comment for review, where only the channel
sees it, and hidden: false publishes it again. liked returns
422 not_supported on every platform but TikTok.
Send at least one of hidden and liked. Returns 200 with the new state:
{ platform, accountId, profileId, comment: { id, hidden?, liked? } }.
Errors — 401 unauthorized, 400 invalid_request, 404 account_not_found,
422 connection_expired, 422 not_supported, 429 rate_limited,
502 provider_error.
DELETE/api/v1/comments/{commentId}Delete a comment
Query parameters
platform"instagram" | "facebook" | "tiktok" | "youtube"RequiredaccountIduuidRequiredprofileIduuid- Defaults to your key's profile.
banAuthor"true" | "false"- YouTube only: also hide the author's future comments on the channel, when the comment is someone else's.
Returns 204. Deleting cannot be undone.
TikTok deletes only your own comments
On TikTok the account can delete only comments it wrote; anything else is
422 comment_not_owned. Hide other people's comments instead — a hidden
comment is visible only to its author.
YouTube rejects other people's comments
On YouTube the channel's own comments are deleted. Anyone else's is rejected,
which removes it for good — it cannot be published again — and, with
banAuthor=true, also bans its author from commenting on the channel.
Errors — 401 unauthorized, 400 invalid_request, 404 account_not_found,
422 comment_not_owned, 422 connection_expired, 429 rate_limited,
502 provider_error.
Permissions
Comment management needs a permission that connections made before it was
requested may lack. A read or write against such a connection returns
422 connection_expired; reconnecting the account and
approving the permission fixes it. On TikTok, reading needs comment.list and
writing needs comment.list.manage. On YouTube, both need
youtube.force-ssl, which every YouTube connection holds.
YouTube quota
YouTube's API quota belongs to Adeli's Google Cloud project and is shared by
every connected channel: 10,000 units a day by default, reset at midnight
Pacific. A read costs 1 unit; every reply, comment, hide, and delete costs 50.
Once the day's quota is spent, YouTube calls return 429 quota_exhausted with
the reset time, and reads keep answering from Adeli's copy.