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:

InstagramFacebookTikTokYouTube
List comments and repliesYesYesYes, paged with cursorYes, paged with cursor
Reply to a commentYesYesYesYes
Comment on the account's own postNoYesYesYes
Hide and unhideYesYesYesYes, by holding for review
Like and unlikeNoNoYesNo
DeleteAny comment on the account's postsAny comment on the Page's postsOnly comments the account wroteThe 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"Required
accountIduuidRequired
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 nextCursor of 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"
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"
}

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"Required
accountIduuidRequired
profileIduuid
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.
bash
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"Required
accountIduuidRequired
profileIduuid
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"Required
accountIduuidRequired
profileIduuid
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.