Drawing 1 · Interactive
Back off one recipient, not the whole number
Attempt 3 of 5
t = 5 s
- Attempt 1 at 0 ms: failed.
- Attempt 2 at 1 s, after waiting 1 s: failed.
- Attempt 3 at 5 s, after waiting 4 s: succeeded.
The delay formula · retry n = 1
delayn = base × factorn
= 1 s × 41 = 4 s
sleep = delay = 4 s
Fires at t = 5 s, 4 s after attempt 2.
24 clients, same outage · retry n = 1
Without jitter all 24 retry at exactly 4 s: a thundering herd that can knock the server over again.
Attempt 3 at 5 s succeeded.
What is the pair rate limit?
The pair rate limit is a WhatsApp Cloud API limit on messages between one pair: a single business phone number and a single WhatsApp user. If a number sends too many messages to the same recipient in a short period, further sends to that user are refused with error code 131056. In Meta's error reference, the cause is a sender number messaging the same recipient number too often in a short time.
It is separate from throughput. Throughput caps the total messages per second a number can send across all recipients: 80 per second by default, with an automatic upgrade path to 1,000. Exceeding throughput returns error 130429. The pair limit applies even when you are far below throughput. A number sending ten messages a second spread across thousands of users is fine, while a number firing a rapid series at one user can be throttled for that user alone.
The limit tolerates short bursts: a reply followed by a couple of follow-up bubbles is normal conversation. What it throttles is sustained rapid sending to one person: a burst borrows from the pair's future allowance, so the sender then has to wait before that user can receive more. Meta's guidance is to retry after 4^X seconds (1, 4, 16 and so on, with X rising after each failure), and its error reference notes that you can keep messaging other numbers without waiting. So the right design is a per-recipient queue with backoff, not a global slowdown, and not a hard-coded per-user rate that breaks when Meta tunes the limit.
Key takeaways
- The pair rate limit caps how quickly one business number can send to one WhatsApp user, separately from overall throughput.
- Hitting it returns error 131056. Other recipients are unaffected, so only that user's queue should pause.
- Short bursts are tolerated, but sustained rapid sends to a single recipient are throttled.
- Don't hard-code a per-user rate. Pace each recipient and back off on 131056, retrying after 1, 4, 16… seconds as Meta suggests.
- The usual causes are bots that split one answer into many bubbles, and retry loops that resend the same message.
Design intent
Why does the pair rate limit matter?
Error 131056 tends to appear exactly where it hurts. A chatbot answers one question with six separate messages. An order flow sends the confirmation, invoice, tracking link and survey in the same second. A retry loop resends on every timeout. Each failure is a message the customer never sees. The naive fix, pausing the whole sender, delays every other conversation too. Handling the limit per recipient stops one noisy thread from slowing the entire number.
Operating sequence
How does the pair rate limit work?
Messages leave one number for one user
Every send counts against the pair: your phone number ID and the recipient's WhatsApp ID. Sends to other users count only against throughput.
Short bursts pass
A handful of messages in quick succession is normal conversation and is usually accepted.
Sustained rapid sends trip the limit
Keep sending to the same user at a high rate, and the API starts refusing sends to that recipient with error 131056. The code can come back in the API response or in a
failedstatus webhook.Back off for that recipient only
Hold that user's queue and retry with exponential backoff and jitter. Keep sending to everyone else at full speed, because other recipients are not affected.
Send fewer messages
For the long term, merge bubbles into one message, use interactive lists or buttons instead of a series of texts, and space out automated sequences.
Implementation
The pair rate limit in code
// One queue per recipient: a 131056 pauses only that user's sends.const queues = new Map(); // wa_id -> promise chainconst URL = "https://graph.facebook.com/v26.0/" + process.env.PHONE_NUMBER_ID + "/messages";async function sendWithPairBackoff(payload, attempt = 0) {const res = await fetch(URL, {method: "POST",headers: {Authorization: "Bearer " + process.env.ACCESS_TOKEN,"Content-Type": "application/json",},body: JSON.stringify(payload),});if (res.ok) return res.json();const { error } = await res.json();if (error?.code === 131056 && attempt < 4) {// Meta's suggested schedule: wait 4^X seconds (1 s, 4 s, 16 s, 64 s),// plus up to 25% jitter so parallel workers don't retry in lockstep.const wait = 1_000 * 4 ** attempt * (1 + Math.random() * 0.25);await new Promise((r) => setTimeout(r, wait));return sendWithPairBackoff(payload, attempt + 1);}throw Object.assign(new Error(error?.message ?? "send failed"), { code: error?.code });}export function enqueue(payload) {const prev = queues.get(payload.to) ?? Promise.resolve();const next = prev.catch(() => {}).then(() => sendWithPairBackoff(payload));queues.set(payload.to, next);return next;}
Messages to the same user go out in order, one at a time. Messages to other users never wait behind them.
Specifications
The pair rate limit: key facts and limits
- Error code
- 131056
- Scope
- One business number to one WhatsApp user
- Threshold
- Set by Meta and tunable; don't hard-code it
- Bursts
- Tolerated, but they borrow from the pair's future allowance
- Meta's retry schedule
- 4^X seconds: 1 s, 4 s, 16 s, 64 s…
- Other recipients
- Unaffected; keep sending to them
- Often confused with
- 130429 (throughput), 131049 (per-user marketing limit)
- Recommended response
- Per-recipient backoff with jitter
Example: A chatbot that talked too fast
A Hyderabad coaching institute's admissions bot answered "What courses do you have?" with nine separate text bubbles sent back to back, one per course. Applicants who asked follow-ups straight away started seeing gaps, and the logs showed error 131056 on the later bubbles. The team replaced the nine bubbles with one interactive list message, and added a per-recipient queue that waits and retries on 131056. The failures stopped, and the same answer now costs one message instead of nine.
Failure modes
Common mistakes with the pair rate limit
Pausing the whole number on 131056
The limit is per recipient. Throttling every send because one user tripped it delays thousands of unrelated conversations. Key your backoff on the recipient's WhatsApp ID.
Retrying immediately in a tight loop
Instant retries keep the pair hot and make the throttling last longer. Wait with exponential backoff and jitter, and cap the number of retries.
Treating 131056 like 131049
Error 131049 is the per-user marketing limit, where Meta advises waiting at least 24 hours before retrying. 131056 clears much sooner. Branch on the exact code, not on "some rate limit".
Splitting one answer into many bubbles
Bots that send each paragraph as a separate message hit the pair limit. Since 1 October 2026, they also pay for every bubble in India. Combine the text, and use list or button messages.
Recommended practice
Best practices for the pair rate limit
- Keep a send log for each recipient, so you can spot bursts before they become errors.
- Add a short delay between automated messages in a sequence to the same user.
- Watch
failedstatus webhooks as well as API responses for code 131056. - Alert on the hourly rate of 131056 errors. A spike usually means a bot loop.