LINE Messaging API reference

Every LINE Messaging API limit, in one table

90documented limits
14groups
2026-08-20last verified

Last verified against LINE Developers - Messaging API reference (common specifications)

The LINE Messaging API has two limit systems, and confusing them is the classic mistake. The first is engineering: per-endpoint rate limits, applied per channel with a token bucket - most endpoints, including reply and push, allow 2,000 requests per second, but multicast drops to 200 per second, broadcast and narrowcast to 60 per hour, and some rich menu operations to 3 per hour. The second is commercial: your LINE Official Account's subscription plan includes a monthly allowance of free messages, and push, multicast, narrowcast, and broadcast sends all consume it - counted per recipient, not per API call. Reply messages, sent with the single-use replyToken from a webhook event, are explicitly not counted. That reply-first cost model is the thing that surprises teams coming from other platforms: a bot that answers users via push instead of reply works identically in testing and then burns through the plan's free messages in production, ending the month with 429 You have reached your monthly limit. while replies keep flowing for free.

Plan allowances are deliberately not listed as universal numbers here because LINE's own docs say the subscription plan "may vary by country or region"; the documented Japan example runs from 200 free messages on the free plan to 30,000 on the Standard Plan. What is universal: the counting rules, the quota-inspection endpoints, and the errors that fire when you run out.

Everything below is quoted from the Messaging API reference and official docs, with a source link on every row: rate limits, monthly quota mechanics, per-request sending caps, reply token validity, retry-key idempotency, character counting, media specs, quick reply, Flex and template message caps, imagemap, rich menus, webhooks, and audiences. Where a limit fires a specific error, the section intro links the matching page in our LINE error reference.

Jump to: Per-endpoint rate limits · Monthly message quota (subscription plans) · Per-request sending caps · Reply token validity · X-Line-Retry-Key idempotency · Text message limits & character counting · Image, video, audio & sticker limits · Quick reply limits · Flex Message limits · Template message limits · Imagemap message limits · Rich menu limits · Webhook rules & redelivery · Audience limits

Per-endpoint rate limits

Rate limits apply "to each API function (endpoint) on a per-channel basis", enforced with a token bucket that refills gradually rather than resetting on the minute - so bursts can pass and sustained overrun drains capacity until requests start failing with 429 The API rate limit has been exceeded. The scope rules are documented: the same URL with a different HTTP method is a different endpoint, request parameters and source IP make no difference, and channels get independent budgets even against the same LINE Official Account. Note the spread below - per-second on the messaging path, but per-minute and per-hour on management, insight, and rich menu endpoints - and that LINE documents no Retry-After header, so backoff must be self-clocked.

WhatLimitNotesSource
Send reply / send push (and all endpoints not listed separately)2,000 requests per secondThe reference's catch-all tier: "Other API endpoints | 2,000 requests per second". The reply and push endpoints both display this value on their own Rate limit sections.docs ↗
Send multicast message200 requests per secondShared tier with membership, coupon, and related endpoints. Each multicast request can carry up to 500 user IDs.docs ↗
Send broadcast / send narrowcast60 requests per hourShared tier with insight endpoints: number of deliveries, followers, demographics, statistics per unit, rich menu insights, and the test webhook endpoint.docs ↗
Audience management endpoints60 requests per minuteCreate/update/rename/delete audiences and get audience data (including Business Manager shared audiences).docs ↗
Webhook settings (set / get endpoint URL)1,000 requests per minuteSetting an invalid URL fails with 400 Invalid webhook endpoint URL rather than a rate-limit error.docs ↗
Create / delete rich menu, delete alias, batch status100 requests per hourCreating and deleting rich menus via LINE Official Account Manager is not subject to this restriction.docs ↗
Replace or unlink linked rich menus in batches3 requests per hourThe tightest documented limit on the API - batch rich menu control is designed for rare, bulk operations.docs ↗
Get rich menu list10 requests per secondRead-only, but separately limited from the create/delete pair.docs ↗
Display a loading animation100 requests per secondReturns 202. loadingSeconds accepts 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, or 60; default 20.docs ↗
Issue short-lived channel access token370 requests per secondToken issuance shouldn't run per-request anyway: short-lived and v2.1 tokens are capped at 30 valid tokens per channel.docs ↗
Enforcement modelToken bucket, per endpoint, per channel"Rather than resetting the number of requests all at once at fixed intervals" - capacity returns gradually after a 429.docs ↗

