Messenger Platform reference

Every Facebook Messenger Platform limit, in one table

54documented limits
7groups
2026-08-20last verified

Last verified against Meta for Developers - Messenger Platform documentation

The Messenger Platform's limits come in three species, and confusing them costs debugging time. Policy limits govern when you may send: the 24-hour standard messaging window, the shrinking list of message tags that cross it, and the opt-in mechanisms (one-time notifications, marketing messages) that replace the tags Meta retired in April 2026. Content limits govern what a single message may contain: 2,000 characters of text, 25 MB per attachment, 13 quick replies, 3 buttons, 10 carousel cards. Rate limits govern how fast you may call: a pool of 200 calls per engaged user per rolling 24 hours, 300 sends per second per Page, and a tight 10-calls-per-10-minutes budget on the profile API that trips more deploy scripts than traffic ever does.

Each limit fails with its own error signature. Window violations return code 10 with subcodes like 2018278; oversized media returns 100/2018109; throttling surfaces as 4, 17, 32, 613 or 80006. The tables below name the error each limit fires so you can navigate straight from a log line to the rule behind it, and each row carries the official documentation link, only documented values appear here. The companion catalogue at /errors/messenger explains every code in depth, and the Messenger troubleshooting guide works backwards from symptoms.

Two structural facts shape everything else. First, Messenger enforcement is per-Page: quotas, windows and menus all bind to the Page (and the app connected to it), so multi-Page deployments budget per Page, not per server. Second, identifiers are scoped: recipient PSIDs exist per app-Page pair, which is why they appear in the webhook table below rather than being portable data. Numbers here were verified against Meta's documentation on the date above; Meta adjusts limits with platform announcements, so treat the changelog as part of your dependency list. For building the bot itself, see the Messenger chatbot overview.

Jump to: Standard messaging window & re-engagement · Message tags · Message content caps · Templates & buttons · Rate limits & throttling · Messenger profile, menus & greetings · Webhooks & identifiers

Standard messaging window & re-engagement

The standard messaging window is the platform's core consent rule: once a person interacts with your Page, you have 24 hours to send anything, including promotional content; after it closes, untagged sends fail with error 10/2018278 or 10/2534022. The window re-opens on every qualifying interaction, not just messages, and the list of qualifying actions is longer than most integrations assume. Everything that legitimately reaches a person after the window, one-time notifications, sponsored messages, marketing-message opt-ins, is an explicit consent or paid mechanism, tabulated here with its own caps.

WhatLimitNotesSource
Standard messaging window24 hours from the person's last qualifying actionMessages inside the window may contain promotional content. Sends after it closes fail with code 10 (subcodes 2018278 / 2534022) unless tagged or opted-in.docs ↗
Actions that open (and re-open) the window8 documented user actionsMessage to the Page; click on a CTA like Get Started; message after a Click-to-Messenger ad; message via Send to Messenger / checkbox plugin; m.me link into an existing conversation; reaction to a message; comment on a Page post; visitor post on the Page.docs ↗
Private replies1 message, within 7 days of the comment or postReply to a comment or visitor post as a single private message; it automatically links the post or comment. Sent via recipient.comment_id or recipient.post_id.docs ↗
One-time notification (OTN) follow-up1 message per opt-in token; token expires in 1 yearThe one_time_notif_token is invalidated on successful send and cannot be listed retroactively - store it from the message_optins webhook. Beta feature; the Page must be granted the One-Time Notification permission under Advanced Messaging in Page settings.docs ↗
OTN request template title65 charactersTemplate type one_time_notif_req; only title and payload are customizable.docs ↗
Marketing messages (recurring notifications)Opt-in required; frequency capped by the agreed cadenceSends that beat the agreed frequency fail with error 4/2018354 (documented as safe to ignore); a person who clicks "Stop these messages" triggers 10/1893015; over-prompting for opt-ins can restrict the Page (10/1404170).docs ↗
Sponsored messagesPaid channel; no organic equivalentThe only way to send promotional content outside the window to a prior conversation; delivered through the ads system, annotated as Sponsored. Not available for the Instagram messaging API.docs ↗

Message tags

Message tags are the narrow, non-promotional exceptions to the 24-hour window, and 2026 cut the list down hard: Meta documents that as of April 27, 2026, requests carrying CONFIRMED_EVENT_UPDATE, ACCOUNT_UPDATE or POST_PURCHASE_UPDATE receive error code 100. What remains is HUMAN_AGENT for human escalations and the customer-feedback template flow, both on 7-day clocks. Tags never permit promotional content, and per-recipient overuse draws the documented abuse warning 613/2018338 before Page-level restrictions. Tagged sends must set messaging_type to MESSAGE_TAG.

