Skip to content

Rate limits

Every unauthenticated endpoint has a rate limit. Authenticated endpoints have generous per-user limits to protect the brain, not the user.

EndpointLimit
POST /api/v1/auth/login5 / min
POST /api/v1/auth/password-reset-request5 / min
POST /api/v1/auth/password-reset-complete10 / hour
POST /api/v1/auth/invite-accept10 / min
POST /setup3 / hour
GET /invite/*20 / min

Additional bucket to prevent attacker-controlled IPs from brute-forcing one email:

EndpointLimit
POST /auth/login10 / min per email
POST /auth/password-reset-request3 / hour per email

Applied after authentication:

EndpointLimit
POST /api/v1/tasks/bulk-retry10 / min
POST /api/v1/queues/*/purge10 / hour
POST /api/v1/memberships/invite20 / hour

Every response includes:

  • X-RateLimit-Limit - the bucket max
  • X-RateLimit-Remaining - calls left
  • X-RateLimit-Reset - epoch seconds when the bucket refills

On 429 Too Many Requests, a Retry-After header gives seconds to wait.

Token-bucket per bucket. Storage: in-process for single-replica; switches to Postgres-backed for multi-replica (v1.1).

All limits are in-code defaults. Customization requires a PR in v1.0; configurability is on the v1.x roadmap.

Health / metrics endpoints are not rate limited - scraping is expected.