Zernio
APIFor you
Zernio
APIFor you
API Reference

Accounts & Ops

Accounts

List ad accountsGETCreate ad accountPOSTUpdate ad account settingsPATCHAd account financesGET

Manager Accounts

Get manager account hierarchyGETInvite a client account to a managerPOSTAccept, decline, cancel or end a manager linkPATCH

Activity

Ad account change / audit logGETList comments on an adGETReply to an ad commentPOSTHide or unhide an ad commentPOSTDelete an ad commentDELETE

Business Assets

Businesses listGETList TikTok Business CentersGETA/B tests and lift studiesGETList Instagram ad identitiesGETList Instagram posts to boostGETList advertisable appsGETGet iOS 14 campaign limitsGETList TikTok ad pixelsGET

Labels

List ad labelsGETCreate a Google Ads labelPOSTUpdate a Google Ads labelPATCHRemove a Google Ads labelDELETEAttach a Google Ads labelPOSTDetach a Google Ads labelDELETE

Extension Assets

List account calloutsGETAdd account calloutsPOSTUpdate account calloutsPUTRemove account calloutDELETEList account sitelinksGETAdd account sitelinksPOSTUpdate account sitelinksPUTRemove account sitelinkDELETEList account snippetsGETAdd account snippetsPOSTUpdate account snippetsPUTRemove account snippetDELETE

Negative Keyword Lists

List negative keyword listsGETCreate a negative keyword listPOSTGet a negative keyword listGETRename a negative keyword listPUTDelete a negative keyword listDELETEReplace negative list keywordsPUT

Custom Conversions

List custom conversionsGETCreate custom conversionPOST

Value Rules

List value rule setsGETCreate a value rule setPOSTRead a value rule setGETReplace a value rule setPUTDelete a value rule setDELETE

Budget Scheduling

List high-demand periodsGETSchedule a budget increasePOST

DSA Compliance

Get ad account DSA defaultsGETGet DSA recommendationsGET

Other

Assign a user to an ad accountPOSTAssign a user to a PagePOSTGet ad account billingGETRead an ad account's campaigns and ad sets liveGETInvite a user to an ad account by emailPOSTList invitations awaiting multi-party approvalGETList user access invitationsGETAd account usersGETBusiness usersGETPage users of a businessGETRemove a user from an ad accountDELETERemove a user from a PageDELETERevoke a user access invitationDELETESet up ad account billing (monthly invoicing)POSTWithdraw an invitation awaiting multi-party approvalDELETE
Dashboard
OverviewPlatformsAPI ReferenceResources
Accounts & Ops

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.


PlatformsMetaTikTok
GET
/v1/ads/{adId}/comments

Authorization

bearerAuth
AuthorizationBearer <token>

API key authentication: send your Zernio API key in the Authorization header, prefixed with Bearer.

In: header

Path Parameters

adId*string

Internal Zernio ad ID or indexed platform ad/post ID.

Query Parameters

placement?string

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"
limit?integer
Range1 <= value <= 100
Default25
since?string

TikTok-only start date. Defaults to 30 days before until. Maximum window is 30 days.

Formatdate
until?string

TikTok-only end date. Defaults to today in UTC.

Formatdate
cursor?string

Pagination 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"  }}
Was this page helpful?

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.