exerciseapi.dev
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
TierDailyPer minuteMax results/request
Free1006020
Starter100012050
Pro10000300100
Business1000002000100

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: 1775184000
429 response headers
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1775182500
Retry-After: 32