Ad comments
Read the comments on a TikTok ad, Spark Ads included, then reply to, hide or delete them.
Read the comments on a TikTok ad with GET /v1/ads/{adId}/comments, then reply to, hide or delete them. It covers paid video ads and Spark Ads, dark posts included.
Before you start
Comments on organic posts are read and moderated through the inbox instead.
{adId} takes the Zernio _id or TikTok's numeric platformAdId.
Read the comments
TikTok reads comments over a date window rather than all of history. since and until take a YYYY-MM-DD date, at most 30 days apart, and default to the last 30 days.
const { data: thread } = await zernio.adaccounts.getAdComments({
path: { adId: '1790166588666881' },
query: { since: '2026-08-15', until: '2026-09-09', limit: 50 }
});
for (const comment of thread.comments) console.log(comment.id, comment.canReply);Response (200), trimmed:
{
"status": "success",
"comments": [
{
"id": "7412345678901234567",
"message": "Does this come in blue?",
"canReply": true,
"canDelete": false,
"canHide": true
}
],
"pagination": { "hasMore": true, "cursor": "..." },
"meta": { "platform": "tiktok", "adId": "66f0a1b2c3d4e5f6a7b8c9d0", "platformAdId": "1790166588666881", "tiktokItemId": null }
}The response shape matches GET /v1/inbox/comments/{postId}. Page with pagination.cursor and the same limit: the cursor carries the date window, so do not re-send the dates.
TikTok returns replies as separate comments with parentId. Nested reply fetching is not supported.
Reply to a comment
Reply to a first-level comment with POST /v1/ads/{adId}/comments/{commentId}/reply. Replies to replies are rejected.
const { data: reply } = await zernio.adaccounts.replyToAdComment({
path: { adId: '1790166588666881', commentId: '7412345678901234567' },
body: { text: 'Thanks, sending you the specs now.' }
});Response (200):
{ "status": "success", "commentId": "7512345678901234567" }commentId is the new reply. The reply is not idempotent, so do not retry an uncertain response blindly.
Hide or delete a comment
POST /v1/ads/{adId}/comments/{commentId}/hide with { "hidden": true } hides any comment. Send { "hidden": false } to make it public again.
DELETE /v1/ads/{adId}/comments/{commentId} deletes your own comment or reply. Other users' comments can be hidden instead.
curl -X POST "https://zernio.com/api/v1/ads/1790166588666881/comments/7412345678901234567/hide" \
-H "Authorization: Bearer $ZERNIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "hidden": true }'
curl -X DELETE "https://zernio.com/api/v1/ads/1790166588666881/comments/7412345678901234567" \
-H "Authorization: Bearer $ZERNIO_API_KEY"Response (200) to the hide:
{ "status": "success", "commentId": "7412345678901234567", "hidden": true }The moderation routes take the same since and until as the listing, because TikTok looks a comment up inside a window. Pass the window you listed with when you act on a comment near its edge.
How it behaves
Each comment carries three flags:
| Flag | Requires |
|---|---|
canReply | A first-level comment, comment-management permission, a video item ID and a supported identity (TT_USER or CUSTOMIZED_USER) |
canDelete | TikTok's own-comment deletion capability, a video item ID and a supported identity |
canHide | Only the advertiser and comment IDs, so it is true without an identity |
- The flags guide the UI and never block the listing. A direct reply or delete can resolve a missing identity or item ID and succeed after a false flag.
- Listing works from the stored ad group alone.
meta.tiktokItemId: nulldoes not prevent it. - Listing filters each ad-group page to the requested ad, so a page can be empty while
pagination.hasMoreis true. Keep paging. - Before moderating, Zernio checks the comment belongs to the ad. The lookup scans at most 2,000 ad-group comments.
If it fails
| Error | Cause | Fix |
|---|---|---|
400 with code ad_not_commentable | The ad has no ad group | Check the ad in TikTok Ads Manager. |
400 on placement | placement is Meta only | Drop the parameter. |
403 with code feature_not_available | No supported identity, or no own-comment deletion for a delete | Hide the comment instead, or check the ad's identity. |
403 with code insufficient_permissions | TikTok denied ad-detail access or comment management | Grant the permission and reconnect TikTok Ads. |
404 with code ad_not_found | TikTok no longer returns the ad (deleted or archived) | Check the ad in TikTok Ads Manager. |
404 with code resource_not_found | The comment is not on this ad in the date window | Pass the since and until you listed with, or narrow the window. |
502 | TikTok rejected the request or was unavailable | Read platformError for TikTok's code and message. |
Related
- List comments on an ad: every parameter of the listing.
- Reply to an ad comment, hide and delete: the moderation routes.
- TikTok inbox: comments on organic posts.
- Pause or resume: the rest of an ad's lifecycle.