![]() | Send Messages |
This guide shows you how to send a message to an Instagram user from your Instagram professional account using the Instagram API with Instagram Login.
The Instagram API with Instagram Login enables your app users to send and receive messages between their Instagram professional account and their customers, potential customers, and followers.
Conversations only begin when an Instagram user sends a message to your app user through your app user's Instagram Feed, posts, story mentions, and other channels.
An Instagram professional account has a messaging inbox that allows the user to organize messages and control message notifications however when using the API the behavior will be a little different.
Learn more about the Instagram Inbox.

When an Instagram user sends a message to your app user, an event is triggered, and a webhook notification is sent to your webhook server. The notification contains the Instagram user's Instagram-scoped ID and their message. Your app user can use this information to respond.
Only after an Instagram user has sent your app user's Instagram professional account a message can your app send a message to the Instagram user. Your app has 24 hours to respond to any message sent from an Instagram user to your app user.
Messages can contain the following:
|
|
|
You can provide an escalation path for automated messaging experiences using one of the following:
allows you pass the conversation from one app or inbox to another. For example, one app would handle the conversation with an automated experience and, when needed, would pass the conversation to another app to continue the conversation with a human agent.
When required by applicable law, automated chat experiences must disclose that a person is interacting with an automated service:
Automated chat experiences that serve the following groups should pay special attention to this requirement:
Disclosures may include but are not limited to: “I’m the [Page Name] bot,”“You are interacting with an automated experience,” “You are talking to a bot,” or “I am an automated chatbot.”
Even where not legally required, we recommend informing users when they’re interacting with an automated chat as best practice, as this helps manage user expectations about their interaction with your messaging experience.
Visit our
Developer Policies
for more information.
If your app user uses a human agent to respond to messages and therefore may need more time to respond, your app can tag the response to allow your app to send the message outside the 24 hour messaging window.
You can provide an escalation path for human agent only messaging experiences with a custom inbox. Your messaging app must be able to:
This guide assumes you have read the Instagram Platform Overview and implemented the needed components for using this API, such as a Meta login flow and a webhooks server to receive notifications.
You will need the following:
All endpoints can be accessed via the graph.instagram.com host.
/<IG_ID>/messages or /me/messagesThe following are required parameters for each API request:
recipient:{id:<IGSID>}message:{<MESSAGE_ELEMENTS>}<IG_ID>) that received the message<IGSID>) for the Instagram user who sent the message to your app user, received from an Instagram messaging webhook notificationinstagram_business_basic instagram_business_manage_messages
|
|
|
| Media Type | Supported Format | Supported Size Maximum |
|---|---|---|
Audio | aac, m4a, wav, mp4 | 25MB |
Image | png, jpeg | 8MB |
Video | mp4, ogg, avi, mov, webm | 25MB |
To send a message that contains text or a link, send a POST request to the /<IG_ID>/messages endpoint with the recipient parameter containing the Instagram-scoped ID (<IGSID>) and the message parameter containing the text or link.
Message text must be UTF-8 and be a 1000 bytes or less. Links must be valid formatted URLs.
Formatted for readability.
curl -X POST "https://graph.instagram.com/v24.0/<IG_ID>/messages"
-H "Authorization: Bearer <INSTAGRAM_USER_ACCESS_TOKEN>"
-H "Content-Type: application/json"
-d '{
"recipient":{
"id":"<IGSID>"
},
"message":{
"text":"<TEXT_OR_LINK>"
}
}'
To send images, send a POST request to the /<IG_ID>/messages endpoint with the recipient parameter containing the Instagram-scoped ID (<IGSID>) and the message parameter containing up to ten attachment objects with type set to image and payload containing url set to the URL for the image or GIF.
Formatted for readability.
curl -X POST "https://graph.instagram.com/v24.0/<IG_ID>/messages"
-H "Authorization: Bearer <INSTAGRAM_USER_ACCESS_TOKEN>"
-H "Content-Type: application/json"
-d '{
"recipient":{
"id":"<IGSID>"
},
"message":{
"attachments": {
"type":"image",
"payload":{
"url":"<IMAGE_URL>"
}
}
}
}'
November 4, 2025: Multi-image send is a Beta feature that will be rolled out incrementally over a few weeks . While the feature is rolled out, some Instagram accounts may get an error response (see error response with subcode 2534068 below).
curl -X POST "https://graph.instagram.com/v24.0/<IG_ID>/messages"
-H "Authorization: Bearer <INSTAGRAM_USER_ACCESS_TOKEN>"
-H "Content-Type: application/json"
-d '{
"recipient":{
"id":"<IGSID>"
},
"message":{
"attachments":[
{
"type":"image",
"payload":{
"url":"<IMAGE_URL>",
},
},
{
"type":"image",
"payload":{
"url":"<IMAGE_URL>",
},
},
{
...
}
]
}
}'
Upon success, your app will receive the following JSON response:
{
"recipient_id": "IGSID",
"message_id": "MESSAGE-ID"
}{
"error": {
"message": "The requested feature isn't available yet. Please check back later.",
"type": "IGApiException",
"is_transient": true,
"code": 2,
"error_subcode": 2534068,
"fbtrace_id": "AligRrOm344Dy7MGyP0Ua_C"
}
}To send an audio message, send a POST request to the /<IG_ID>/messages endpoint with the recipient parameter containing the Instagram-scoped ID (<IGSID>) and the message parameter containing the attachment object with type as audio or video and payload containing url set to the URL for the audio or video file.
Formatted for readability.
curl -X POST "https://graph.instagram.com/v24.0/<IG_ID>/messages"
-H "Authorization: Bearer <INSTAGRAM_USER_ACCESS_TOKEN>"
-H "Content-Type: application/json"
-d '{
"recipient":{
"id":"<IGSID>"
},
"message":{
"attachment":{
"type":"audio", // Or set to video
"payload":{
"url":"<AUDIO_OR_VIDEO_FILE_URL>",
}
}
}
}'
To send a heart sticker, send a POST request to the /<IG_ID>/messages endpoint with the recipient parameter containing the Instagram-scoped ID (<IGSID>) and the message parameter containing an attachment object with the type set to like_heart.
Formatted for readability.
curl -X POST "https://graph.instagram.com/v24.0/<IG_ID>/messages"
-H "Authorization: Bearer <INSTAGRAM_USER_ACCESS_TOKEN>"
-H "Content-Type: application/json"
-d '{
"recipient":{
"id":"<IGSID>"
},
"message":{
"attachment":{
"type":"like_heart",
}
}
}'
To send a reaction, send a POST request to the /<IG_ID>/messages endpoint with the recipient parameter containing the Instagram-scoped ID (<IGSID>) and the sender_action parameter set to react and payload containing the message_id set to the ID for the message to apply the reaction to and reaction set to love.
To remove a reaction, repeat this request with the sender_action parameter to unreact with the payload containing message_id parameter only. Omit reaction.
Formatted for readability.
curl -X POST "https://graph.instagram.com/v24.0/<IG_ID>/messages"
-H "Authorization: Bearer <INSTAGRAM_USER_ACCESS_TOKEN>"
-H "Content-Type: application/json"
-d '{
"recipient":{
"id":"<IGSID>"
},
"sender_action":"react", // Or set to unreact to remove the reaction
"payload":{
"message_id":"<MESSAGE_ID>",
"reaction":"love", // Omit if removing a reaction
}
}'
To send a message that contains an app user's Instagram post, send a POST request to the /<IG_ID>/messages endpoint with the recipient parameter containing the Instagram-scoped ID (<IGSID>) and the message parameter containing an attachment object with the type set to MEDIA_SHARE and payload containing the Meta ID for the post.
The app user must own the post to be used in the message. Learn how to
get your app user's Instagram posts.

Learn how to fetch the media owned by the business.
Formatted for readability.
curl -X POST "https://graph.instagram.com/v24.0/<IG_ID>/messages"
-H "Authorization: Bearer <INSTAGRAM_USER_ACCESS_TOKEN>"
-H "Content-Type: application/json"
-d '{
"recipient":{
"id":"<IGSID>"
},
"message":{
"attachment":{
"type":"MEDIA_SHARE",
"payload":{
"id":"<POST_ID>",
}
}
}
}'
Learn how to send a private reply, quick reply, or template.