Messages
Read Instagram or Facebook conversations and send permitted private replies using existing recipient IDs.
Blotato allows you to read and send direct messages on your Instagram account and Facebook Page. Twitter/X, TikTok, LinkedIn, Pinterest, Threads, Bluesky, and YouTube are not supported at this time. Five endpoints let you list conversations, read a conversation, list messages, read a message, and send a message:
List Conversations —
GET /v2/conversationsGet Conversation —
GET /v2/conversations/:conversationIdList Messages —
GET /v2/messagesGet Message —
GET /v2/messages/:messageIdSend Message —
POST /v2/messages
Messages are available on all paid plans.
To manage Instagram and Facebook conversations in the Blotato web app, see Comments and Messaging Inbox.
To send automatic replies after a comment or incoming message, use DM Automations. You manage these automations in the web app or through an AI tool connected to Blotato MCP.
Each message has a direction:
Incoming messages your contacts send you. These have
direction: "incoming".Outgoing messages you send through Blotato. These have
direction: "outgoing".
You reply to people who already have a conversation with you. You send to a recipientId taken from an existing conversation or an incoming message, not to an arbitrary user. The social platform limits who you can message and when. See Messaging Windows.
Blotato retains messages for up to 45 days. Messages older than 45 days are not available through these endpoints.
Before You Start
Blotato must have permissions to read and send messages on your account before you can use the Blotato messaging endpoints.
If you connected your account before messaging launched, reconnect it so Blotato has the new permission.
For Instagram, see Connect Instagram.
For Facebook, see Connect Facebook.
List Conversations
Endpoint
Base URL: https://backend.blotato.com/v2
URL: /conversations
Method: GET
Description
Returns your conversations across connected accounts, ordered by most recent activity. Use cursor-based pagination and the optional filters below.
Query Parameters
limit
integer
No
Maximum conversations to return (1-250). Default 50.
cursor
string
No
Cursor from a previous response. Pass it to fetch the next page.
platform
string
No
Filter by platform. Values: instagram, facebook.
accountId
string
No
Filter to a single connected account.
Response
Status Code: 200 OK
cursor
string
Cursor for the next page. Absent when there are no more conversations.
Get Conversation
Endpoint
URL: /conversations/:conversationId
Method: GET
Description
Fetches a single conversation by its Blotato ID.
Path Parameters
conversationId
string
Yes
Blotato ID of the conversation.
Response
Status Code: 200 OK
Returns a Conversation Object.
List Messages
Endpoint
URL: /messages
Method: GET
Description
Returns your messages across connected accounts, ordered by creation time (most recent first). Use cursor-based pagination and the optional filters below.
Query Parameters
limit
integer
No
Maximum messages to return (1-250). Default 50.
cursor
string
No
Cursor from a previous response. Pass it to fetch the next page.
conversationId
string
No
Filter to messages in a single conversation.
platform
array
No
Filter by platform. Values: instagram, facebook.
accountId
string
No
Filter to a single connected account.
Response
Status Code: 200 OK
cursor
string
Cursor for the next page. Absent when there are no more messages.
Get Message
Endpoint
URL: /messages/:messageId
Method: GET
Description
Fetches a single message by its Blotato ID. Poll this after Send Message to check whether an outgoing message reached sent or failed.
Path Parameters
messageId
string
Yes
Blotato ID of the message.
Response
Status Code: 200 OK
Returns a Message Object.
Send Message
Endpoint
URL: /messages
Method: POST
Description
Sends a direct message to one recipient. Blotato queues the message and sends it in the background, so the response returns status queued. Poll Get Message with the returned id to confirm the message reached sent or failed.
Send to a recipientId taken from an existing conversation or an incoming message. The social platform limits who you can message and when. See Messaging Windows.
Request Body
accountId
string
Yes
Blotato ID of the connected account the message is sent from.
recipientId
string
Yes
Social platform (e.g. Instagram) ID of the recipient. Get it from an existing conversation or incoming message.
text
string
Yes
Plain-text message body. Instagram messages are limited to 1000 bytes, Facebook to 2000 characters. With buttons attached, the limit drops to 640 characters. See Buttons and Quick Replies.
Target
targetType
string
Yes
Value: instagram or facebook.
pageId
string
For Facebook
ID of the Facebook Page to send from, from subaccounts. Required when targetType is facebook.
commentId
string
No
Blotato comment ID. When set, Blotato delivers the message as a private reply to that comment instead of a direct message.
attachment
object
No
Up to 3 call-to-action buttons pinned under the message. See Buttons and Quick Replies.
quickReplies
array
No
Up to 13 tappable reply chips shown under the message. See Buttons and Quick Replies.
responseType
string
No
How the message fits the platform's messaging window: RESPONSE, UPDATE, or MESSAGE_TAG. Default RESPONSE. See Messaging Windows.
tag
string
No
Required when responseType is MESSAGE_TAG (e.g. HUMAN_AGENT).
Buttons and Quick Replies
Facebook and Instagram support buttons and quick replies in direct messages. Set target.attachment for buttons, or target.quickReplies for chips. The two are mutually exclusive: a request carrying both is rejected with 422.
For any platform-applied limitations, see:
Buttons
Buttons sit under the message and stay there. Up to 3 buttons are supported.
Instagram Limitation: Instagram only renders buttons in the Instagram mobile app. A recipient reading the conversation on instagram.com in a desktop browser sees the message text with no buttons.
Send an attachment or a URL inside text, not both. A message carrying both leaves the URL in text unclickable on desktop, so a desktop recipient ends up with no working link. For a primarily desktop audience, drop the attachment and put the URL in text.
type
string
Yes
Value: button.
buttons
array
Yes
1 to 3 buttons.
Each button has:
type
string
Yes
web_url opens a link. postback reports the tap back to you.
title
string
Yes
Button label, 1 to 20 characters.
url
string
For web_url
Link the button opens. Starts with https://.
payload
string
For postback
Value echoed back on tap, 1 to 1000 characters.
With buttons set, text is required and limited to 640 characters.
Quick Replies
Quick replies are tappable chips offered as canned answers. They disappear once the person taps one or types their own message. Pass 1 to 13.
title
string
Yes
Chip label, 1 to 20 characters.
payload
string
Yes
Value echoed back on tap, 1 to 1000 characters.
Quick replies require non-empty message text.
Reading a Tap
A quick-reply tap and a postback tap both arrive as the next incoming message carrying payload.selection, but they reach you differently.
Quick replies send a real text message. text holds the chip label, adn Blotato attaches payload.selection alongside it.
Postbacks do not send a text message. Blotato records the tap as an incoming message, sets text to the button label, and attaches payload.selection.
selection.type
quick-reply
The person tapped a chip. text is the chip label.
selection.type
postback
The person tapped a button you attached. text is the button label.
selection.payload
string or null
The payload received with the tap. A postback is null when the platform webhook supplies no payload. Creating a postback button through this API requires a payload of 1–1000 characters.
Branch on selection.payload, not on text. Two chips that share a label are distinguishable only by their payload.
A web_url button produces no selection. The link opens and nothing comes back.
Blotato subscribes your account to the postback webhook when you connect it. If you connected your account before buttons were launched, reconnect to start receiving postback events. Quick-reply taps need no reconnect.
Response
Status Code: 201 Created
Returns a Message Object with status queued.
Errors
Send Message returns 201 on success, 422 when the request is rejected, and 429 when you exceed 30 requests per minute.
Messaging is available on every plan, so there is no "not enabled" rejection, and this endpoint does not return 404. A connected account that is missing or expired surfaces after the message is queued, as a failed message.
A 422 means one of:
The message exceeds the platform's character limit. Instagram allows 1000 bytes, Facebook 2000 characters, and either drops to 640 characters when buttons are set.
You passed both
attachmentandquickReplies. Send one or the other.You set buttons or quick replies without message
text.The messaging window has closed.
The comment you are replying to is invalid, or it already received a private reply.
You reached your monthly active-contacts limit (error code 20101).
responseTypeisMESSAGE_TAGand you did not settag.
Message-send failures that happen after the message is queued do not return an error here. The message reaches status failed with an errorCode and errorMessage. See Messaging Errors.
Messaging Windows
The social platform limits who you can message and when. You reply to people who already have a conversation with you, not arbitrary users.
Standard window: send a
RESPONSEwithin 24 hours of the contact's last message.Private reply to a comment: set
commentIdon the target to reply once, within 7 days of the comment.Outside the window: set
responseTypetoMESSAGE_TAGwith an approvedtag(e.g.HUMAN_AGENT) to send a permitted follow-up.
These windows come from the social platform, not Blotato. A message sent outside an allowed window reaches status failed.
Sending a message to a new person also counts toward your monthly active-contacts limit. See Active Contacts.
Conversation Object
id
string
Blotato conversation ID.
accountId
string
ID of the connected account this conversation belongs to.
platform
string
instagram or facebook.
participants
array
The other people in the conversation. Each has id, name, username, and profileImageUrl, any of which may be null.
createdAt
string
ISO 8601 timestamp when the conversation started.
updatedAt
string
ISO 8601 timestamp of the most recent activity.
Message Object
id
string
Blotato message ID.
conversationId
string or null
Blotato ID of the parent conversation.
platform
string
instagram or facebook.
direction
string
incoming for messages you receive, outgoing for messages you send.
senderId
string or null
Social platform (e.g. Instagram) ID of the sender.
recipientId
string
Social platform (e.g. Instagram) ID of the recipient.
text
string
Message text.
errorMessage
string or null
Set only when status is failed.
createdAt
string
ISO 8601 timestamp when the message was created.
Payload
payload is null on a plain-text message. Otherwise it holds one or more of:
selection
object
Set on an incoming message where the person tapped a postback button or a quick reply. Holds type (postback or quick-reply) and your payload string. See Reading a Tap.
Status Values
An outgoing message you send moves through queued, processing, then sent, or failed if it does not go through. An incoming message you receive shows as delivered.
queued
Accepted and waiting to send.
processing
Sending to the social platform.
sent
Handed to the social platform.
delivered
An incoming message delivered to you.
failed
Did not send. See errorMessage.
Rate Limits
GET /conversations
60 / min
GET /conversations/:conversationId
60 / min
GET /messages
60 / min
GET /messages/:messageId
60 / min
POST /messages
30 / min
Last updated