Inbox
Messenger direct messages, the welcome screen, the persistent menu, comments, Page reviews and inbox webhooks.
Facebook supports DMs, comments and Page reviews.
Direct messages
| Feature | Supported |
|---|---|
| List conversations | |
| Fetch messages | |
| Send text messages | |
| Send attachments | (images, videos, audio, files) |
| Quick replies | (up to 13, Meta quick_replies) |
| Buttons | (up to 3; with message, sent as Meta's button template, text up to 640 characters) |
| Carousels | (generic template, up to 10 elements; imageAspectRatio: "square" for 1:1 card images, default 1.91:1) |
| React to a message | (any emoji) via Add message reaction and Remove message reaction |
| Message tags | (4 types) |
| Archive and unarchive | |
| Message requests | (list and accept) |
| Handover (thread control) |
Reactions a customer adds or removes arrive on the reaction.received webhook.
Pages connected before August 2026 need their webhook subscription refreshed before inbound reactions arrive. Sending is unaffected.
Outside the 24-hour window. Send messagingType: "MESSAGE_TAG" with messageTag set to one of:
CONFIRMED_EVENT_UPDATEPOST_PURCHASE_UPDATEACCOUNT_UPDATEHUMAN_AGENT
A broadcast takes the same tag as message.messageTag and sends it with every recipient message.
Buttons. buttons with message go out as one button-template bubble: the text and up to 3 buttons under it.
The text must be 640 characters or less when buttons are attached. A longer message answers 400 Text must be 640 characters or less when buttons are attached.
This replaced the earlier shape, a one-card template whose title was the text cut at 80 characters.
Message requests
DMs from people the Page has not accepted wait in Meta's Message Requests folder.
GET /v1/inbox/conversations?folder=requests lists them live from Meta (first page only), each item with folder: "requests".
Meta has no accept call. Replying moves a thread into the inbox, which is what Accept a message request does with your accountId and message.
When Meta will not list the folder for the one account asked, the list answers 400 PLATFORM_LIMITATION.
Handover with another app
Meta's handover protocol lets another app on the Page, such as Page Inbox, own a thread. While it does:
- Inbound messages arrive on
message.receivedwithmetadata.standby: true. - No Zernio automation answers them.
- A send answers
409with codenot_thread_owner.details.ownerAppIdnames the owner when Meta reports it.
Change who answers a conversation moves the thread with one of these actions:
pass, withtargetAppId(Page Inbox is263902037430900)take(Meta allows it only to the Page's primary receiver)requestrelease
conversation.control_changed fires when Meta reports a change, with control.ownerAppId naming the new owner.
Welcome screen: greeting, Get Started and ice breakers
The Messenger welcome screen has three settings, each with GET, PUT and DELETE:
| Setting | Endpoint | Limits |
|---|---|---|
| Greeting text | /v1/accounts/{accountId}/messenger-greeting | One entry per locale, one with locale default; text up to 160 characters. Meta fills {{user_first_name}}, {{user_last_name}} and {{user_full_name}}. |
| Get Started button | /v1/accounts/{accountId}/messenger-get-started | One payload. Required before a persistent menu shows. |
| Ice breakers | /v1/accounts/{accountId}/messenger-ice-breakers | Up to 4 questions per locale (80 characters each), one locale default. |
A PUT replaces every locale already set.
A Get Started or ice breaker tap sends a postback that arrives as message.received with metadata.postbackPayload.
A payload of zernio:workflow:<workflowId> starts that workflow. The workflow must be active on this account and profile.
{
"ice_breakers": [
{
"locale": "default",
"call_to_actions": [
{ "question": "Book a table", "payload": "zernio:workflow:5190ac0343606395fce014b0" }
]
}
]
}Persistent menu
The persistent menu shown in Messenger conversations takes at most 3 top-level items and 5 nested items.
Manage it with GET, PUT and DELETE /v1/accounts/{accountId}/messenger-menu (Account settings).
Meta only shows it on a Page that has a Get Started button.
A postback item whose payload is zernio:workflow:<workflowId> starts that workflow when tapped.
Comments
| Feature | Supported |
|---|---|
| List comments on posts | |
| Reply to comments | |
| Delete comments | |
| Like comments | |
| Hide and unhide comments | |
| Send a private reply (DM after a comment) | (text plus up to 13 quick replies or 1 to 3 inline buttons, 7-day window, one per comment) |
Comment-to-DM automations
Keyword-triggered auto-DMs, created with Create comment automation.
A template sends a product card instead of the plain dmMessage. The card has:
- an image
- a title
- a subtitle for the description or price
- up to 3
urlorpostbackbuttons
Up to 10 elements render as a carousel.
Phone buttons are not supported inside a card. The card and dmMessage plus buttons are mutually exclusive.
imageAspectRatio: "square" renders the card images at 1:1 instead of Messenger's default 1.91:1. It is Facebook only: Instagram rejects it with a 400.
The Instagram page has the full field shape. audience rules and the live_comment, story_reply and story_mention triggers are Instagram only.
Comments arrive by webhook. Every 10 minutes, Zernio also reads the latest comments and runs any the webhook missed.
actions.likeComment and actions.hideComment like or hide the matched comment.
ManyChat-style automations covers repeatPolicy, publicReplyPolicy and the other behaviour fields.
Reviews
| Feature | Supported |
|---|---|
| List reviews | |
| Reply to reviews |
Webhooks
Messenger emits every message lifecycle event except unsend:
| Event | When it fires |
|---|---|
message.received | New incoming DM |
message.sent | Outgoing DM is sent |
message.edited | The sender edits a sent message (up to 5 edits per Meta) |
message.delivered | An outgoing DM is delivered |
message.read | The recipient reads an outgoing DM |
Messenger does not expose an incoming-message unsend, so message.deleted never fires for Facebook.
Messages are stored locally. Live messages arrive through webhooks, and on connect Zernio replays the DM history the account already has on Meta.
The webhooks page has the payloads.
The replay covers conversations that began before the account was connected. It takes up to 500 conversations per account and the newest 500 messages per conversation.
It runs in the background, so it can take a while to appear. It fires no webhooks; read it from List inbox conversations.
Replayed messages arrive already read, so they never affect unread counts.