Skip to content

Errors and limits

Errors are JSON and always carry a message you can log:

{ "statusCode": 402, "error": "Payment Required", "message": "Insufficient balance" }
CodeMeaningWhat to do
400The payload is malformed or a field is missing.Fix the request. Retrying will not help.
401Missing or invalid API key.Check the x-neike-api-key header.
402Not enough balance in your Neike wallet.Top up in the console. Nothing was queued. This is not Meta’s billing — see below.
403The key is valid but lacks the required scope.Issue a key with the scope the endpoint declares.
404The channel does not exist, is not yours, is inactive, or has no credentials.Check the channelId. An inactive or credential-less channel also returns 404: its status is shown in the channel list in the console.
409The resource already exists.Treat as success if you are retrying.
5xxOur problem.Retry with backoff.

Only 5xx and network failures are worth retrying automatically. Everything in the 4xx range is a request you need to change.

A 402 is about the Neike wallet: what you pay us for the service. It is the only payment this API can see, which makes it easy to assume that a funded wallet means you can send. It does not.

Meta bills you separately for the messages themselves, against your own WhatsApp Business Account. Neike is a technical provider: we never pay that for you and cannot add a payment method on your behalf. If it is missing, requests still return 202 — we accepted them — and Meta fails the delivery afterwards with error 131042, “Business eligibility payment issue”.

Add it on your WhatsApp Business Account, following Meta’s guide. The console flags a channel when it detects the account has none.

A send that was accepted can still fail at Meta — an invalid number, a closed 24-hour window, a rejected template, a missing payment method on your Meta account. That never comes back as an HTTP error, because the HTTP call already finished. It arrives as a status webhook with failed and the reason Meta gave.

The ones you will actually hit:

Meta codeWhat it meansWhat to do
131042Business eligibility payment issue: something is wrong with your payment method at Meta.Add or fix the payment method on your WhatsApp Business Account. Retrying changes nothing.
131047More than 24 hours passed since the contact last replied.Send an approved template instead of free-form text.
131026Undeliverable: the number may not be on WhatsApp, or has not accepted Meta’s terms.Check the recipient. Do not retry.
132001The template does not exist in that language, or is not approved yet.Check the name, language and status in the console.
130429Cloud API throughput limit reached.Slow down and retry.

The console translates these in Deliveries and keeps Meta’s original text next to the translation. The full list is Meta’s error code reference.

Every attempt is recorded, so a delivery that failed on your side can be replayed from the console rather than resent by hand.

There are two kinds of limits, and both answer with 429.

Neike’s request limit. Every API key has a request quota per minute, and so does your whole account (all its keys together). When you exceed it, Neike answers 429 with a Retry-After header holding the seconds to wait. Wait that long, then retry, and back off if it keeps happening. The quota is a fixed window, so a burst of up to twice the limit can land around the moment the window resets. Routes that are free and synchronous, such as POST /api/messages/typing (it calls Meta during the request and is not billed), have their own lower quota. The same limits apply to the MCP endpoint (/mcp). Console sessions are not limited. The default values are 600 requests per minute per key and 1200 per account, and 120 and 240 for typing.

Meta’s limits. They depend on your channel’s quality rating and messaging tier, both visible per channel in the console. Sending faster than your tier allows gets throttled at Meta and lowers the rating. A 429 from Meta carries Meta’s original text in the message and has no Retry-After header, which is how you tell the two apart.