Errors

Errors are returned as JSON with an error string and the appropriate HTTP status. Bodies are stable — safe to match on.

Authentication errors (401 / 403)

StatusBodyMeaning
401{"error":"Missing site key"}You didn't send X-Envara-Site-Key.
401{"error":"Invalid site key"}Key doesn't match any site. Check for stray spaces or wrong env.
401{"error":"Invalid signature"}HMAC mismatch. You likely signed a different body than you sent (e.g. middleware reformatted JSON).
401{"error":"Stale timestamp"}Clock drift > 5 minutes. Sync NTP on your server.
403{"error":"Site is disabled"}Re-enable the site from the dashboard.

Server errors (5xx)

StatusBodyMeaning
500{"error":"<message>"}Unexpected — retry with exponential backoff. If it persists, contact support with your event_id.

Successful responses with no send

An event can be accepted (200 OK) without any WhatsApp message going out. Check the whatsapp field:

  • no_bindings — no binding configured for this site+event. Create one in the dashboard.
  • skipped_no_phone — no recipient phone could be resolved (missing customer.phone_e164 and no static recipient).
  • skipped_no_config — WhatsApp Cloud credentials missing in Settings.

Per-recipient failures

If some recipients succeed and others fail, the response returns "whatsapp": "partial" with recipients_sent and recipients_failed counts. Per-message error details (Meta error code, reason) are visible in the Notification Log.

Retries & idempotency

If your request fails with a 5xx or network error, retry — but include X-Envara-Idempotency-Key with a stable per-event value to make sure duplicates are deduplicated server-side.