Monthly message quota (subscription plans)

Every LINE Official Account can "send a certain number of messages each month for free", with the allowance set by its subscription plan - and the docs are explicit that "the subscription plan may vary by country or region", so treat any specific number as regional. Only proactive sending consumes quota: the pricing page lists push, multicast, broadcast, and narrowcast as counted, and reply messages as not counted. Counting is per recipient - message objects per request don't matter - and messages that can't be received (blocked users, dead IDs) aren't counted. Run out, and sends fail with 429 You have reached your monthly limit.; note narrowcast temporarily reserves quota equal to your full target reach, which can trip that error early.

WhatLimitNotesSource
Free messages per monthPlan-dependent - see your region's plan docs"The number of free messages that you can send varies depending on the subscription plan." Plans and prices differ by country/region (Japan, Taiwan, Thailand, and others have separate pages).docs ↗
Documented Japan example: Communication Plan (free)Up to 200 free messages / monthNo additional paid messages available on this plan ("N/A").docs ↗
Documented Japan example: Light PlanUp to 5,000 free messages / monthJPY 5,000 fixed monthly fee; no additional paid messages.docs ↗
Documented Japan example: Standard PlanUp to 30,000 free messages / monthJPY 15,000 fixed monthly fee; additional messages up to JPY 3 each, unit price varying with volume.docs ↗
Sending methods that consume quotaPush, multicast, broadcast, narrowcastReply messages are documented as "not counted as message count" - the reply-first cost model.docs ↗
Counting unitPer recipient, not per API call"The number of messages is counted by the number of people you send a message to" - 4 message objects pushed to a 5-person chat count as 5.docs ↗
Blocked users / non-existent IDsNot counted"If the user can't receive your message, that message doesn't count as sent" - but push still returns 200, so failures are silent.docs ↗
Additional (paid) messagesConfigurable cap, plan-permittingSet a maximum number of additional messages in LINE Official Account Manager; exceeding that cap also returns the monthly-limit 429.docs ↗
Check the month's target limitGET /v2/bot/message/quotaReturns type: none (no target limit set) or limited plus value. Includes messages sent from LINE Official Account Manager.docs ↗
Check messages used this monthGET /v2/bot/message/quota/consumptionMonth-to-date consumption; poll it to alert before the quota 429 fires.docs ↗

Per-request sending caps

All five sending endpoints share the same envelope: a messages array of at most 5 message objects, in a request body capped at 2 MB. The differences are in addressing. Push targets one userId, groupId, or roomId; multicast fans out to explicit user IDs; broadcast hits every friend; narrowcast filters by attributes or audiences and carries documented privacy floors that fail either fast with 403 Not enough recipients or late, after a 202, when delivery starts. Invalid recipients produce 400 Failed to send messages; oversized bodies produce 413. Validation-only twins of each endpoint (/validate/push etc.) run the same message-object checks without sending or spending quota.

WhatLimitNotesSource
Message objects per request5Same cap on reply, push, multicast, narrowcast, and broadcast. The sentMessages response array is likewise capped at 5.docs ↗
Multicast recipients500 user IDs per request"Max: 500 user IDs." User IDs only - no group or room IDs. Chunk larger lists and iterate within the 200 req/s endpoint limit.docs ↗
Broadcast recipientsAll friends of the accountNo recipient list; consumes quota per friend reached, at a 60 requests/hour endpoint limit.docs ↗
Narrowcast: target reach floor for attribute targeting100 or more"Returns a 403 HTTP status code if your target reach is less than 100 people."docs ↗
Narrowcast: final recipient floor50 or moreRequests below the floor still return 202, then "an error will occur when message delivery starts" - poll the progress endpoint.docs ↗
Push to users who messaged you without friendingWithin 7 days of receiving their messageDocumented exception to the friends-only rule for one-to-one chats.docs ↗
Request body size2 MB"Request exceeds the max size of 2MB" returns 413. Media is referenced by URL, never embedded, so normal requests stay tiny.docs ↗
Loading animation duration5-60 seconds, in steps of 5Default 20 seconds; endpoint returns 202 and is limited to 100 requests/second.docs ↗

