---
title: "Comment received event"
method: POST
path: "comment.received"
tags: ["Webhook Events"]
---

# Comment received event

`POST comment.received` (webhook)

Fired when a new comment is received on a tracked post.

## Payload

- WebhookPayloadComment — Webhook payload for comment received events (Instagram, Facebook, Twitter/X, YouTube, LinkedIn, Bluesky, Reddit)
  - `id` string, required — Stable webhook event ID
  - `event` 'comment.received', required
  - `comment` object, required
    - `id` string, required — Platform comment ID
    - `postId` string, nullable, required — Internal post ID (null for posts not published through Zernio)
    - `platformPostId` string, required — Platform's post ID
    - `platform` 'instagram' | 'facebook' | 'twitter' | 'youtube' | 'linkedin' | 'bluesky' | 'reddit', required
    - `text` string, required — Comment text content
    - `author` object, required
      - `id` string, required — Author's platform ID
      - `username` string
      - `name` string
      - `picture` string, nullable
      - `instagramProfile` object — Instagram only, best-effort. Present ONLY for commenters who have messaged the account before: Meta gates the follow relationship behind messaging consent, and commenting does not grant it. Absent otherwise - treat a missing object as "unknown", never as "not a follower". To check on demand, call GET /v1/accounts/{accountId}/follow-status/{userId}.
        - `isFollower` boolean, nullable — The commenter follows this account.
        - `isFollowing` boolean, nullable — This account follows the commenter.
        - `followerCount` integer, nullable
        - `isVerified` boolean, nullable
    - `createdAt` string, date-time, required
    - `isReply` boolean, required — Whether this is a reply to another comment
    - `parentCommentId` string, nullable, required — Parent comment ID if this is a reply
    - `ad` object — Ad context. Present only when the comment was made on paid content. Instagram: populated from the webhook payload's value.media.ad_id and value.media.ad_title. Facebook: populated via a Graph API lookup of the parent post's promotion_status. Absent for comments on organic posts that are not currently promoted.
      - `id` string — Meta ad ID (Instagram only).
      - `title` string — Ad creative title (Instagram only).
      - `promotionStatus` string — Facebook promotion status returned by Graph API. Common values: "active" (organic post currently boosted), "ineligible" (dark post or ad creative, not promotable because it already is an ad).
    - `attachment` object — Facebook only. Present on graphic-only comments (sticker, GIF, photo) that carry no text. URLs are ephemeral and may expire for Meta platforms (oe= expiry), so fetch promptly. Instagram comments do not support attachments.
      - `type` string, required — Attachment type: sticker, animated_image_share, or photo.
      - `imageUrl` string — Rendered image/preview URL (from attachment.media.image.src).
      - `url` string — Source URL (from attachment.url). For GIFs this is an l.facebook.com redirect.
  - `post` object, required
    - `id` string, nullable, required — Internal post ID (null for posts not published through Zernio)
    - `platformPostId` string, required — Platform's post ID
    - `content` string, nullable, required — Post text, from our synced copy — no platform call is made on the comment path, so null when the post was never synced.
    - `imageUrl` string, nullable, required — Post thumbnail or first media item URL. Platform CDN URLs expire, fetch promptly.
    - `permalink` string, nullable, required — Public URL of the post. Null for posts published through Zernio that were never re-synced.
  - `account` object, required
    - `id` string, required — Social account ID
    - `accountId` string — Social account ID (same as id); canonical field for account filtering.
    - `platform` string, required
    - `username` string, required
  - `timestamp` string, date-time, required — UTC time at which Zernio generated this event (set once when the event payload is built, before delivery is queued). Retries and redeliveries keep the original value, so it reflects the event, not the delivery attempt.

## Acknowledgement `200`

Webhook received successfully

---

[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/revisions/e0cd92070858/schema)