WhatLimitNotesSource
Retired tags: CONFIRMED_EVENT_UPDATE, ACCOUNT_UPDATE, POST_PURCHASE_UPDATEUnusable since April 27, 2026Meta: "Effective April 27th, 2026, all API requests containing the Message Tags CONFIRMED_EVENT_UPDATE, ACCOUNT_UPDATE, and POST_PURCHASE_UPDATE will receive error code 100." Migrate to opt-in mechanisms.docs ↗
HUMAN_AGENT tagSend within 7 days of the person's messageFor human (not automated) responses to issues that cannot be resolved in the standard window. Requires the Human Agent permission via App Review (App dashboard -> App review -> Permissions & Features); not available in standard access or development mode.docs ↗
CUSTOMER_FEEDBACK tagSend within 7 days of the customer's last messageOnly usable with the Customer Feedback Template; any other form is documented to fail. Not available for the Instagram messaging API.docs ↗
Tag content restrictionNon-promotional content only"Message tags may not be used to send promotional content, including but not limited to: deals, offers, coupons, and discounts." Misuse can restrict the Page's messaging.docs ↗
Tagged send request shapemessaging_type MESSAGE_TAG + tag parameterThe tag must match the allowed use case; per-recipient overuse triggers the documented warning on 613/2018338.docs ↗

Message content caps

Per-message content limits are enforced at the payload level and fail fast with code 100 variants: oversized files with 100/2018109, unfetchable media with 100/2018008, type mismatches with 100/2018047, and slow video with 100/2018294. The numbers below come from the Send API reference and the quick replies reference; where a cap interacts with another (the 25 MB file cap versus the 75-second video fetch), the tighter constraint wins in practice.

WhatLimitNotesSource
Text message length2,000 characters, UTF-8message.text "must be UTF-8 and less than 2000 characters." Longer content belongs in a webview or split messages.docs ↗
Attachment file size25 MB maximumApplies to attachment types audio, file, image, video. Oversize fails with 100/2018109.docs ↗
Video fetch timeout (URL attachments)75 seconds"If the video can't be fetched within 75 seconds, it will time out" (error 100/2018294). Use the Attachment Upload API for large media.docs ↗
Multiple attachments in one message30 images maximum; images onlyThe attachments array supports only type image, "limited to 30 images at once." Mixed media must be sent as separate messages.docs ↗
message.metadata1,000 charactersFree-form string echoed back in the message_echo webhook; "must be less than 1000 characters."docs ↗
Quick replies per message13 maximum"A maximum of 13 quick replies are supported." Content types: text, user_phone_number, user_email.docs ↗
Quick reply title20 charactersRequired (non-empty) when content_type is text; longer titles are truncated in rendering, so front-load meaning.docs ↗
Quick reply payload1,000 charactersReturned to your webhook when tapped; may be an empty string if image_url is set.docs ↗
Quick reply icon imageMinimum 24 x 24 pxLarger images are automatically cropped and resized; required if title is an empty string.docs ↗
Typing indicator (sender action typing_on)Auto-off after 20 secondsTyping indicators "are automatically turned off after 20 seconds" or when the bot sends a message. Sender actions must be sent as a separate request from message content.docs ↗

Templates & buttons

Structured messages have per-component caps that fail as bad parameters (code 100) when exceeded, and silently truncate where rendering rather than validation enforces them, titles especially. The two workhorses are the button template (text plus up to three buttons) and the generic template (cards with image, title, subtitle and buttons, up to ten of them forming a horizontally scrollable carousel). Buttons themselves are shared across templates, quick-reply surfaces and the persistent menu, with a uniform 20-character title cap and 1,000-character postback payload.

WhatLimitNotesSource
Button template text640 characters, UTF-8Text appears above the buttons.docs ↗
Buttons per button template1-3 buttons"Set of 1-3 buttons that appear as call-to-actions."docs ↗
Button title (all button types)20 charactersApplies to URL, postback and call buttons alike.docs ↗
Postback button payload1,000 charactersDelivered to your webhook as a messaging_postbacks event.docs ↗
Generic template elements (carousel)10 elements maximum per message"The generic template supports a maximum of 10 elements per message." Multiple elements render as a horizontally scrollable carousel; at least one property beyond title must be set.docs ↗
Generic template element title80 charactersRendering truncates long titles; keep the differentiating words first.docs ↗
Generic template element subtitle80 charactersOptional; same truncation behavior as the title.docs ↗
Buttons per generic template element3 maximum"A maximum of 3 buttons per element is supported." default_action adds a tap target without consuming a button slot.docs ↗

Rate limits & throttling

Messenger rate limits are per-Page and layered: a rolling 24-hour pool that scales with the audience, per-second ceilings on the Send API, and endpoint-specific budgets. Crossing them returns the throttle family, 4 (app-wide), 17 (user token), 32 (Page), 613 (custom/per-API) and 80006 (Messenger business use case), and Meta's stated best practice is to stop calling, because continued calls extend the block. The X-App-Usage and X-Business-Use-Case-Usage response headers report fill percentages and an estimated_time_to_regain_access, so the limits are observable before they bite.