Reply token validity

Reply messages are the free half of LINE's cost model, and the reply token is the gate. Each webhook event that can be responded to carries one token; break any rule below and the reply endpoint returns 400 Invalid reply token. LINE couples the rules with an explicit warning: "the time limit for reply tokens is subject to change without notice" and actual usable duration "may vary due to network delays and other factors" - "don't rely on the time limit for implementation... use reply tokens as soon as possible." A miss isn't fatal: fall back to a push message to the event's source, accepting that the push consumes monthly quota where the reply would have been free.

WhatLimitNotesSource
Uses per token1"Reply tokens can only be used once." One reply call may still carry up to 5 message objects.docs ↗
Validity window1 minute from receiving the webhook"Must be used within one minute after receiving the webhook. Use beyond one minute isn't guaranteed to work."docs ↗
Token in a redelivered webhook1 minute from receiving the redeliveryUnusable if the original webhook's token was already used, or if 20 minutes have passed since the event occurred.docs ↗
Quota cost of a reply0 (not counted)Replies are excluded from the monthly message count - the documented reason to prefer reply over push wherever a token exists.docs ↗

X-Line-Retry-Key idempotency

Push, multicast, narrowcast, and broadcast accept an X-Line-Retry-Key header - "an arbitrarily generated UUID in hexadecimal notation" that you mint yourself ("the retry key isn't generated by LINE"). Retry an ambiguous failure with the same key and LINE either processes the request (if it truly failed) or answers 409 The retry key is already accepted with the original request's ID in x-line-accepted-request-id - never a duplicate delivery. The window is the sharp edge: keys are managed for 24 hours, and LINE warns that reusing a key beyond that "will succeed as a new API request... As a result, duplicate messages will be sent."

WhatLimitNotesSource
Header formatUUID in hexadecimal notatione.g. 123e4567-e89b-12d3-a456-426614174000; generated by the developer, one per logical send, reused on every retry of that send.docs ↗
Endpoints that accept itPush, multicast, narrowcast, broadcastThe reply endpoint doesn't need it - its single-use reply token already makes duplicate replies impossible.docs ↗
Key management period24 hours"If you use the same retry key for more than 24 hours, the request will be treated as a new API request" - i.e. a duplicate send.docs ↗
Duplicate-request response409 ConflictBody: {"message": "The retry key is already accepted"}; header x-line-accepted-request-id carries the accepted request's ID, plus sentMessages for push.docs ↗

Text message limits & character counting

Text is capped at 5,000 characters - but "character" means a UTF-16 code unit, so "characters made up of multiple code units (e.g. some Kanji characters, Unicode emojis) are counted as more than one character"; the docs' own example is that the emoji U+1F34E is two characters. LINE emojis add a second trap: their $ placeholders are replaced by alternative text before counting, and "LINE doesn't disclose the alternative text", so a message near the cap "may unintentionally exceed the maximum length and sending the message may fail" - surfacing as 400 The request body has X error(s). A handful of properties (action labels, template text/titles, rich menu names) are counted in grapheme clusters instead.

