Rate limits
Limits are per API key:| Scope | Limit | Why |
|---|---|---|
| All requests | 120 / minute | General ceiling. |
Census writes (PUT /census, POST/PATCH members) | 20 / minute | Census writes fan out to rating and (post-enrollment) live records. Batch with PUT /census instead of looping POST /members. |
Quote creates (POST /quotes) | 60 / hour | Quotes are persistent records; don’t use them as a pricing calculator in a loop. |
429 rate_limited with a Retry-After header (seconds):
Retry-After rather than guessing your own backoff; it reflects the actual window. These limits are sized for steady-state integrations (a nightly full-roster sync for hundreds of employers fits comfortably); if a bulk migration needs more, ask your partner engineer for a temporary raise rather than building a throttle dance.
Failed authentication is throttled separately: requests with a missing, malformed, revoked, or unknown API key are limited to 30 attempts per minute per source IP, after which the API returns 429 rate_limited instead of 401. Authenticated traffic is unaffected by this limiter. If you see it during development, check that your key is loaded correctly rather than retrying.
Idempotency
EveryPOST and PUT endpoint accepts an Idempotency-Key header:
- 24-hour replay window. A repeated key within 24 hours returns the stored response (same status code, same body) without re-executing anything.
- Key is free-form. Any unique string up to 255 chars. UUIDs work; deterministic keys derived from your own entity IDs (
enroll-{companyId}-{quoteId}) work better, because retries after a process crash regenerate the same key. - Scoped to your partner account. No cross-partner collisions to worry about.
POST /groups, POST /enrollments. A timeout is not a failure; the request may have landed. With an idempotency key, the retry answers that question safely. Without one, you’re left querying state to find out.
Idempotency replays return the stored response even if it was an error. If you fix a bad request, send the corrected payload under a new key.