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).
Authorization
bearerAuth API key authentication: send your Zernio API key in the Authorization header, prefixed with Bearer.
In: header
Query Parameters
Zernio SocialAccount id (posting or ads variant) used to resolve the Meta token.
Meta ad account id (act_), or the Google customer id (digits only).
Start of range (YYYY-MM-DD). Google: at most 29 days ago, the default.
dateEnd of range (YYYY-MM-DD).
dateClient-side filter to one object id (campaign, ad set / ad group or ad).
Rows per page
1 <= value <= 20050Cursor from paging.after of the previous page.
Response Body
application/json
application/json
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.getAdsActivityLog({ query: { accountId: 'account_abc123', adAccountId: 'adaccount_abc123', },});console.log(data);{ "adAccountId": "string", "data": [ {} ], "paging": { "after": "string" }}Accept, decline, cancel or end a manager link
Accepts, declines or cancels a Google Ads manager invitation, or ends an existing manager-client link. Changes one manager-client link, identified by `managerCustomerId`, `clientCustomerId` and `managerLinkId` (all from GET /v1/ads/accounts/hierarchy). `accept` and `decline` answer a pending invitation as the client (CustomerManagerLinkService), so the connection's Google user needs direct access to the client account; access through a manager is not enough, because the link does not exist yet. `cancel` withdraws a pending invitation and `unlink` ends an active link, both as the manager (CustomerClientLinkService). Send `validateOnly: true` to have Google check the change without applying it.
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.