WhatLimitNotesSource
Text message text5,000 charactersCounted in UTF-16 code units; surrogate-pair characters and emojis count as 2. Applies to text and text (v2) messages.docs ↗
Counting methodUTF-16 code unitsOfficially documented; validate lengths with a UTF-16-aware counter, not byte or grapheme length.docs ↗
LINE emojis per message20"Max: 20 LINE emoji" via the emojis property; each $ placeholder is replaced by undisclosed alternative text before length counting.docs ↗
Text (v2) substitution objects100Max number of objects in the substitution property; object keys are limited to 20 characters of [0-9a-zA-Z_].docs ↗
Grapheme-cluster-counted propertiesLabels, template text/title, rich menu name & chatBarTextException list from the character-counting doc: action object labels, postback/message action text, buttons/confirm/carousel template text and title.docs ↗

Image, video, audio & sticker limits

Media never travels inside the request: message objects carry HTTPS URLs ("Protocol: HTTPS (TLS 1.2 or later)", up to 2,000 characters), LINE's clients fetch the files, and the caps below apply to the hosted files. Getting the transport wrong therefore fails as URL validation (400 with a details array) rather than as an upload error. The reverse direction - downloading what users send you - runs through api-data.line.me and is time-boxed: user-sent content "is automatically deleted after a period of time", after which you get 404 not found, or 410 The content is gone if the user unsent it. Fetch and persist media immediately.

WhatLimitNotesSource
Image (originalContentUrl)JPEG or PNG, max 10 MBHTTPS (TLS 1.2+) URL up to 2,000 characters.docs ↗
Image preview (previewImageUrl)JPEG or PNG, max 1 MBShown in the chat; tapping loads the original.docs ↗
VideoMP4, max 200 MBPlus a JPEG/PNG preview image up to 1 MB. Optional trackingId (max 100 chars) enables the video-viewing-complete event.docs ↗
AudioMP3 or M4A, max 200 MBduration property carries the length in milliseconds.docs ↗
Media URL length2,000 charactersApplies to originalContentUrl and previewImageUrl; URLs must be percent-encoded UTF-8.docs ↗
Sticker messagepackageId + stickerId from the official sticker listOnly stickers in LINE's published sticker list can be sent; arbitrary sticker IDs fail validation.docs ↗
Location message title / address100 characters eachPlus latitude/longitude as numbers.docs ↗
User-sent content retentionAuto-deleted after a period of time"Content that users send is automatically deleted after a period of time." Download promptly via GET /v2/bot/message/{messageId}/content on api-data.line.me; video/audio require a preparation-status check first.docs ↗

Quick reply limits

Quick replies ride along on any message type via the optional quickReply property, capped at 13 button objects per message. Two documented behaviors shape UX design: when a request carries several message objects, "the quickReply property of the last message object is displayed" - buttons attached to earlier messages in the batch never render - and buttons using camera, camera roll, or location actions get default icons when imageUrl is omitted. Exceeding the 13-item cap or pointing icons at non-HTTPS URLs fails validation with 400 The request body has X error(s), naming the offending array index in details[].property.

WhatLimitNotesSource
Quick reply buttons per message13"Max: 13 objects" in quickReply.items.docs ↗
Button icon (imageUrl)PNG, 1:1, max 1 MBHTTPS (TLS 1.2+) URL up to 2,000 characters; "there is no limit on the image size" (dimensions), only file size and format.docs ↗
Display rule with multiple messagesLast message object's quickReply onlyAttach the quick reply to the final message object of the batch.docs ↗

Flex Message limits

Flex Messages are CSS-flexbox-style layouts defined entirely in JSON, and their caps are JSON-size caps: 30 KB for a bubble, 50 KB for a carousel, and at most 12 bubbles per carousel (all bubbles in one carousel must share the same width setting). Every Flex Message also requires altText - up to 1,500 characters - because notifications and chat lists can't render the layout. These are validation limits, so an oversized container returns 400 The request body has X error(s) pointing into contents, well before the 2 MB transport cap at 413 could matter. Component-level constraints (image URLs, text wrapping, video support by LINE version) live in the Flex container and component references.

WhatLimitNotesSource
Bubble JSON sizeMax 30 KB"The maximum size of JSON data that defines a bubble is 30 KB."docs ↗
Carousel JSON sizeMax 50 KB"The maximum size of JSON data that defines a carousel is 50 KB."docs ↗
Bubbles per carousel12"Max: 12 bubbles"; a carousel can't mix bubbles of different widths (size property).docs ↗
altText1,500 charactersRequired; shown in notifications, chat list, and quote messages. Unicode emojis allowed.docs ↗

