Genuka WA docs

WhatsApp error 4: app rate limit reached — fix

WhatsApp error 4 (API Too Many Calls): the app hit its Meta API call rate limit. How it differs from 80007 and 130429, and how to retry safely.

WhatsApp error 4 means the application calling Meta's API has reached its call rate limit. It is a temporary throttle: nothing is broken, you need to wait and send fewer requests. It applies to the application as a whole, not to one number or one WhatsApp account, which is what sets it apart from errors 80007 and 130429.

What does error 4 mean?

Meta lists it among the Cloud API's throttling errors:

"The app has reached its API call rate limit." — Meta, Cloud API error codes

The suggested fix: open the app in the App Dashboard, Application Rate Limit section, confirm the limit was reached, then try again later or reduce the frequency and number of requests. The Graph documentation calls this code "API Too Many Calls", a temporary throttling issue: "Wait and retry the operation, or examine your API request volume" (Meta, Graph API error handling). Its rate limit page adds that code 4 means the app whose token is used in the request has reached its limit (Meta, Rate limits).

Four limits, four codes

CodeWhat is countedScope
4The application's API callsThe whole application
80007An app's calls on a WhatsApp account: 200 per hour by default, 5,000 on an active account with a registered numberOne app and one WhatsApp account
130429Messages per second: 80 by defaultOne number
131056Messages to the same recipient: one every 6 secondsOne sender and recipient pair

The figures come from Meta's platform overview (Meta, About the platform).

When does error 4 happen?

  • A burst of calls that are not sends: listing templates in a loop, re-reading every number's health on each dashboard load, uploading media back to back.
  • Several services on the same app: a campaign worker, a back office and a sync script sharing one token add up their calls.
  • A retry loop with no delay: each failure fires another call immediately, and the limit moves further away instead of closer.

Where do you see it in Genuka WA?

With Genuka WA, the Meta application making the call is Genuka's, as Tech Provider: the application limit does not depend on your volume alone. Genuka puts code 4 in the retryable class.

ChannelWhat you get
POST /api/v1/messages400, "error": "send_retryable", meta.code: 4, meta.retryable: true
CampaignEach recipient gets up to three attempts in total (two retries), waiting 0.25 to 0.5 s then 0.5 to 1 s, before turning failed
POST /api/v1/templates422, "error": "meta_rejected", meta.retryable: true if Meta answered with a 4xx; 502 if it answered 429 or 5xx

That 502 arrives without a JSON body: our CDN replaces the response with the single line error code: 502 (API reference). Treat it as a transient failure, without looking for meta in it.

Genuka also limits the bursts it could cause on your behalf: GET /api/v1/numbers?refresh=true refuses the call (400 too_many_connections) above 25 numbers, so narrow it with ?companyId=; and a template refresh processes WhatsApp accounts five at a time.

How do I fix error 4?

Retry with a growing delay, only when meta.retryable is true or on a 5xx with no JSON body. A single send is not retried by Genuka WA on your behalf: your code has to wait, doubling the delay on each attempt and adding a little randomness so your workers do not all restart together.

For a send, retry only when meta.code is present (4, 80007, 130429…). A timeout between Genuka and Meta is also marked retryable, with no meta.code, even though Meta may already have accepted the message; the API has no idempotency key, and sending it again can deliver it twice.

Drop unnecessary read calls. GET /api/v1/numbers without refresh=true returns the stored state, kept current by Meta's webhooks. Template statuses arrive by webhook; the POST /api/v1/templates/sync refresh is a repair path, and once an hour is plenty (API reference).

If the error lasts more than an hour, contact Genuka support with the x-request-id header and meta.traceId: Graph limits are counted over a rolling hour.

If you call the Cloud API with your own app, the App Dashboard shows the app's current Application Rate Limit usage and the number of rate-limited users (Meta, Rate limits).

const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));

export async function callGenuka(path: string, body: unknown, maxAttempts = 5) {
  for (let attempt = 1; ; attempt++) {
    const response = await fetch(`https://wa.genuka.com/api/v1${path}`, {
      method: "POST",
      headers: {
        Authorization: `Bearer ${process.env.GENUKA_WA_API_KEY}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify(body),
    });
    // A 5xx arrives without JSON: our CDN replaces it with "error code: 502".
    const json = await response.json().catch(() => null);
    if (response.ok) return json.data;

    // A send is only retried on a Meta code (4, 80007, 130429…): after a timeout, Meta may
    // already have accepted the message, and sending it again would deliver it twice.
    const retryable =
      path === "/messages"
        ? json?.meta?.retryable === true && json.meta.code !== undefined
        : response.status >= 500 || json?.meta?.retryable === true;
    if (!retryable || attempt >= maxAttempts) {
      throw new Error(`${response.status} ${json?.error ?? "no JSON body"} (Meta ${json?.meta?.code ?? "-"})`);
    }
    const base = Math.min(30_000, 1_000 * 2 ** (attempt - 1));
    await sleep(base / 2 + Math.random() * (base / 2));
  }
}

How do I prevent error 4?

  • Prefer webhooks to polling. Message statuses, template reviews and quality changes arrive on their own; asking for them in a loop burns the limit for nothing.
  • Send bulk through a campaign. Genuka paces the send to the number's throughput and handles retries recipient by recipient — see campaigns over the API.
  • Never retry at a fixed interval. Three attempts one second apart replay the same burst at the same moment.
  • 80007: an app's call limit on one WhatsApp account.
  • 130429: a number's messages-per-second throughput.
  • 131056: too many messages to the same recipient in a short time.

FAQ

Does error 4 come from my Genuka API key?

No. It is a Meta code, relayed in meta.code. It concerns the Meta application making the call, Genuka's, not your key.

How long should I wait?

Meta gives no fixed duration for code 4: Graph limits are computed over a rolling hour. Start with a growing delay, from one to thirty seconds, and cut down your calls; if the error lasts more than an hour, tell support.

Is a message refused with code 4 billed?

Meta did not accept it, so there is no message to bill. On the Genuka WA side, only messages Meta accepted count against your plan's quota.

Sources

On this page