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:
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.