WhatLimitNotesSource
Messenger API call poolCalls within 24 hours = 200 x number of engaged usersMeta's documented formula; "the Number of Engaged Users is the number of people the business can message via Messenger." Rolling 24-hour window, per Page.docs ↗
Send API - text, links, reactions, stickers300 calls per second per PageSame ceiling documented per Instagram professional account on the Instagram side.docs ↗
Send API - audio and video content10 calls per second per Page30x lower than the text ceiling; throttle media sends on their own queue.docs ↗
Conversations API2 calls per second per PageReading conversation lists and histories; cache aggressively rather than polling.docs ↗
Private Replies API750 calls per hour per PageDocumented for private replies to comments on posts and reels; plan comment-reply automation on viral posts around it.docs ↗
Single-thread send throttleDocumented, no published number"Your app may be rate limited if too many messages are being sent to a single thread." Coalesce chunked bot output into fewer messages.docs ↗
Throttle error codes4, 17, 32, 613 (subcode 1996 for volume anomalies), 800064 = app limit, 17 = user token, 32 = Page calls with user token, 613 = custom/per-API limit, 80006 = Messenger business use case (Page/system-user tokens).docs ↗
Usage visibility headersThrottling begins when any metric reaches 100%X-App-Usage and X-Business-Use-Case-Usage report call_count, total_time, total_cputime percentages; the BUC header adds estimated_time_to_regain_access (minutes).docs ↗

Messenger profile, menus & greetings

The Messenger Profile API configures the conversation surface, greeting, ice breakers, get-started button, persistent menu, and it carries the platform's tightest documented budget: 10 calls per 10-minute interval per Page. Deploy scripts that re-set the menu on every restart burn through it and start failing with 613-style throttles; set profile properties on change, not on boot. Profile reads about users have their own failure modes: fields beyond your grant return 2018247, and phone-number-only Messenger accounts return 2018218.

WhatLimitNotesSource
Messenger Profile API rate limit10 API calls per 10-minute interval, per PageCovers greeting, get_started, ice_breakers, persistent_menu, whitelisted_domains and other profile properties.docs ↗
Greeting text160 characters, UTF-8, per localeLocale-specific array; a default locale entry is required. Supports {{user_first_name}}, {{user_last_name}}, {{user_full_name}} personalization.docs ↗
Ice breakersMaximum 4 questions"A maximum of 4 questions can be set via the Ice Breaker API." Localizable per locale since April 2022; API ice breakers take precedence over the Get Started button and inbox custom questions.docs ↗
Persistent menu - top-level items3 items (menu reference); up to 20 buttons in call_to_actions on Graph API v8.0+The profile reference documents "a maximum of 3" top-level items; the persistent menu guide documents that v8.0+ allows up to 20 buttons in the call_to_actions array as the replacement for deprecated nested menus.docs ↗
Persistent menu item title30 charactersButton types web_url and postback are supported in the menu; postback payload limit is 1,000 characters.docs ↗
Nested persistent menusDeprecated (Graph API v8.0+)Pages with nested menu items render as flat lists on web, iOS and Android (v276+).docs ↗
Persistent menu prerequisitesGet Started button required; Page published; app publicAlso requires pages_messaging and Messenger v106+ on the user's device; menu item taps open the standard 24-hour window.docs ↗
Page-level menu update latencyUp to 24 hoursUser-level (custom_user_settings) menu updates apply in realtime by contrast.docs ↗
User-level menu (custom_user_settings)10 calls per user per 10 minutesPer-PSID menu and composer overrides; enforced per Page.docs ↗
User profile fieldsDefault: first_name, last_name, profile_picExtended fields need additional approval (error 2018247 otherwise); phone-number-created Messenger accounts have no retrievable profile (error 2018218).docs ↗

Webhooks & identifiers

Webhook delivery has documented deadlines on both sides: your endpoint must answer every event with 200 OK within 5 seconds, and Meta's retry ladder is short, immediate retries, a developer alert if delivery still fails after 15 minutes, and a Webhooks Disabled alert with the app unsubscribed from the Page after 1 hour of failures. An unsubscribed bot is the classic silent failure: sends still work, but nothing arrives, the exact scenario walked through in the webhook debugging guide. The identifier rows matter because misread IDs surface later as 100/2018001 on sends.

