Error codes
Every error code that can show up in an EchoCue API response or webhook event - what causes it, whether it'll resolve on retry, and how to fix it.
Error response shape
All EchoCue API errors share the same envelope. The error_code sits directly inside data, alongside any context-specific fields the endpoint provides:
{
"status_id": 4xx | 5xx,
"message": "Human-readable summary",
"data": {
"error_code": 132001, // Meta or EchoCue code (string or number)
// ... endpoint-specific context fields below ...
"can_send_freeform": false, // example: WhatsApp 24h-window failures
"can_send_template": true,
"available_templates": [ ... ]
}
}
Branch your client logic on data.error_code - the canonical identifier. The message field is human-readable copy for logs and UI surfacing; it can change without notice.
For WhatsApp send failures, error_code mirrors Meta's WhatsApp Cloud API code so you can cross-reference the official Meta documentation if needed.
Permanent vs retryable
EchoCue's notification worker auto-retries some failures and gives up on others. The classification:
- Retryable. Transient failures (rate limit, network blip, server overload). EchoCue retries a few times with backoff before giving up.
- Permanent. Will not succeed on retry no matter how many times we try (invalid recipient, missing template, format mismatch). EchoCue marks the notification as failed, refunds the credit, and stops.
String error codes returned in data.error_code when the failure is in EchoCue's logic (not in Meta).
HTTP 403 - Conversation window closed
You tried to send a freeform WhatsApp message but the 24-hour conversation window is closed (recipient hasn't messaged you in 24h).
FixSend an APPROVED template instead. Once the recipient replies, freeform is allowed for the next 24h.
HTTP 403 - Template required
The test endpoint requires an open conversation window for freeform sends. Window is closed, but you have approved templates available.
FixUse /api/whatsapp/send with a template_id instead of the test endpoint.
HTTP 409 - Template WABA not linked
You tried to send a template approved on a Meta Business Account that you no longer have linked.
FixRe-link the WABA, or pick a template approved on a currently-linked account.
HTTP 409 - Device + WABA mismatch
You passed device_id for a device on Account A but the template was approved on Account B.
FixOmit device_id (EchoCue will pick the right device automatically) or pick a template approved on Account A.
HTTP 403 - Links not allowed on this plan
Your plan disallows URL links in messages and your message contains one.
FixUpgrade your plan, or remove the URL from the message body.
HTTP 403 - Device is pre-blocked from sending
The WhatsApp device EchoCue would have routed this send through is in a blocked state - typically because a previous send returned a Meta account / token / WABA-level error (e.g. 131042 no payment method, 190 token expired) and the device was flagged. Returned with the device's block code and human reason in data.
FixOpen WhatsApp settings to see the block reason. Re-link the device or fix the underlying Meta-side issue (payment method, expired token, etc.). The block clears automatically on the next successful send after the underlying issue is resolved.
HTTP 400 - WABA could not be resolved from the Meta sign-in
Returned during the WhatsApp Embedded Signup flow when EchoCue exchanges Meta's auth code for an access token but cannot find a WhatsApp Business Account granted to that token. Typically means the user closed Meta's popup before picking a WABA, or revoked permissions mid-flow.
FixRestart the Connect-with-Meta flow and ensure a Business + WhatsApp Business Account is selected on Meta's popup before clicking Continue.
HTTP 400 - WABA has no phone number attached
Returned during Embedded Signup when the WABA selected by the user is brand-new and doesn't have a WhatsApp phone number registered against it yet.
FixIn Meta Business Manager → WhatsApp Manager → Phone numbers, add a number to the WABA, then click Connect with Meta again.
HTTP 402 - Insufficient credits
Workspace credit balance is zero (only applies to SMS via cloud number, not WhatsApp).
FixTop up credits on the Billing page, or switch to WhatsApp (which is unlimited on plans that include it).
Recipient is not a valid WhatsApp user
Recipient number is not a valid WhatsApp user.
FixVerify the number is correct + has WhatsApp installed. Fall back to SMS for this recipient.
Message undeliverable
Message undeliverable (recipient blocked you, account banned, etc.).
FixStop trying to message this recipient. Suppress them from future campaigns.
Account locked by Meta
Account locked by Meta (policy violation).
FixCheck your Business Manager for an account-level notice. Contact Meta support.
Business eligibility issue
Business eligibility issue (payment method declined, no billing profile).
FixUpdate the payment method on your WhatsApp Business Account in Meta Business Manager.
Incorrect certificate
Incorrect certificate (legacy On-Premises API).
FixShould not appear for Cloud API users. If it does, contact support.
Re-engagement required (24h window expired)
Re-engagement message - the 24-hour conversation window expired and you tried to send freeform.
FixSend an approved template instead. EchoCue's notification worker raises this proactively.
Message type not supported
Message type not supported (e.g. sending a sticker to a number that doesn't support stickers).
FixUse text or a supported media type.
Media download failed
Media download failed - Meta couldn't fetch the media URL you provided.
FixEnsure the media URL is publicly accessible (no auth, no IP allowlist) and returns the correct Content-Type. Try with curl from a fresh IP.
Media upload failed
Media upload failed.
FixVerify the file is under Meta's size limits (5MB image, 16MB video, 100MB document).
Template parameter count mismatch
Template parameter count mismatch - you supplied a different number of {{n}} values than the template declares.
FixCheck the template body for placeholders; supply exactly that many values.
Template name does not exist (auto-healed)
"Template name does not exist in the translation". The (name, language) pair you sent doesn't match an approved template on Meta.
FixEchoCue auto-fixes this: on 132001 we re-fetch from Meta, update the local language, and retry once. If the template genuinely doesn't exist on Meta, the error persists - run a template sync from the Templates tab.
Template hydration failed
Template hydration failed - Meta couldn't substitute your variables into the template.
FixCheck that no variable value contains newlines (templates disallow them), the value count matches, and no value is empty.
Template format character policy violation
Template format character policy violation (URL in a text body, banned phrasing, etc.).
FixEdit the template + resubmit. Common culprits: links in body, "click here" CTAs, ALL-CAPS sections.
Template parameter format mismatch
Template parameter format mismatch (e.g. you passed a string where Meta expects a number, or an invalid URL in a media header).
FixEchoCue now silently drops invalid IMAGE/DOCUMENT/VIDEO header URLs before send to avoid this - but you can still hit it if you pass invalid variables. Validate inputs.
Template paused for low quality
Template paused by Meta for low quality.
FixWait 24h for re-evaluation, or switch traffic to a different template. The template.status webhook event fires when this happens.
Template disabled
Template disabled.
FixPermanent. Submit a new template with different content.
Template flow blocked
Template flow blocked (Meta blocked the Flow inside this template).
FixContact Meta support; usually a policy issue with the Flow content.
Template flow throttled
Template flow throttled (too many Flow submissions in a short window).
FixReduce send rate for templates that include Flows.
Meta server temporarily unavailable
Meta's server is temporarily unavailable.
FixDespite the "temporary" wording, Meta returns this for genuinely-broken sends often enough that we treat it as permanent. Retry manually if you believe it was transient.
Generic Meta error
Generic Meta error.
FixInspect the message field - the human copy usually narrows it down.
Access token expired or revoked
Access token expired or revoked.
FixRe-link your WhatsApp Business Account via Connect with Meta. The Embedded Signup flow issues a fresh long-lived token.
Invalid parameter sent to Meta
Invalid parameter sent to Meta (often a missing or malformed field).
FixCheck the message field for the specific Meta-reported reason. Usually a bug in EchoCue - please report.
Application does not have permission
Application does not have permission for this action.
FixRe-link the WhatsApp Business Account and re-approve EchoCue's permissions in the consent dialog.
SMS sends go through the customer's Android Companion app. Today, SMS failures surface as generic HTTP error responses (400 for validation, 401 for auth, etc.) with descriptive message copy - the named SMS-specific codes listed below are planned, not yet returned. We're listing them so you can branch your client logic on the eventual shape when they land.
status_id + the human message. The named codes below ship in a future release; subscribe to info@echocue.com for the announcement.
Paired device offline (planned)
Will fire when the paired Android Companion phone hasn't reported in within the last 5 minutes.
TodaySurfaces as a 400 with a "device offline" message. Open the Companion app on the phone, ensure background activity is allowed, and confirm it has network.
SMS length exceeded (planned)
Will fire when the message body is longer than your account's SMS length cap. Call GET /api/server-info to read your account's current limit.
TodaySurfaces as a 400 with the exact length cap in the message. Shorten the message accordingly.
Recipient not in E.164 format (planned)
Will fire when the phone number is missing the country code or contains invalid characters.
TodaySurfaces as a 400 with "Invalid phone number" in the message. Pre-pend with + and the country code (e.g. +1, +44).
Carrier rejected the message (planned)
Will fire when the carrier returns a rejection (spam-classified, recipient blocked, line out of service).
TodayThe notification record's status moves to failed and the carrier's reason is logged on the notification's log row.
Rate limit hit (planned)
Will fire when the carrier or device throttles you for sending too fast.
TodayEchoCue auto-throttles in the worker and the notification is retried on the next tick. No explicit error returned to the caller. Reduce concurrent broadcast volume if persistent.
Still stuck?
Hitting an error not listed here? Email info@echocue.com with the full response body (the entire data object plus the message) and we'll diagnose. For WhatsApp-specific Meta errors not in this list, see Meta's official Cloud API error codes documentation.