Reference

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.

Response shape EchoCue codes Meta 131xxx Meta 132xxx Meta 133xxx Auth + permissions SMS / device

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:

EchoCue-specific codes

String error codes returned in data.error_code when the failure is in EchoCue's logic (not in Meta).

CONVERSATION_WINDOW_CLOSED

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.

EchoCue
TEMPLATE_REQUIRED

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.

EchoCue
TEMPLATE_WABA_NOT_LINKED

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.

EchoCue
DEVICE_WABA_MISMATCH

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.

EchoCue
LINKS_NOT_ALLOWED

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.

EchoCue
DEVICE_BLOCKED

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.

EchoCue
WABA_NOT_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.

EchoCue
NO_PHONE_NUMBER_ON_WABA

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.

EchoCue
INSUFFICIENT_CREDITS

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).

EchoCue
Meta 131xxx - Delivery + window errors
131021

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.

Permanent
131026

Message undeliverable

Message undeliverable (recipient blocked you, account banned, etc.).

FixStop trying to message this recipient. Suppress them from future campaigns.

Permanent
131031

Account locked by Meta

Account locked by Meta (policy violation).

FixCheck your Business Manager for an account-level notice. Contact Meta support.

Permanent
131042

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.

Permanent
131045

Incorrect certificate

Incorrect certificate (legacy On-Premises API).

FixShould not appear for Cloud API users. If it does, contact support.

Permanent
131047

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.

Permanent
131051

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.

Permanent
131052

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.

Permanent
131053

Media upload failed

Media upload failed.

FixVerify the file is under Meta's size limits (5MB image, 16MB video, 100MB document).

Permanent
Meta 132xxx - Template errors
132000

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
132001

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
132005

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
132007

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
132012

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
132015

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
132016

Template disabled

Template disabled.

FixPermanent. Submit a new template with different content.

Template
132068

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
132069

Template flow throttled

Template flow throttled (too many Flow submissions in a short window).

FixReduce send rate for templates that include Flows.

Template
Meta 133xxx - Server errors
133004

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.

Server
135000

Generic Meta error

Generic Meta error.

FixInspect the message field - the human copy usually narrows it down.

Server
Meta auth + permissions (100xxx + 190)
190

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.

Auth
100

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.

Auth
10

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.

Auth
SMS / device codes

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.

What to do today: for SMS failures, parse the status_id + the human message. The named codes below ship in a future release; subscribe to info@echocue.com for the announcement.
DEVICE_OFFLINE

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.

Retryable
SMS_LENGTH_EXCEEDED

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.

Permanent
RECIPIENT_NOT_E164

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).

Recipient
CARRIER_REJECTED

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.

Permanent
RATE_LIMIT_HIT

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.

Retryable

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.