Template message limits

Template messages (buttons, confirm, carousel, image carousel) are the pre-Flex structured layouts, and their limits are per-field character caps rather than JSON sizes. The pattern to internalize: text allowances shrink when an image or title is present - a buttons template allows 160 characters of text alone but only 60 alongside an image or title, and carousel columns allow 120 alone versus 60 with image/title. Images across templates are JPEG or PNG, up to 1,024px wide and 10 MB, over HTTPS (TLS 1.2+). Blowing any cap fails as 400 The request body has X error(s) naming the field. Note these template text and title fields are counted in grapheme clusters, per the character-counting rules.

WhatLimitNotesSource
altText (all templates)1,500 charactersRequired alternative text shown in notifications, chat list, and quote messages; Unicode emojis allowed.docs ↗
Buttons template: title40 charactersImage: JPEG/PNG, max width 1,024px, max 10 MB.docs ↗
Buttons template: text160 chars (no image/title) / 60 chars (with)Actions: max 4 objects.docs ↗
Confirm template: text240 characters"Set 2 actions for the 2 buttons" - exactly two action objects.docs ↗
Carousel template: columns10Per column: title 40 chars, text 120/60 chars, max 3 actions; image aspect 1.51:1, max width 1,024px, 10 MB.docs ↗
Image carousel template: columns10Images 1:1, JPEG/PNG, max width 1,024px, max 10 MB, one action per column.docs ↗

Imagemap message limits

Imagemaps are single images with tappable regions, and they carry the API's most idiosyncratic asset requirement: you don't send one image URL but a base URL, and LINE's clients append a width segment to fetch the right resolution - so your server must serve the image at the documented widths (240, 300, 460, 700, 1040 pixels) under {baseUrl}/{width}. The baseSize.width is always declared as 1040, with height scaled to match. Misconfigured base URLs typically fail at render time on the client, while structural problems - too many actions, a bad URI scheme in an action - fail upfront as 400 The request body has X error(s) (the docs' own example flags areas[0].action.uri with "invalid uri").

WhatLimitNotesSource
Base image widths to serve240px, 300px, 460px, 700px, 1040pxServed under {baseUrl}/{width}; JPEG or PNG, max 10 MB per file.docs ↗
baseSize.width1040 (fixed)"Width of base image in pixels. Set to 1040." Height set to match the 1040-width aspect.docs ↗
Tappable actions per imagemap50"Max: 50" imagemap action objects; URI actions capped at 1,000 characters, message actions at 400.docs ↗
altText1,500 charactersRequired; Unicode emojis allowed.docs ↗
Imagemap videoMP4, max 200 MBOptional video overlay with JPEG/PNG preview (max 1 MB); post-playback label capped at 30 characters, link URL at 1,000.docs ↗

Rich menu limits

Rich menus are created via JSON object plus a separate image upload to api-data.line.me, and both halves have hard specs. The object caps: 20 tappable areas, a 300-character internal name, 14 characters of chat bar text, and a declared size whose width runs 800-2500px with height at least 250px and aspect ratio (width/height) of at least 1.45. The image must match: JPEG or PNG, within those same dimension rules, at most 1 MB - wrong formats fail with 415 Unsupported Media Type. Quantity is capped at 1,000 rich menus per account via the API (delete before creating past the cap), and operations are heavily rate-limited: 100 create/deletes per hour and just 3 batch link/unlink calls per hour - see 429.

