List comments on an ad
Lists the comments on an ad's post, including dark posts that never ran organically, so you can moderate ad engagement.
Useful for moderating or analyzing engagement on dark posts (ad creatives that never went live organically), which the regular GET /v1/inbox/comments/{postId} endpoint cannot serve because dark posts are not in Zernio's post database.
An ad that runs on both Facebook feed and Instagram feed has two separate underlying
posts with separate comment threads (the creative's effective_object_story_id and
effective_instagram_media_id). Use the placement query param to pick one; with no
param the Instagram side is returned when it exists, otherwise Facebook. The
identifiers are read from the ad record (persisted during sync) with a Marketing-API
fallback for ads that predate the field.
Comments can land on extra posts Meta creates for placement variants, which the creative
does not report. On Instagram, every media a comment.received for this ad arrived on is
read too; on Facebook, every dark post matched to this ad by its copy. They are merged
newest first. With more than one post, pagination.cursor is a Zernio cursor covering all
of them: pass it back unchanged.
For Instagram-placed comments, the Instagram account that runs the ad must be connected to Zernio, because those comments are read through that account's token. If no connected Instagram account on the profile can read the ad's media, the call returns ads_connection_required (the Facebook side, if any, is still readable via ?placement=facebook).
TikTok uses the connected TikTok Ads advertiser token and supports both paid video
ads and Spark Ads. since and until select a date window of at most 30 days;
the default is the last 30 days. TikTok searches by ad group, so Zernio filters
each page to this ad. A page can be empty while pagination.hasMore is true.
Reuse pagination.cursor with the same limit; the cursor retains the date window.
placement is Meta-only and returns a 400 for TikTok.
Listing needs no identity or video item ID. When the ad group is stored, each
page makes one comment-list call and no ad-detail lookup, including for external
ads that TikTok no longer returns from ad details. meta.tiktokItemId: null
does not prevent listing. If the ad group is missing, Zernio fetches ad details;
unavailable details return 404 ad_not_found, and no ad group returns 400 ad_not_commentable.
TikTok returns replies as separate comments with parentId; nested reply fetching
is not supported. canReply requires a first-level comment, comment-management
permission, a video item ID and a supported TT_USER or CUSTOMIZED_USER identity.
canDelete requires TikTok's own-comment deletion capability, a video item ID
and a supported identity. Both flags are false when identity or item is unknown.
Listing uses stored and comment-specific fields without fetching identity.
A direct reply or delete request can lazily resolve missing fields and succeed
even after a false flag. canHide is true because visibility changes need only
advertiser and comment IDs. canLike is false. Use the ad comment reply, hide
and delete operations below to moderate TikTok comments.
Other platforms return feature_not_available.
Requires the Ads add-on. Response shape matches GET /v1/inbox/comments/{postId}.
The {adId} path segment accepts any identifier dialect Zernio indexes for the ad:
Zernio internal _id (24-char hex), the numeric platformAdId (the value shipped in
comment.received webhooks as comment.ad.id), or the creative's
effective_object_story_id / effective_instagram_media_id. Caller doesn't need a
translation step.
Authorization
bearerAuth API key authentication: send your Zernio API key in the Authorization header, prefixed with Bearer.
In: header
Path Parameters
Internal Zernio ad ID or indexed platform ad/post ID.
Query Parameters
Which side of the ad to return comments for. Omit to default to the Instagram side when present, else Facebook. Returns ad_not_commentable if the ad has no such placement.
Value in
- "facebook"
- "instagram"
1 <= value <= 10025TikTok-only start date. Defaults to 30 days before until. Maximum window is 30 days.
dateTikTok-only end date. Defaults to today in UTC.
datePagination cursor from a previous response.
Response Body
application/json
application/json
application/json
import Zernio from '@zernio/node';const zernio = new Zernio({ apiKey: process.env.ZERNIO_API_KEY });const { data } = await zernio.adaccounts.getAdComments({ path: { adId: 'ad_abc123', },});console.log(data);{ "status": "success", "comments": [ { "id": "7512345678901234567", "message": "Can you share more details?", "createdTime": "2026-09-08T10:00:00.000Z", "from": { "id": "6123456789123456789", "name": "reader", "username": "reader", "picture": "https://example.com/avatar.jpg", "isOwner": false }, "likeCount": 4, "replyCount": 0, "platform": "tiktok", "url": null, "replies": [], "isHidden": false, "canReply": false, "canDelete": false, "canHide": true, "canLike": false, "isLiked": false } ], "pagination": { "hasMore": false }, "meta": { "platform": "tiktok", "adId": "507f1f77bcf86cd799439011", "platformAdId": "1790166588666881", "accountId": "507f1f77bcf86cd799439012", "tiktokItemId": null, "since": "2026-08-10", "until": "2026-09-09", "lastUpdated": "2026-09-09T12:00:00.000Z" }}Ad account change / audit log
Shows who changed what in an ad account and when, as an audit log of edits to campaigns, ad sets and ads. **Google**: reads the customer's `change_event` history, newest first. Google keeps 30 days of it, so `since` defaults to 29 days ago and an older `since` returns 400; `until` defaults to today. Each change is mapped onto the Meta row shape: `event_type` = resource_change_operation (CREATE, UPDATE, REMOVE), `event_time` = change_date_time, `actor_name` = user_email, `object_type` = change_resource_type, `object_id` = the last numeric id of `object_resource_name`, `application_name` = client_type, `changed_fields` (array), and `extra_data` = a JSON string `{ old, new }` with Google's old and new resource. Pass `paging.after` back as `after` for the next page; it is null when nothing older is left. A page never splits a change batch (the changes of one request share an `event_time`), so a page can hold fewer rows than `limit` while more follow, or more when one batch is larger than `limit`. `adAccountId` is the numeric customer id. **Meta**: Account-level audit log from Meta's `/act_X/activities`: who changed what and when (creates, edits, status flips, budget changes...) with Meta's translated event names and the structured before/after in `extra_data`. Rows are returned verbatim. Meta has no server-side per-object filter on this edge, so `objectId` filters the returned page client-side (combine with paging to walk history for one campaign/ad set/ad).
Reply to an ad comment
Reply to a first-level TikTok ad comment. Requires a TT_USER or CUSTOMIZED_USER identity with comment-management permission. Replies to replies are rejected. The response commentId identifies the new reply. This operation is not idempotent; do not blindly retry an uncertain response. Unknown identity and video item fields are resolved only when needed for this action, then persisted for reuse. Comment-specific fields take precedence. If TikTok no longer returns the ad needed to resolve identity, 404 ad_not_found directs you to check deletion or archival in TikTok Ads Manager. Listing can still succeed. Unsupported or unavailable identity returns 403 feature_not_available. Denied access to ad details returns 403 insufficient_permissions with reconnect guidance and the upstream platformError. Requires Ads access. The ad is resolved within the caller's accessible profiles. Before moderation, Zernio verifies that the comment belongs to this ad using TikTok's ad-group comment listing. The default search window is the last 30 days. Use since/until for older comments, with at most 30 days between the dates. Lookups scan at most 2,000 ad-group comments; narrow the date window if exceeded. Meta returns 501 feature_not_available with guidance to use the existing inbox comment endpoints and the account/post IDs from GET /v1/ads/{adId}/comments.