Skip to main content

Comments to Private Replies

Someone comments "price?" on your Instagram reel. Meta lets you answer that person once, privately, in their DM inbox — a private reply. SendSeven exposes that whole loop: you receive the comment as a webhook, you decide what to do with it, and you send the private reply through the API, through a rule, or through a flow.

Comments are available on Instagram and Facebook Messenger (Page posts) channels.

Someone comments on your post
|
v
comment.received webhook ------> your integration
|
v
Rules evaluated (first match wins)
|
+--------+--------+
| |
v v
Private reply Start a flow
(one message) (multi-step conversation)

Beta access

Comments and private replies are in closed beta. Ask SendSeven support to enable them for your workspace.

Until then, every endpoint on this page answers 403 with error_code: feature_not_enabled, and comment webhooks do not fire.

What you can do

TaskWhere
Receive every new comment as an eventListen for comments
Send a private reply yourselfSend private replies
Answer automatically by keywordAuto-reply rules
Run a multi-step conversationAuto-reply rules → Start a flow

The three rules Meta enforces

These are not SendSeven limits — they come from Instagram and Facebook, and no integration can work around them. Design for them from the start.

1. One private reply per comment, ever

You get exactly one private reply per comment, for the lifetime of that comment. There is no second attempt, no edit and no resend. A second attempt is rejected permanently.

This is why an automation that answers a comment claims it: if a rule or a flow already replied, an agent or an API call cannot reply again.

2. A 7-day window

The private reply must be sent within 7 days of the comment being posted, on both platforms. After that the opportunity is gone permanently.

Every comment.received event carries comment.private_reply_window_expires_at so you can tell whether the window is still open without calling the API.

3. Not available on ad comments

Comments on ads cannot receive a private reply (Facebook). Nothing in Meta's webhook marks a comment as being on an ad — the only way to find out is to try to send, and get the rejection back.

Treat this as a normal outcome, not a bug: log it, mark the comment handled, move on.

These are normal states, not failures

Most comments end up ineligible for a private reply — because one was already sent, because the window closed, or because the comment was on an ad. An integration that treats "cannot reply" as an error will spend its life retrying things that can never succeed. Check the reason and stop.

What a private reply may contain

The two platforms genuinely differ, and SendSeven enforces the difference rather than letting a field be silently dropped by Meta.

ContentInstagramFacebook Messenger
textYesYes
buttons (postback)In testing — up to 3Yes — up to 3
quick_repliesIn testing — up to 13Yes — up to 13
image_urlNoYes

Facebook Messenger private replies accept everything the Send API accepts — Meta states that explicitly.

Instagram is documented neither way. Meta's Instagram private-reply documentation grants nothing beyond text and forbids nothing either. Buttons and quick replies are currently accepted on Instagram as a live test of that silence: we are confirming on real accounts that they actually render and that taps come back. Treat this as provisional — if they do not render, the API will go back to rejecting them with 400 unsupported_content. An image on an Instagram private reply is still rejected outright.

A 201 is not proof it rendered

Meta discards message fields it does not recognise and still returns success. On Instagram, where we have no documented grant to rely on, a successful response means Meta accepted the send — not that the buttons or chips appeared. If interactive content on Instagram private replies is load-bearing for your integration, verify it on a real account before you depend on it.

Interactive content is never in doubt in the follow-up

Once the recipient answers your Instagram private reply, the standard 24-hour messaging window opens and the normal send API accepts buttons and media as usual — documented, on both platforms. If you want certainty today, keep the private reply itself plain and get rich in the reply to their reply.

Details and examples: Send private replies.

Prerequisites per platform

Instagram

The connected Instagram account must have granted the instagram_business_manage_comments permission. This permission is fixed at connect time — it cannot be added to a live connection.

An account connected before comments existed will not have it, and must be reconnected through the OAuth dialog to grant it.

Facebook Messenger

The connected Page must be subscribed to the feed webhook field, which is what delivers Page post comments. This does not require the user to do anything — the subscription can be repaired on the SendSeven side.

Checking which of your channels are ready

GET /api/v1/channels/comment-capabilities

Required scope: channels:read

curl "https://api.sendseven.com/api/v1/channels/comment-capabilities" \
-H "Authorization: Bearer s7_api_a1b2c3d4e5f6789012345678abcdef00"
{
"beta_enabled": true,
"items": [
{
"channel_id": "ch_ig_001",
"channel_type": "instagram",
"channel_name": "Acme Instagram",
"identifier": "acme.shop",
"comments_supported": true,
"can_receive_comments": true,
"reconnect_required": false,
"resubscribe_required": false,
"reason": "ok",
"detail": null,
"missing_scopes": []
},
{
"channel_id": "ch_fb_002",
"channel_type": "messenger",
"channel_name": "Acme Page",
"identifier": "Acme Inc.",
"comments_supported": true,
"can_receive_comments": false,
"reconnect_required": false,
"resubscribe_required": true,
"reason": "feed_not_subscribed",
"detail": "The Page is not subscribed to the feed webhook field.",
"missing_scopes": []
}
]
}
FieldMeaning
beta_enabledWhether your workspace is in the comments beta. Reported separately from the per-channel checks, so "not in the beta" and "in the beta but needs a reconnect" are distinguishable.
comments_supportedWhether the channel type can do comments at all — Instagram and Facebook Messenger only.
can_receive_commentsWhether comment webhooks would actually arrive today.
reconnect_requiredA missing permission — the account owner must walk the OAuth dialog again.
resubscribe_requiredOnly the Page's webhook subscription needs fixing; no user action required.
reasonStable machine code: ok, channel_type_not_supported, channel_inactive, scope_granted_unknown, scope_missing, feed_not_subscribed, subscription_unknown, missing_credentials.
detailHuman-readable explanation of reason. Switch on reason, not on this string.
missing_scopesPermissions that must be granted on reconnect, if any.
Verified-true only

can_receive_comments is true only when the requirement was positively verified. A channel connected before granted permissions were recorded reports false with reason: scope_granted_unknown — never an optimistic guess. The call is read-only; it changes nothing.

Billing

A private reply is a real Instagram or Messenger direct message and is billed exactly like any other outbound message on that channel. This applies equally to replies you send through the API, replies sent by a rule, and messages sent by a flow that a comment started. Inbound comments themselves are free.

A broad rule on a viral post can send a lot of billed messages

A rule scoped to all posts with match mode any comment sends one DM per comment. On a post that takes off, that is one billed message per commenter, and there is currently no cap.

If you automate at that breadth, put a keyword filter on it, scope it to specific posts, or monitor the volume yourself. A catch-all rule is best kept at a low priority as a fallback behind narrower rules.

Next steps