Skip to main content

Rate limits

Requests are limited to 1000 per minute per API key (sliding window). Every response carries the current state: When exceeded you get 429:
Wait for Retry-After seconds (or until X-RateLimit-Reset) and retry. Rate-limited requests are rejected before any work happens, so they are always safe to resend.

Batch endpoints

The /batch endpoints share your key but use a lower limit of 20 requests per minute. A single batch performs up to 1000 operations, so the per-operation ceiling stays comparable. A batch body is capped at 1000 items (400 over that).

Error shape

Every error response is JSON with an error object carrying a stable, machine-readable code (snake_case) and a human message:
Some errors carry extra fields alongside code and message:
  • issues: per-field breakdown on validation failures (code: "validation_failed").
  • suggestions: “did you mean” candidates on unknown-type 404s:
Every response uses this shape, including authentication failures (unauthorized) and rate limits (rate_limited).

Status codes

Batch and participant endpoints report per-item errors inside a 2xx response body (e.g. contact_suppressed when someone on your Do Not Contact list is skipped). The request succeeds while individual items fail. Always check the per-item errors array.
Server errors return a generic message by design: they never echo stack traces or payload contents. Every response includes an X-Request-Id header; include it when contacting support about a failed request.

Authentication

How API keys and the 401 responses work.

Quickstart

See the request and response shapes in action.