Skip to main content
Send messages into an existing conversation. You can only answer people who wrote to you in the last 24 hours, see the 24-hour rule. To start from a comment instead, use a private reply.

Send A Message

Endpoint: POST /api/v1/conversations/:id/messages
The response has three fields:
  • conversation - the updated conversation,
  • message - the message you just sent, with its current status,
  • conflict - true means nothing was sent this time, because the same message had already gone out and message is that earlier one. Only private replies return true (they are limited to one per comment). Regular sends always return false.
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.
Regular sends are not deduplicated. If a send times out on your side, list the conversation’s messages before retrying, otherwise the customer may get the message twice.
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 of text, 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 PHONE buttons. Facebook does.
  • All URLs must be HTTPS.
  • Text and each attachment show up as separate bubbles on the platform, but you get one message back.
Quick replies:
A button template:
A carousel:
When the participant taps a 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.
Want to attach files you already uploaded to bundle.social instead of public URLs? Use POST /api/v1/automation-rich-messages/conversations/:conversationId, which takes uploadIds. It’s described in Automations.

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.