AUTHENTICATION_ERROR
Authentication failed.
The API key is missing, mistyped, revoked, or used from an address outside its allow-list. Send Authorization: Bearer <secret> with the full secret shown when the key was created.
Using the API well
Every error has the same shape, a stable code you can branch on, and a docUrl that links to its entry on this page.
HTTP/1.1 422 Unprocessable Entity
{
"error": {
"code": "SERVICE_WINDOW_CLOSED",
"type": "policy_error",
"message": "Free-form messages require an open 24-hour service window.",
"retryable": false,
"retryAfterSeconds": null,
"docUrl": "https://shipmsg.com/docs/errors#SERVICE_WINDOW_CLOSED",
"requestId": "req_FjLKGlzDxsiDKsIz",
"providerCode": 131047,
"details": [{ "path": "type", "issue": "…" }]
}
}retryable is the only thing that says whether retrying can help. When it is true, wait retryAfterSeconds (or the Retry-After header) and retry with the same Idempotency-Key.providerCode is WhatsApp’s own error code, when the refusal came from WhatsApp. details lists each invalid field for validation errors. requestId when you contact support; it also finds the call in your request log. The same list is available as JSON at GET /v1/errors (no key needed). Failed messages carry the same codes in data.error on message.failed.
API error messages below are shown exactly as returned by the API. The explanations are translated.
The request could not be tied to a valid credential. Fix the key or signature; retrying unchanged will fail again.
Authentication failed.
The API key is missing, mistyped, revoked, or used from an address outside its allow-list. Send Authorization: Bearer <secret> with the full secret shown when the key was created.
The API key is disabled.
The key was disabled in the console or by an administrator. Re-enable it or create a new key.
This key requires request signing.
This key is configured to require signed requests. Turn on request signing in your SDK (the signing option) or add the X-ShipMessages-Key, -Timestamp, -Nonce and -Signature headers.
The request signature is invalid.
The signature did not match. Sign the exact bytes you send, with the path and query in canonical order, and keep your clock within 5 minutes of real time.
The request signature was already used.
The nonce was already used. Every signed request needs a new random nonce; the SDKs generate one per attempt.
Request signing verification is temporarily unavailable.
Signature checking is briefly unavailable. Retry after a short wait; nothing was processed.
A completed challenge is required before another sign-in attempt.
Several failed sign-ins in a row: the next sign-in must include a solved challenge.
The challenge response could not be verified.
The challenge answer was rejected or expired. Solve a new challenge and sign in again.
The credential is valid but may not do this. Use a key or role with the needed permission.
Insufficient permission.
The key or user lacks the permission (scope) this endpoint needs, or the resource belongs to another account or environment. Check the key's scopes and that a sandbox key is used with sandbox resources.
Step-up authentication is required.
This action is sensitive and needs a fresh second-factor confirmation from a signed-in user. It cannot be done with an API key alone.
This action requires approval.
Your account requires a second person to approve this action. It has been queued for approval; it runs once approved.
The request itself is wrong. Read details for the field and fix the request before sending it again.
The request is invalid.
A field is missing, has the wrong type or is out of range. details lists each problem as a field path and an issue.
Resource not found.
No such resource in this account and environment. Check the SID, and that sandbox and live resources are not mixed.
This method is not supported for this path.
This path exists, but does not support the requested HTTP method. Use a method listed in the Allow response header and the API reference; do not retry the same method.
The sender does not have this capability.
The sender cannot send this kind of message (for example a Flow or a product message) until the capability is enabled on its WhatsApp Business Account.
The media is not ready yet.
The uploaded media is still being scanned or processed. Wait until its state is READY, then send.
The media was rejected.
The media failed the safety scan or is an unsupported type or size. Upload a different file.
This recipient addressing is not supported for this message.
This message type cannot be sent to that kind of address (for example a username instead of a phone number). Address the recipient by phone number.
The recipient username is invalid.
The WhatsApp username is not in a valid format.
The status callback endpoint is not verified.
A per-message status callback must point at a webhook endpoint that has passed verification. Verify the endpoint first.
The template name is locked.
A template with this name was deleted recently; WhatsApp does not allow reusing the name for 30 days. Pick another name.
The template cap has been reached.
The WhatsApp Business Account has reached its template limit. Delete unused templates.
The Idempotency-Key clashes with another request. See the idempotency guide.
Idempotency key reused with a different request.
The Idempotency-Key was already used within 24 hours for a different request body or endpoint. Use a new key for a new request.
A request with this idempotency key is still in progress.
The first request with this key is still running. Wait a moment and retry with the same key; you will receive its result.
Too many requests. Wait retryAfterSeconds (also in the Retry-After header), then retry.
Rate limit exceeded.
A rate limit was exceeded. Wait retryAfterSeconds, then retry. The RateLimit-Policy header names the limit you hit.
The provider is rate limiting this sender.
WhatsApp is throttling this sender. The message is retried automatically when queued; for direct calls, wait and retry.
The request is well formed, but a rule stops it: account state, consent, a WhatsApp policy or a limit. Change the situation, not the request.
The account is suspended.
The account is suspended, so it cannot send. The console explains why and what is needed to lift it.
The contracted message allowance has been reached.
The request is well formed, but a rule stops it: account state, consent, a WhatsApp policy or a limit. Change the situation, not the request.
Insufficient funds.
The prepaid balance cannot cover this message. Top up the wallet or change the billing mode.
The sender is not ready to send.
The sender (phone number) is not connected or verified yet. Finish onboarding, or use a sender whose status is CONNECTED.
The sender is restricted.
WhatsApp has restricted this number, usually after quality problems. Sending resumes when the restriction ends.
The sender is restricted for template messaging.
The number may not send template messages for now. Replies inside an open service window still work.
The template is not approved.
The template does not exist in that language, or WhatsApp has not approved it. Check its name, language and status.
The template is paused.
WhatsApp paused the template because recipients reported or blocked it. Edit it or wait for the pause to end.
Free-form messages require an open 24-hour service window.
Free-form messages (text, media, interactive) are allowed only within 24 hours of the customer's last message. Send an approved template instead.
Consent is required for this message.
Your account requires recorded opt-in before this kind of message. Record the contact's consent first.
The recipient is suppressed for this message.
The number is on a suppression list for this kind of message (for example after a hard failure or a manual block).
The recipient opted out.
The contact opted out of this kind of message. Do not send it again unless they opt back in.
The recipient reached the marketing message cap.
WhatsApp limits how many marketing messages one person receives. Send later; with deferIfCapped the message waits automatically.
The destination is blocked by policy.
Your account's policy blocks this destination (a country or number range).
The market is excluded.
Messages to this country are not available for this account or message category.
The business portfolio messaging limit is exhausted.
The business has used its daily limit of new conversations. It resets on a rolling 24-hour basis and grows as quality stays high.
The transport does not support this message category.
The chosen transport cannot carry this template category (for example a non-marketing template on the Marketing Messages API).
The message was blocked by the risk engine.
The message was held back by fraud and abuse checks. Contact support if you think this is wrong.
Coexistence numbers cannot be deregistered.
A number shared with the WhatsApp Business app cannot be deregistered from the API; disconnect it from the app side.
The phone number cap has been reached.
The WhatsApp Business Account already has the maximum number of phone numbers.
Live onboarding is not permitted until the platform's Meta application is production-ready.
Connecting live numbers is not open yet on this platform. Use the sandbox until it is.
The chosen data localization region conflicts with this account's data residency policy.
The data region you chose conflicts with the account's data residency policy. Pick an allowed region.
The Flow is blocked by the provider.
WhatsApp has blocked this Flow. Check its health in the console.
The resource is not in a state that allows this action. Read it again and act on its current state.
The resource state conflicts with this action.
The resource changed or is in the wrong state for this action. Read it again and retry against its current state.
The account's regional routing ownership is ambiguous.
More than one region claims this account. Contact support with the requestId so ownership can be corrected; do not create another account or change regions to retry the operation.
The message can no longer be canceled.
The message has already been handed to WhatsApp, so it can no longer be canceled.
The message expired.
The message passed its validity period before it could be sent, so it was not sent.
The operation cannot be retried.
This operation cannot be retried; check retryEligible on the operation before retrying.
The onboarding code expired.
The onboarding code has expired. Start the connection again to get a new one.
The WABA is not connected.
The WhatsApp Business Account is not connected to ShipMsg. Reconnect it in the console.
The conversation changed since it was loaded.
Someone else changed the conversation after you loaded it. Reload it and try again.
Another principal holds the conversation composer claim.
Another agent is replying in this conversation right now.
An active composer claim is required for this reply.
Take the conversation's reply claim before replying from an inbox.
The Flow is not published.
Only published Flows can be sent. Publish the Flow first.
The sender does not have a verified Flow encryption public key.
Data-exchange Flows need the sender's Flow encryption public key to be uploaded and verified.
The WABA is not onboarded for the Marketing Messages API.
The WhatsApp Business Account has not accepted the Marketing Messages API terms. Complete that step, or send through the Cloud API transport.
Detailed analytics are temporarily limited to the last 7 days; the requested range is outside that window.
Detailed analytics are limited to the last 7 days right now. Ask for a shorter range.
WhatsApp (Meta) refused or failed the request. providerCode carries Meta's own code when there is one.
The provider returned a temporary error.
WhatsApp had a temporary failure. Retrying is safe; queued messages are retried automatically.
The provider returned a permanent error.
WhatsApp refused the request for good. providerCode has Meta's reason; change the request before trying again.
The provider result is unknown.
WhatsApp did not say whether it accepted the message. ShipMsg does not resend it blindly; the final status arrives as an event, or the message is reported as unknown.
The provider credential is invalid.
The WhatsApp connection's credential is no longer valid. Reconnect the WhatsApp Business Account.
The WABA is restricted by the provider.
WhatsApp has restricted the business account. The console shows the reason and any appeal path.
The provider requires a payment method on the WABA.
WhatsApp needs a payment method on the WhatsApp Business Account before it will send.
Sender registration failed at the provider.
WhatsApp refused to register the phone number. Check the number and its verification code.
The provider could not process the media.
WhatsApp could not process the media file. Try another format or a smaller file.
The Flow is blocked or throttled.
WhatsApp blocked or throttled the Flow.
Marketing Messages API error.
The Marketing Messages API refused the message; providerCode has the reason.
The recipient cannot receive WhatsApp messages.
The number does not have WhatsApp or cannot receive messages. Do not retry.
The recipient is in a provider experiment group.
WhatsApp is holding back marketing messages to this person as part of its own experiment. Nothing to fix.
The provider rejected the template message.
WhatsApp rejected the template message, usually for wrong or missing parameters. Compare the parameters with the template.
The sender display name is not approved.
The sender's display name is not approved by WhatsApp yet, so it cannot send.
Something failed inside ShipMsg. Retry only when retryable is true; otherwise contact support with the requestId.
A temporary internal error occurred.
A temporary failure inside ShipMsg. Retry with the same Idempotency-Key.
Regional account routing is temporarily unavailable.
Regional discovery is temporarily unavailable. Wait before retrying, or use your account's known regional API address. Keep the same Idempotency-Key when retrying a mutation.
The account's regional API is temporarily unavailable.
Your account's regional API could not be reached. A mutation may already have been accepted: check its status and reuse the same Idempotency-Key when retrying. Do not send it to a different region.
An internal error occurred.
An unexpected failure inside ShipMsg. Contact support with the requestId.
The message could not be prepared for sending; nothing was sent to the provider.
ShipMsg could not assemble the message (for example a template variable could not be filled). Nothing was sent.
Webhook delivery failed.
Delivering an event to your endpoint failed. It is retried with backoff; see the webhook's delivery log.