Skip to content
Social media APIs
Instagram DMsFigures checked 14 min read

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

From the user’s last message to you

7 days
With the human_agent tag

Human-typed support replies only

100 / s
Text messages per account

10 a second for audio and video

750 / h
Private replies to comments

Per Instagram professional account

2 paths
Instagram Login or Facebook Login

A Page is optional since 2024

#10 / 2534022
The error for a late send

Message sent outside allowed window

On this page+
  1. Two ways in, and which one to pick
  2. Prerequisites that are not in the code
  3. The 24-hour window, and the one tag that extends it
  4. What you can send
  5. Rate limits, all of them
  6. Webhooks: what arrives and when
  7. Setting it up, end to end
  8. What the policy forbids, in plain terms
  9. Where PostMCP fits

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 LoginInstagram API with Facebook Login
Hostgraph.instagram.comgraph.facebook.com
Facebook Page requiredNoYes — the Instagram account must be linked to a Page you admin
Login screenInstagram’s ownFacebook’s, with Page selection
Messaging permissioninstagram_business_manage_messagesinstagram_manage_messages plus pages_manage_metadata for webhooks
Base permissioninstagram_business_basicinstagram_basic, pages_show_list
TokenInstagram user access token, long-lived (60 days, refreshable)Page access token derived from a Facebook user token
Best forCreator tools and apps where the user has no PageBusinesses 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.
send-with-human-agent-tag.sh
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

TypeShapeNotes
Textmessage.text, up to 1,000 charactersLinks are allowed and render as plain links, not previews
Image, GIF, video, audiomessage.attachment with type and a public payload.urlImage up to 8 MB; video and audio up to 25 MB; the URL must be fetchable by Meta
Stickerattachment.type: "like_heart"The only sticker the API can send
Reactionsender_action: "react" with a payload.reactionAlso unreact; reactions arrive as webhooks too
Quick repliesmessage.quick_replies[], text buttons under the messageTapping one sends its payload back as a message
Generic templateHorizontally scrollable cards with image, title, subtitle and up to three buttonsButtons can be URL or postback
Button templateText with up to three buttonsSame button types
Product templateCards from a connected catalogRequires Commerce permissions
Private replyrecipient.comment_id instead of recipient.idOne reply per comment, within 7 days of the comment; opens a normal conversation
Ice breakersUp to four pre-set questions shown to a first-time visitorSet once via the messenger profile, not per message
Persistent menuA menu of up to three items in the threadAlso 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:

CallLimitScope
Messages with text, links, reactions or stickers100 calls a secondPer Instagram professional account
Messages with audio or video attachments10 calls a secondPer Instagram professional account
Private replies to post and Reel comments750 calls an hourPer Instagram professional account
Private replies to Live comments100 calls a secondPer Instagram professional account
Other Instagram Platform calls (media, insights, comments)200 calls an hour per app-user pairBusiness 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.

inbound-message.json
{
  "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

  1. 1
    Create 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.

  2. 2
    Connect 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.

  3. 3
    Subscribe the account to messages

    POST to /{ig-user-id}/subscribed_apps with subscribed_fields=messages,messaging_postbacks. Without this call the app-level webhook is configured but no account is feeding it.

  4. 4
    Send 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.

  5. 5
    Submit 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

  1. 01Meta for Developers — Instagram Platform overview
  2. 02Meta for Developers — Graph API rate limiting (Instagram messaging limits)
  3. 03Chatwoot — What is the Human Agent tag in Instagram and Messenger
  4. 04Manychat Help — Sending outside the 24-hour and 7-day windows
  5. 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.