---
title: "List comments on an ad"
method: GET
path: "/v1/ads/{adId}/comments"
tags: ["Ad Accounts"]
---

# List comments on an ad

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

Returns comments on an ad's underlying creative post. 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.

For Instagram-placed comments, the Instagram account that runs the ad must be connected
to Zernio — 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).

Meta-only. Other ad platforms (TikTok, LinkedIn, Pinterest, Google, X) do not
expose a public per-ad comments API and 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), Meta's 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.

## Path parameters

- `adId` string, required

## Query parameters

- `placement` 'facebook' | 'instagram'
- `limit` integer
- `cursor` string

## Response `200`

Comments on the ad

- object
  - `status` 'success', required
  - `comments` object[], required
  - `pagination` object, required
    - `hasMore` boolean
    - `cursor` string
  - `meta` object, required
    - `platform` 'facebook' | 'instagram', required — Which side these comments are on (same as `placement`).
    - `placement` 'facebook' | 'instagram', required — The placement these comments are for — useful when you didn't pass ?placement= and want to know which one you got.
    - `adId` string, required — Internal Zernio ad ID.
    - `platformAdId` string, required — Meta ad ID.
    - `effectiveStoryId` string, required — Underlying post ID the comments belong to. effective_object_story_id for the Facebook side, effective_instagram_media_id for the Instagram side.
    - `facebookAccountId` string, nullable — Facebook-only. The connected Facebook Page SocialAccount these comments were read through — pass it as `accountId` (with `effectiveStoryId` as the postId) to /v1/inbox/comments to reply/hide/delete. Null when no connected Page was used (then moderation isn't possible).
    - `instagramUserId` string — Instagram-only. The Instagram-scoped business ID that owns the boosted media (creative.instagram_user_id).
    - `instagramPermalink` string — Instagram-only. Public permalink of the boosted IG post (creative.instagram_permalink_url).
    - `instagramAccountId` string — Instagram-only. The connected Instagram SocialAccount these comments were read through — pass it as `accountId` (with `effectiveStoryId` as the postId) to /v1/inbox/comments to reply/hide/delete.
    - `accountId` string, required — Social account ID (ads SocialAccount).
    - `lastUpdated` string, date-time, required

## Other responses

- `400` — Invalid ad ID format, or the ad's creative format does not expose a commentable underlying post (code ad_not_commentable).
- `401` — Unauthorized
- `403` — Ads access required (legacy plans need the Ads add-on; included by default on usage-based plans), or ad platform is not Meta (code feature_not_available).
- `404` — Resource not found
- `422` — Ads account token unavailable, or (for Instagram-placed ads) no connected Instagram account on the profile can read the ad's media (code ads_connection_required).

---

[API](https://skmtc.net/zernio/apis/zernio-api.md) · [All operations](https://skmtc.net/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/zernio/zernio-api/versions/51932b099b2f/schema)
