Skip to main content
Every failed request returns a JSON error body designed to answer three questions: what failed, whether you can retry, and what to change.

Error envelope

Errors are wrapped in a single error object:
All responses — success or error — carry an X-Request-ID header. Keep it when contacting support; it identifies the exact request.

HTTP status categories

Error catalog

The complete set of public error codes across the customer-facing API: ¹ ACCOUNT_DISABLED returns 403 on POST /v1/analyze-email and 401 on the batch, bulk, and webhook endpoints. Not-found lookups are scoped to your account: a resource belonging to another account is indistinguishable from one that does not exist.

Validation errors (400)

Common triggers, all returning INVALID_REQUEST unless noted:
  • malformed or empty JSON body
  • unknown keys inside options — only include_checks and include_explanation are accepted
  • a name longer than 200 characters
  • a batch with a missing, empty, or oversized emails array
  • bulk CSV problems: missing email column, empty or malformed file, or exceeding the row limit
  • webhook configuration problems: non-HTTPS URLs, unknown event types, or an out-of-range high_risk_threshold
  • an invalid status filter on the webhook deliveries endpoint

Authentication and authorization errors

401 and 403 answer different questions. A 401 means Signup Risk API could not establish who you are: the key is missing (MISSING_API_KEY, MALFORMED_API_KEY), unknown or wrong-environment (INVALID_API_KEY), revoked (REVOKED_API_KEY), or expired (EXPIRED_API_KEY). A 403 means the identity is valid but not permitted: the key lacks the endpoint’s scope (INSUFFICIENT_SCOPE, with details.required_scope naming the missing scope), the account’s plan does not include the feature (FEATURE_NOT_AVAILABLE, with upgrade metadata), or the account is disabled (ACCOUNT_DISABLED). See Authentication for the key model and Warnings & Quotas for plan gates.

429: rate limit, quota, or duplicate

Three conditions share status 429 and are distinguished by code: Quota errors carry a details snapshot (plan, cap, grace, hard_stop, current_usage, requested_units, reset_date) and an upgrade action. See Warnings & Quotas for the full quota model.

Server errors (5xx)

Unexpected failures return 500 INTERNAL_ERROR with a fixed, safe message — never a stack trace or internal detail. Treat client errors (4xx) as deterministic: retrying an unchanged request will fail again. For a 500, a conservative retry with exponential backoff is reasonable; if the failure persists, contact support with the X-Request-ID.

Next steps

API reference

Exact request and response schemas for every customer-facing operation.