Instagram Messaging API: the rules, windows and rate limits to know before you send a single DM
The Instagram Messaging API is a permission system with a send endpoint attached. Whether a message goes through depends less on your code than on who wrote to whom, how long ago, and what your app has been approved for. This is the whole rulebook in one place — both login paths, the windows, the tags, the limits and the payloads — checked against Meta’s documentation in September 2026.
- 24 h
- Standard reply window
- 7 days
- With the human_agent tag
- 100 / s
- Text messages per account
- 750 / h
- Private replies to comments
- 2 paths
- Instagram Login or Facebook Login
- #10 / 2534022
- The error for a late send
From the user’s last message to you
Human-typed support replies only
10 a second for audio and video
Per Instagram professional account
A Page is optional since 2024
Message sent outside allowed window
On this page+
Two ways in, and which one to pick
Until 2024 every Instagram integration ran through a Facebook Page linked to the Instagram account. Meta then shipped Instagram API with Instagram Login, which drops the Page requirement and authenticates against Instagram directly. Both paths reach the same messaging capability with different hosts, permissions and prerequisites.
| Instagram API with Instagram Login | Instagram API with Facebook Login | |
|---|---|---|
| Host | graph.instagram.com | graph.facebook.com |
| Facebook Page required | No | Yes — the Instagram account must be linked to a Page you admin |
| Login screen | Instagram’s own | Facebook’s, with Page selection |
| Messaging permission | instagram_business_manage_messages | instagram_manage_messages plus pages_manage_metadata for webhooks |
| Base permission | instagram_business_basic | instagram_basic, pages_show_list |
| Token | Instagram user access token, long-lived (60 days, refreshable) | Page access token derived from a Facebook user token |
| Best for | Creator tools and apps where the user has no Page | Businesses already on Meta Business Suite, agencies managing Pages |
If you are starting today and your users are creators, use Instagram Login — it removes the single biggest onboarding failure, which was users who did not know they needed a Facebook Page. If your users are businesses whose Instagram is already wired into Business Suite, Facebook Login keeps one token model for Pages and Instagram.
Prerequisites that are not in the code
- A professional account. Business or Creator. Personal accounts have no messaging API surface at all; the user switches in Instagram settings, free, and can switch back.
- Message access enabled on the account. In the Instagram app: Settings → Messages and story replies → Message controls → Connected tools → Allow access to messages. If this is off, webhooks never arrive and there is no error — the most common “it worked in testing” support ticket.
- A Meta app with the Instagram product added and a webhook endpoint that answers the verification handshake over HTTPS.
- App roles for testing. Accounts with a role on the app (admin, developer, tester) work under Standard Access. Anyone else needs Advanced Access, which needs App Review.
- App Review for the messaging permission, with a screencast showing the exact flow. Business Verification if the app is for a business, and Tech Provider verification if you send on behalf of other businesses.
The 24-hour window, and the one tag that extends it
A conversation is open for 24 hours after the user’s last message to you. Inside it, your app can send freely — text, media, templates — subject to rate limits. Outside it, a send fails with error code 10, subcode 2534022: message sent outside of allowed window. The clock restarts every time the user writes, reacts or replies to a story.
The only extension Instagram supports is the HUMAN_AGENT tag, which allows a reply up to seven days after the user’s last message. Meta’s conditions are narrow and enforced:
- The message must be typed by a person. Automating sends under the tag is detected and produces an “unsupported message tag” error — and, repeated, an app restriction.
- It must continue a support conversation: resolving an issue, following up on a case. Promotions under the tag are a policy violation.
- It expires at seven days. There is no eighth-day tag, no “one-time notification” opt-in as on Messenger, and no template messages as on WhatsApp.
curl -X POST "https://graph.instagram.com/v26.0/{ig-user-id}/messages" \
-H "Authorization: Bearer $IG_USER_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"recipient": { "id": "{igsid}" },
"messaging_type": "MESSAGE_TAG",
"tag": "HUMAN_AGENT",
"message": { "text": "Following up on the order you asked about yesterday — it shipped this morning." }
}'The igsid — Instagram-scoped user id — is what identifies the recipient. It is unique per user per Instagram professional account, so the same person has a different id in each business’s inbox. You get it from the webhook; you cannot look it up from a username.
What you can send
| Type | Shape | Notes |
|---|---|---|
| Text | message.text, up to 1,000 characters | Links are allowed and render as plain links, not previews |
| Image, GIF, video, audio | message.attachment with type and a public payload.url | Image up to 8 MB; video and audio up to 25 MB; the URL must be fetchable by Meta |
| Sticker | attachment.type: "like_heart" | The only sticker the API can send |
| Reaction | sender_action: "react" with a payload.reaction | Also unreact; reactions arrive as webhooks too |
| Quick replies | message.quick_replies[], text buttons under the message | Tapping one sends its payload back as a message |
| Generic template | Horizontally scrollable cards with image, title, subtitle and up to three buttons | Buttons can be URL or postback |
| Button template | Text with up to three buttons | Same button types |
| Product template | Cards from a connected catalog | Requires Commerce permissions |
| Private reply | recipient.comment_id instead of recipient.id | One reply per comment, within 7 days of the comment; opens a normal conversation |
| Ice breakers | Up to four pre-set questions shown to a first-time visitor | Set once via the messenger profile, not per message |
| Persistent menu | A menu of up to three items in the thread | Also via the messenger profile |
Private replies are the quiet exception to “they must message first”. A comment on your post or Reel, or on your Live, lets you send exactly one DM to that commenter within seven days. If they reply, the ordinary 24-hour window opens. This is how comment-to-DM automations are legal.
Rate limits, all of them
Instagram messaging is rate-limited per Instagram professional account, not per app, so a busy account cannot starve a quiet one on the same app. The published ceilings:
| Call | Limit | Scope |
|---|---|---|
| Messages with text, links, reactions or stickers | 100 calls a second | Per Instagram professional account |
| Messages with audio or video attachments | 10 calls a second | Per Instagram professional account |
| Private replies to post and Reel comments | 750 calls an hour | Per Instagram professional account |
| Private replies to Live comments | 100 calls a second | Per Instagram professional account |
| Other Instagram Platform calls (media, insights, comments) | 200 calls an hour per app-user pair | Business Use Case limit |
The 750-an-hour private-reply cap is the one that bites in practice. A Reel that collects 5,000 comments in an hour with a “comment KEYWORD for the link” hook cannot be answered in that hour; queue the replies and spread them over the seven days you have. The 100-a-second text limit, by contrast, is generous enough that hitting it means something is looping.
Webhooks: what arrives and when
Subscribe the app to the messages field at minimum; add messaging_postbacks for template and ice-breaker taps, messaging_seen for read receipts, message_reactions, messaging_referral for ig.me links and ads, and messaging_handover if you pass threads to a human inbox. Every delivery is a POST to your endpoint, signed with X-Hub-Signature-256, that you must acknowledge with a 200 within a few seconds or Meta retries and eventually backs off.
{
"object": "instagram",
"entry": [
{
"id": "17841400000000000",
"time": 1757145600,
"messaging": [
{
"sender": { "id": "5834920000000000" },
"recipient": { "id": "17841400000000000" },
"timestamp": 1757145599000,
"message": {
"mid": "aWdfZAG1faXRlbToxOklHTWVzc2FnZUlEOjE3ODQxNDAwMDAwMDAwMDA6...",
"text": "Is the blue one back in stock?"
}
}
]
}
]
}Two things in that payload matter more than they look. entry[].id is your Instagram professional account id, which tells a multi-tenant app whose inbox this is. sender.id is the igsid you reply to — and your own outbound messages also arrive as webhooks with is_echo: true, so filter those or you will answer yourself.
Setting it up, end to end
- 1Create the app and add Instagram
In the Meta developer dashboard create a Business-type app, add the Instagram product, and choose the Instagram Login or Facebook Login path. Register your webhook URL and verify token; Meta sends a GET with a challenge you echo back.
- 2Connect a test account
Add an Instagram professional account you control as a tester. Complete the login flow, exchange the short-lived token for a long-lived one, and turn on Allow access to messages in the Instagram app.
- 3Subscribe the account to messages
POST to
/{ig-user-id}/subscribed_appswithsubscribed_fields=messages,messaging_postbacks. Without this call the app-level webhook is configured but no account is feeding it. - 4Send yourself a DM and reply through the API
From another account, message the test account. Read the igsid from the webhook, POST a reply to
/{ig-user-id}/messages, and check the 24-hour window logic by waiting a day and watching the send fail with subcode 2534022. - 5Submit for App Review
Request Advanced Access on the messaging permission with a screencast of the real flow, a privacy policy URL and a clear description. Complete Business Verification. Expect days to a few weeks and at least one round of clarification.
What the policy forbids, in plain terms
- No cold messages. There is no API path to a user who has not messaged you or commented on your content. Tools that claim otherwise are automating a phone, which is what gets accounts disabled.
- No promotions under human_agent. The seven-day tag is for support follow-ups typed by a person.
- No message scraping. You may store the conversations users have with you; you may not harvest profiles, followers or other users’ content through the messaging surface.
- Automated senders must be disclosable. Meta’s platform terms require that users can tell they are talking to automation and can reach a person.
Where PostMCP fits
PostMCP does not send or read Instagram DMs and has no messaging module. It publishes and schedules Instagram feed posts, Reels and carousels alongside six other networks through one API and an MCP server, which is the other half of the Instagram Platform — content publishing rather than messaging. Teams building a comment-to-DM funnel typically pair a messaging integration like the one above with a publishing pipeline for the Reels that generate the comments; the Instagram API reference and the Instagram scheduler page cover that side.
Frequently asked questions
Can I send an Instagram DM to anyone with the API?+
No. The Messaging API only lets you reply to users who have messaged your professional account, within 24 hours of their last message, or send one private reply to someone who commented on your post, Reel or Live within seven days. There is no API for cold outreach, and automating it through unofficial means is what gets accounts disabled.
What is the Instagram 24-hour messaging window?+
After a user messages your account you have 24 hours to reply through the API. A send after that fails with error code 10, subcode 2534022. Every new message from the user restarts the clock. The only extension is the HUMAN_AGENT tag, which allows a human-typed support reply up to seven days after the user’s last message.
Do I still need a Facebook Page for the Instagram Messaging API?+
Not any more. Instagram API with Instagram Login, released in 2024, authenticates directly against Instagram at graph.instagram.com with the instagram_business_manage_messages permission and no Page. The older Facebook Login path still works and still requires a Page linked to the Instagram account.
What are the Instagram Messaging API rate limits?+
Per Instagram professional account: 100 calls a second for messages containing text, links, reactions or stickers; 10 a second for audio or video; 750 an hour for private replies to comments on posts and Reels; 100 a second for private replies to Live comments. Other Instagram Platform calls share a 200-per-hour Business Use Case limit per user.
Which permissions does Instagram messaging need?+
With Instagram Login: instagram_business_basic and instagram_business_manage_messages. With Facebook Login: instagram_basic, instagram_manage_messages, pages_show_list and pages_manage_metadata. All need Advanced Access through App Review before they work for users without a role on your app.
Why are my Instagram webhooks not arriving?+
Usually one of three things: the account has not enabled Allow access to messages in the Instagram app’s Connected tools setting; the account was never subscribed to the messages field via /{ig-user-id}/subscribed_apps; or the account is not a professional account. None of these produces an error — the messages simply never come.
Does PostMCP support Instagram messaging?+
No. PostMCP publishes and schedules Instagram posts, Reels and carousels through the content publishing side of the Instagram Platform, alongside six other networks. It does not read or send DMs.
Sources, checked September 6, 2026
- 01Meta for Developers — Instagram Platform overview
- 02Meta for Developers — Graph API rate limiting (Instagram messaging limits)
- 03Chatwoot — What is the Human Agent tag in Instagram and Messenger
- 04Manychat Help — Sending outside the 24-hour and 7-day windows
- 05Conferbot — Instagram Messaging API limits, every documented cap
Limits, prices and metric names on this page are the vendors’ own at the date above. When one moves upstream we update the figure and the date together.
The publishing side of the Instagram Platform
Schedule the Reels and posts that start the conversations — Instagram plus six other networks, from one API or your AI agent. 20 posts a month free.
More platform guides
Social media APIsSocial media analytics APIs: what every network exposes, what it costs, and what it quietly deleted
A network-by-network map of the social media analytics APIs: YouTube Analytics, Instagram and Facebook insights, Threads insights, X metrics, LinkedIn Community Management, TikTok Display and Research, Bluesky. Who can use each, what they return, what they cost, and the metrics that were deleted in 2025–26.
ReadMeta platform mapFacebook API platforms: a map of every Meta developer API, what each is for, and how you get in
A map of the Facebook (Meta) API platforms in 2026: Graph API v26.0, Pages, Instagram Platform, Messenger, WhatsApp Business Platform, Threads, Marketing and Conversions APIs. What each is for, the permission and App Review ladder, rate limits, and the metrics Meta removed this year.
Read