Unauthenticated surfaces (public tracking, the duty portal, sign-in, the
/admin/oauth2/token endpoint, OAuth callbacks, webhook URLs with an unknown
token) are limited per visitor IP instead — 120 requests per 60 seconds for
public lookups and token requests, 10 per 60 seconds for the tracking gate,
portal unlock (also per link) and sign-in attempts. Cache the access token
until it expires rather than requesting a new one per call.
Customer-scoped API keys and customer portal logins get their own bucket
under your organization, so a single customer cannot exhaust your limit.
Limits use a sliding window, so short bursts above the sustained rate are
fine as long as the 10-second total stays under the ceiling.
The 429 response
When a limit is exceeded the API answers429 Too Many Requests with a
Retry-After header (seconds):
429
Handling limits well
- Respect
Retry-After. Sleep for the indicated seconds, then retry. Add jitter if you run parallel workers. - Use exponential backoff for repeated 429s rather than tight retry loops.
- Batch instead of flooding. If you need to create thousands of shipments at once, use the shipment-import flow in the dashboard (Shipments → Import) — it accepts a whole file at once and processes it in the background at our pace.
- Spread scheduled jobs. Nightly syncs that fire everything at 00:00 sharp compete with themselves; stagger or stream the work.