WhatLimitNotesSource
Webhook response deadline200 OK within 5 seconds, for all notificationsAcknowledge first, process async; slow handlers count as failures and start the retry/disable clock.docs ↗
Failed delivery - retries and alertImmediate retries, then alert at 15 minutes"If a notification sent to your server fails, we will immediately try a few more times"; your server should deduplicate. After 15 minutes of failures an alert is sent to the developer account.docs ↗
Failed delivery - unsubscriptionWebhooks disabled after 1 hour of failuresThe app receives a Webhooks Disabled alert and is unsubscribed from the Page or Instagram account; you must re-subscribe after fixing the endpoint.docs ↗
Event orderingNot guaranteed after failuresMessages sent during an outage "may not be delivered in the order they were sent"; order by the webhook's timestamp field, not arrival.docs ↗
Endpoint TLS requirementValid TLS/SSL certificate; self-signed not supportedApplies to both verification requests and event notifications.docs ↗
Recipient identifiers (PSIDs)Page-scoped: one ID per person per PagePSIDs are assigned when the person first messages the Page and differ across Pages and apps; app-scoped IDs from Facebook Login "will not work with the Messenger platform." user_ref (plugins) and comment/post IDs (private replies) are the other documented recipient types.docs ↗

Messenger guides and tools

Other platforms

Frequently asked questions

How long is the Messenger messaging window?

24 hours from the person's most recent qualifying action, and it re-opens on every one: a message, a Get Started tap, a plugin or m.me interaction, a reaction, a comment on your post, or a visitor post. Inside the window you may send anything, including promotional content. After it closes, untagged sends fail with error 10 (subcodes 2018278 or 2534022) until the person interacts again.

Which message tags does Messenger still support in 2026?

Meta documents that since April 27, 2026, requests using CONFIRMED_EVENT_UPDATE, ACCOUNT_UPDATE or POST_PURCHASE_UPDATE receive error code 100. HUMAN_AGENT survives for human replies within 7 days of the person's message and requires App Review approval of the Human Agent permission. CUSTOMER_FEEDBACK remains documented for the Customer Feedback Template, also on a 7-day clock. No tag may carry promotional content.

What is the HUMAN_AGENT tag's window and requirement?

Messages tagged HUMAN_AGENT can be sent within 7 days of the person's message, for human agent support on issues that cannot be resolved inside the standard 24-hour window. Automated messages are a disallowed usage. The app must be approved for the Human Agent permission through App Review; the tag is unavailable in development mode or with standard access.

How long can a Messenger text message be?

The Send API's message.text must be UTF-8 and under 2,000 characters. Related payload caps: metadata at 1,000 characters, quick reply payloads and postback payloads at 1,000 characters, button template text at 640 characters, and generic template titles and subtitles at 80 characters each. Longer content is better delivered as a webview link than as chained maximal messages.

What is the Messenger attachment size limit?

25 MB per attachment across audio, file, image and video types, documented in the Send API reference; oversized files fail with error 100/2018109. URL-referenced video must also be fetchable within 75 seconds or it fails with 100/2018294, which makes the practical video budget tighter than 25 MB on slow origins. The Attachment Upload API with reusable IDs sidesteps fetch-time problems.

How many quick replies and buttons can one message have?

Up to 13 quick replies per message, each with a 20-character title and 1,000-character payload. Templates carry 1-3 buttons: the button template accepts a set of 1-3, and the generic template allows a maximum of 3 buttons per element. A generic template message supports up to 10 elements, rendered as a horizontally scrollable carousel, with 80-character titles and subtitles.

What are the Messenger API rate limits?

The documented formula is calls within 24 hours = 200 x the number of engaged users, the people the business can message. On top of that pool, the Send API allows 300 calls per second per Page for text, links, reactions and stickers, and 10 per second for audio or video; the conversations API allows 2 calls per second; private replies allow 750 per hour. Breaches return codes 4, 17, 32, 613 or 80006.

How often can I update the persistent menu or greeting?

The Messenger Profile API, which sets the menu, greeting, ice breakers and get-started button, is limited to 10 calls per 10-minute interval per Page, and user-level menus via custom_user_settings to 10 calls per user per 10 minutes. Page-level menu changes can additionally take up to 24 hours to propagate, while user-level changes apply in realtime. Set profile properties on change, never in deploy loops.

What happens if my webhook endpoint goes down?

Meta retries failed notifications immediately a few times, alerts your developer account if delivery still fails after 15 minutes, and after 1 hour of failures sends a Webhooks Disabled alert and unsubscribes the app from the Page. After that, nothing arrives until you fix the endpoint and re-subscribe. Events redelivered around failures can arrive out of order, so sequence by the payload's timestamp field.

Why do recipient IDs from other sources fail on Messenger?

The Send API addresses people by Page-scoped ID (PSID), created when the person first messages your Page and unique to that Page-and-app pairing. IDs from Facebook Login are app-scoped and documented as not working with the Messenger Platform, and PSIDs from another Page or app resolve to no one, failing with error 100/2018001. Capture PSIDs from your own webhook events and re-match them after any app migration.

Build on Messenger without tracking every limit yourself

Conferbot paces sends, queues retries and surfaces limit errors as readable status.