WhatLimitNotesSource
Rich menus per LINE Official Account (API)1,000"You can create up to 1000 rich menus for one LINE Official Account with the Messaging API." At the cap, delete one before creating another.docs ↗
Rich menu aliases per account1,000Aliases power tab-switching via the rich menu switch action.docs ↗
Tappable areas per rich menu20"Max: 20 area objects", each with bounds and an action object.docs ↗
Image format & sizeJPEG/PNG, max 1 MBWidth 800-2500px, height >= 250px, aspect ratio (width/height) >= 1.45. Uploaded to api-data.line.me.docs ↗
chatBarText14 charactersText on the chat bar that opens the menu; counted in grapheme clusters.docs ↗
Rich menu name300 charactersInternal management label, never shown to users.docs ↗
Create / delete rate100 requests per hourLINE Official Account Manager operations are exempt from this restriction.docs ↗
Batch link/unlink rate3 requests per hourThe replace-or-unlink-in-batches endpoint; check progress via the batch-status endpoint (100/hour tier).docs ↗

Webhook rules & redelivery

The LINE Platform delivers events as HTTPS POSTs to your registered webhook URL, signing every request: x-line-signature is the Base64 encoding of the HMAC-SHA256 digest of the raw request body, keyed with your channel secret - and LINE tells you to verify it rather than filter by IP, because "the IP address of the LINE Platform... isn't disclosed." Your server must return 200 (LINE may also POST an empty events array to confirm communication). Redelivery of failed webhooks exists but is opt-in and deliberately vague: enabled in the console, triggered when you didn't return 2xx, with attempt count and interval "not disclosed... subject to change without notice." Registration failures surface as 400 Invalid webhook endpoint URL; for silent-bot debugging, start with the webhook debugging guide.

WhatLimitNotesSource
Signature headerx-line-signature: Base64(HMAC-SHA256(channel secret, body))Compute over the raw request body bytes; header field names are case-insensitive and may change case without notice.docs ↗
Required responseHTTP 200 (2xx)"The bot server must return status code 200"; process events asynchronously so responses stay fast.docs ↗
Webhook transportHTTPS POST onlyURL registered per channel in the LINE Developers Console; IP allowlisting is impossible by design - verify signatures instead.docs ↗
Communication checkEmpty events array"The LINE Platform may send an HTTP POST request that doesn't include a webhook event" - return 200 to {"destination":"...","events":[]}.docs ↗
RedeliveryOpt-in; count & interval undisclosedConditions: redelivery enabled and no 2xx returned. "The number and interval of the webhook redelivery aren't disclosed... subject to change without notice." Not guaranteed; can be force-disabled if volume affects the platform.docs ↗
Redelivered event contentsSame webhookEventId & reply tokenOnly deliveryContext.isRedelivery changes (true). Deduplicate by webhookEventId; order may differ from event order - check timestamp.docs ↗
Webhook settings API rate1,000 requests per minuteSet/get webhook endpoint URL pair; the test-webhook endpoint sits in the 60/hour tier.docs ↗

Audience limits

Audiences are the recipient lists behind narrowcast, and every stage is capped. A channel can hold 1,000 audiences; an upload audience takes 10,000 user IDs when created by JSON but 1,500,000 when created by file upload (on api-data.line.me); descriptions run to 120 characters. Processing is asynchronous with a hard parallelism ceiling - at most 10 upload/update jobs QUEUED or WORKING per audience at once, beyond which requests fail with 429. Audiences must reach READY status before a narrowcast can reference them (400 Invalid audience group id otherwise), and privacy floors apply at send time: each targeted audience generally needs 50+ recipients - see 403 Not enough recipients.

WhatLimitNotesSource
Audiences per channel1,000"The number of audiences per channel | Max limit: 1,000."docs ↗
User IDs per upload audience (JSON)10,000Use the by-file endpoint for anything larger.docs ↗
User IDs per upload audience (file)1,500,000Text-file upload on api-data.line.me; also used for adding IDs to an existing audience.docs ↗
Audience description120 charactersThe audience's display name in campaign tooling.docs ↗
Concurrent upload/update operations10 per audience IDJobs with jobStatus QUEUED or WORKING count; exceeding returns 429 - wait and retry.docs ↗
Audience management API rate60 requests per minuteApplies across create/update/get/delete audience endpoints.docs ↗
IFA-based audiencesCorporate application required"Only available to corporate users who have completed certain applications" - otherwise 403.docs ↗

