Rate Limits
All API endpoints are rate-limited per API key. Default limits apply unless overridden at the key level.Default Limits
Per-key overrides: any API key can carry custom
rate_limit_per_minute and rate_limit_per_day values, applied to every key type (csb_, csu_, cpk_). A value of 0 means “use the global default” for that window — the two windows are independent, so you can override one and leave the other on the default. Contact support to have a limit raised on your key.
Publishable keys (cpk_ prefix) default to 100 requests/minute and can be configured independently.
Per-minute and per-day quotas are scoped to the key. Each key gets its own budget for these two windows, so you can put a noisy batch integration behind its own key without it starving your production traffic.
Plan Limit
On top of the per-key windows, your plan sets an hourly ceiling for the whole organization, shared by every key, OAuth login and dashboard session acting for it:
Splitting traffic across keys does not raise this ceiling. It appears in
RateLimit-Policy as a w=3600 window, and over it you receive the same 429 as for any other window. Public endpoints that need no credential (search, the product panel) do not count against it.
Monthly Allowance Without a Card
An organization with no card on file, whether it is on Free or its subscription has lapsed, keeps full read and write access. Nothing is frozen and edits are always free. What it can add is capped at the plan’s monthly allowance of lots, serial numbers and EPCIS events, counted on what was added this month (the billing cycle, or the calendar month when there is none), never on what is on file. It can also keep the plan’s free enhanced products on. An add past the allowance is refused with403 Forbidden; an EPCIS capture records it as that event’s 403 problem in the capture job. On the lots, serials and resolver-configuration endpoints the error’s details object carries upgrade_url, the page where adding a card lifts the cap at once, and resets_on, the ISO date (YYYY-MM-DD) the monthly allowance resets on. resets_on is null for the enhanced-product allowance, which counts the products on at a time rather than what was added this month.
Rate-Limit Headers
Every response includes enough state for callers to self-throttle before they hit a 429 — an “informed governor” pattern.
These follow the IETF
draft-ietf-httpapi-ratelimit-headers draft.
Legacy aliases
For back-compat with older SDKs, we also emit:
New integrations should prefer the unprefixed
RateLimit-* headers.
Why most-restrictive wins
If you have 250 requests left in your minute quota but only 8 left in your day quota, the headers report the day state — that’s the one that will trip first.RateLimit-Policy declares all windows so you can plan ahead for the long-tail (daily) one even when minute is the active constraint.
The “informed governor” pattern
Read the headers and pause when you’re getting close to the limit, instead of waiting for a 429:Handling 429 Responses
If you do hit a 429 — usually because your governor wasn’t running, or the quota was already exhausted by another caller sharing the key — the response has both aRetry-After header and a retry_after_seconds field in the error envelope:
Retry-After.