On this page

Errors

Error envelope

Every error response:

{
  "error": {
    "code": "<code>",
    "message": "<user-safe string>",
    "details": {}
  }
}

Always also: response header X-Request-Id.

Branch on error.code, not only HTTP status.

Success responses are bare JSON (no { data: … } wrapper). Unknown body keys → 400 validation_error.

Example

{
  "error": {
    "code": "unauthorized",
    "message": "Invalid API key.",
    "details": {}
  }
}

Header: X-Request-Id: <uuid>. On 429, also Retry-After.

Error codes

CodeTypical HTTPWhen
unauthorized401Missing or invalid key
plan_required403Workspace not entitled for Public API
validation_error400 (or 413 if body too large)Bad body/query; unknown fields
not_found404Campaign, lead, template, etc.
conflict409Idempotency mismatch / in-progress; other conflicts
insufficient_credits403Not enough credits (never HTTP 402)
account_disconnected403Gmail account missing or disconnected
rate_limited429Too many requests — see Retry-After
send_failed502Gmail send failed upstream
upstream_unavailable503Temporary failure; safe to retry

HTTP status table

StatusTypical codes
400validation_error
401unauthorized
403plan_required, insufficient_credits, account_disconnected
404not_found
409conflict
413validation_error (body too large)
429rate_limited
502send_failed
503upstream_unavailable

See also Credits & rate limits for RPM and idempotency details.