Send A Message
Endpoint:POST /api/v1/conversations/:id/messages
conversation- the updated conversation,message- the message you just sent, with its currentstatus,conflict-truemeans nothing was sent this time, because the same message had already gone out andmessageis that earlier one. Only private replies returntrue(they are limited to one per comment). Regular sends always returnfalse.
replyToMessageId is stored on our side and comes back as the message’s replyTo, so your inbox can show which message you answered. It is not sent to the platform, so Instagram and Messenger don’t show it as a quoted reply.
If the platform rejects the message, the call returns an error status (see Errors), not a 200. The failed message still stays in the thread with status: "FAILED" and an error, and your webhook gets it as conversation.message.created.
Message Content
A message needs at least one oftext, attachments, or carousel.
Rules of the road:
- Buttons and quick replies need
text(it’s the message the buttons hang under). - A message has either buttons or quick replies, never both.
- A carousel can have
text(sent as its own bubble before the cards), but no buttons, quick replies or attachments next to it. - Instagram doesn’t support
PHONEbuttons. Facebook does. - All URLs must be HTTPS.
- Text and each attachment show up as separate bubbles on the platform, but you get one
messageback.
POSTBACK button, you get a message with platformData.isPostback and postbackPayload. A quick reply tap arrives as a normal message whose text is the quick reply’s label. The payload isn’t exposed on the message, but automations can react to it with a QUICK_REPLY_CLICKED trigger.
React To A Message
Endpoint:POST /api/v1/conversations/:id/messages/:messageId/reaction
reaction is optional and defaults to love. Use "action": "UNREACT" to take it back. Only Instagram supports sending reactions, and only the heart (love): any other reaction value returns 400. Facebook Messenger has no API for it, so there you can only see the reactions people leave.