Error envelope
Errors are wrapped in a singleerror 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 returningINVALID_REQUEST unless noted:
- malformed or empty JSON body
- unknown keys inside
options— onlyinclude_checksandinclude_explanationare accepted - a
namelonger than 200 characters - a batch with a missing, empty, or oversized
emailsarray - bulk CSV problems: missing
emailcolumn, 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
statusfilter 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 bycode:
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 return500 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.