Docs navigation
Rate limits
Per-minute, daily, and result-count limits
Authenticated data routes are rate limited by both minute and day. The exercise list endpoint also applies plan-based result caps and free-tier pagination depth rules.
Tier limits
| Tier | Daily | Per minute | Max results/request |
|---|---|---|---|
| Free | 100 | 60 | 20 |
| Starter | 1000 | 120 | 50 |
| Pro | 10000 | 300 | 100 |
| Business | 100000 | 2000 | 100 |
Overages (paid tiers)
- Paid tiers (Starter, Pro, Business) never hard-block on daily limits. Requests past your daily quota are billed at $0.002 each and added to your next Stripe invoice. Per-minute burst limits remain hard 429s on every tier.
- Each paid tier has a safety cap at 10x the daily limit. Requests past the cap return `429 OVERAGE_CAP_EXCEEDED` until midnight UTC to protect against runaway bills.
- When a request crosses 80% of your daily limit, responses include `X-RateLimit-Warning: approaching`. When a paid-tier request is billable overage, responses include `X-Overage: true`, `X-Overage-Count` (cumulative overage requests today), and `X-Overage-Cap` (remaining before the safety cap).
- Free tier hard-blocks at 100% of the daily limit with `429 RATE_LIMIT_EXCEEDED`. Upgrade to a paid tier for overage protection.
Header behavior
- Authenticated data routes include rate limit headers. `GET /v1/health` is excluded.
- Successful authenticated responses report the current daily window.
- `429 RATE_LIMIT_EXCEEDED` responses report the window that was exceeded, either `minute` or `day`.
- `Retry-After` is only returned on `429` responses.
- If Redis is unavailable, successful authenticated responses can fail open with `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset` all set to `-1`.
Pagination behavior
- `limit` is validated up to 100 and then clamped to your plan's per-request result cap.
- Free-tier pagination depth is capped at `offset + limit <= 500`.
- Pagination-depth violations return `403 PAGINATION_DEPTH_EXCEEDED`.
Successful authenticated response headers
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 82
X-RateLimit-Reset: 1775184000429 response headers
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1775182500
Retry-After: 32