LINE guides and tools

Other platforms

Frequently asked questions

What is the LINE Messaging API rate limit?

It depends on the endpoint, applied per channel. Most endpoints - including send reply and send push - allow 2,000 requests per second. Multicast allows 200/s, the loading animation 100/s, issuing short-lived tokens 370/s. Broadcast, narrowcast, and most insight endpoints allow only 60 requests per hour, audience management 60 per minute, rich menu create/delete 100 per hour, and the rich menu batch-link endpoint just 3 per hour. Exceeding any of them returns 429.

How many free messages does a LINE bot get per month?

It depends on your LINE Official Account's subscription plan, and plans vary by country or region, so there is no single global number. LINE's documented Japan example: up to 200 free messages on the free Communication Plan, 5,000 on the Light Plan, and 30,000 on the Standard Plan, with paid additional messages available on the Standard Plan. Only push, multicast, narrowcast, and broadcast consume the allowance - replies are free.

Are LINE reply messages really unlimited?

Reply messages are listed in the pricing docs under sending methods that are not counted as message count, so they never consume your monthly quota. They are still bound by everything else: one single-use reply token per webhook event, roughly one minute to use it, at most 5 message objects per reply, and the 2,000 requests-per-second endpoint rate limit.

How long is a LINE reply token valid?

Reply tokens can only be used once and must be used within one minute after receiving the webhook - use beyond one minute isn't guaranteed to work. Tokens in redelivered webhooks are usable within one minute of the redelivery unless the original token was already used or 20 minutes have passed since the event. LINE warns the limit can change without notice and says to reply as soon as possible.

What is the character limit for a LINE text message?

5,000 characters, counted in UTF-16 code units - surrogate-pair characters like many emojis count as two. A message can carry at most 20 LINE emojis, and their $ placeholders are replaced by undisclosed alternative text before counting, which can push a near-limit message over. Some properties (action labels, template text and titles, rich menu names) are counted in grapheme clusters instead.

How many messages can a LINE bot send in one request?

Up to 5 message objects per request, on reply, push, multicast, narrowcast, and broadcast alike. Multicast additionally accepts up to 500 user IDs per request, and quota counts per recipient: 5 message objects multicast to 500 people count as 500 messages, not 2,500 - the number of message objects doesn't affect the count. The whole request body must stay under 2 MB.

How many quick reply buttons does LINE allow?

13 quick reply button objects per message, defined in the quickReply.items array. Each button can carry an optional PNG icon with a 1:1 aspect ratio up to 1 MB, served over HTTPS (TLS 1.2 or later). If a request contains several message objects, only the last message object's quick reply is displayed to the user.

What are the size limits for LINE Flex Messages?

The JSON defining a bubble may be at most 30 KB, and a carousel at most 50 KB with up to 12 bubbles. Every Flex Message also needs altText of up to 1,500 characters, shown in notifications and chat lists. These caps are enforced by request validation, so an oversized container fails with a 400 details array, not a 413.

What are the LINE rich menu image requirements?

JPEG or PNG, 800 to 2500 pixels wide, at least 250 pixels tall, aspect ratio (width divided by height) of 1.45 or more, and at most 1 MB, uploaded to api-data.line.me. A rich menu can define up to 20 tappable areas, chat bar text is capped at 14 characters, and you can create up to 1,000 rich menus and 1,000 rich menu aliases per LINE Official Account via the API.

Does LINE retry webhook deliveries that fail?

Only if webhook redelivery is enabled in the LINE Developers Console - it's off by default. LINE then re-sends webhooks that didn't get a 2xx response, for an undisclosed number of attempts at undisclosed intervals; redelivered events keep the same webhookEventId and reply token, with deliveryContext.isRedelivery set to true. Deduplicate by event ID and verify every request's x-line-signature (Base64 HMAC-SHA256 of the body with your channel secret).

Build on LINE without tracking every limit yourself

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