Limits
/v1/* and /trpc/* share the same per-principal limit but are independent
buckets. A handful of unauthenticated auth routes carry stricter per-IP sub-limits
(e.g. sign-in/email 10 / 15 min, request-password-reset 5 / 15 min).
Counters reset every minute.
Response
When a caller exceeds the limit, the API returns HTTP429 Too Many Requests
with the standard error envelope:
Retry-After header accompanies every 429. Every response (not just 429s)
also carries X-RateLimit-Limit, X-RateLimit-Remaining, and
X-RateLimit-Reset so clients can back off before they hit the ceiling.
Recommended client behavior
1
Back off on 429
Counters reset once per minute, so a 60-second retry window is a safe
default.
2
Add jitter
Jitter your retries so concurrent clients don’t synchronize.
3
Cache idempotent reads
Cache item metadata and permission lists client-side where you can.
4
Use the SDK
AbadgeAgentClient session refresh has bounded-backoff retries built in.Exclusions
GET /v1/health is excluded from rate limiting and requires no
authentication. Use it for liveness checks.