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
| Task | Where |
|---|---|
| Receive every new comment as an event | Listen for comments |
| Send a private reply yourself | Send private replies |
| Answer automatically by keyword | Auto-reply rules |
| Run a multi-step conversation | Auto-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.
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.
| Content | Facebook Messenger | |
|---|---|---|
text | Yes | Yes |
buttons (postback) | In testing — up to 3 | Yes — up to 3 |
quick_replies | In testing — up to 13 | Yes — up to 13 |
image_url | No | Yes |
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.
201 is not proof it renderedMeta 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.
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": []
}
]
}
| Field | Meaning |
|---|---|
beta_enabled | Whether 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_supported | Whether the channel type can do comments at all — Instagram and Facebook Messenger only. |
can_receive_comments | Whether comment webhooks would actually arrive today. |
reconnect_required | A missing permission — the account owner must walk the OAuth dialog again. |
resubscribe_required | Only the Page's webhook subscription needs fixing; no user action required. |
reason | Stable machine code: ok, channel_type_not_supported, channel_inactive, scope_granted_unknown, scope_missing, feed_not_subscribed, subscription_unknown, missing_credentials. |
detail | Human-readable explanation of reason. Switch on reason, not on this string. |
missing_scopes | Permissions that must be granted on reconnect, if any. |
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 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
- Listen for comments — the
comment.receivedwebhook - Send private replies — the manual send API, buttons, and every error code
- Auto-reply rules — keyword rules, per-post messages, and flow hand-off