Messaging is separate and far tighter because those calls spend real money and
land in somebody’s inbox: a runaway loop against
/reminders/:id/send is a
different kind of incident from a runaway loop against /members.
Every response carries your budget
RateLimit-Reset is seconds until the window rolls over. A 429 adds
Retry-After, also in seconds:
Before you have a token
A request with no bearer token, or one that doesn’t resolve, answers401 and
carries a different budget: 30 failed authentication attempts per IP per
minute, which is what stands between a credential-stuffing script and the
token lookup. It is reported with the same headers:
429 with Retry-After.
Some requests cost more than one
A request is priced by the work it asks for, not by being one HTTP call. Reading a chapter’s roster costsceil(limit / 25) units, so a page of 100 members
costs 4:
A malformed request still costs a unit. Otherwise sending garbage would be a
free way to hammer the API.
Backing off
On a429, sleep for Retry-After seconds and retry – with jitter if you run
more than one worker, or they’ll all wake up together and collide again.
RateLimit-Remaining and slow down before you hit zero.

