You fetched hard yesterday. Today a clean deploy can't reach the API at all — and the meter doesn't reset just because you shipped.
After a period of heavy fetching, a fresh, clean deploy went out — and then every single fetcher couldn't reach the source. Not a code error; the connection itself was being refused.
"I shipped a clean deploy and suddenly nothing could even connect. My first thought was I'd broken something. But the code was fine — so why was the door slammed shut today when it was open yesterday?"
"The heavy fetching the day before tripped a rate limit on the whole account/IP — and the limit applies retroactively, not per-request. A clean deploy doesn't reset the meter. The real lesson isn't 'fetch less' — it's that the fetch path has to survive being refused without corrupting data."
A rate limit is counted against your account or IP over time — not against any single request. So a burst of fetching today can get tomorrow's requests refused, and a successful deploy does nothing to reset it. The deploy and the meter are unrelated systems. The thing you control isn't whether the API ever says no — it will — but whether your app fails closed when it does: never fabricating data, clearly marking the work as a transient failure to retry later.
per account/IPThe limit tallies your usage across requests and minutes — not one call in isolation.
different systemShipping new code doesn't clear the meter. A clean deploy can still be refused on arrival.
mark, don't fakeWhen refused, never fabricate a result. Mark it a transient failure and retry later.
The model: it's a water meter on the whole house, not on a single tap. Run every faucet wide open today and the utility throttles the line tomorrow — installing a brand-new faucet won't change that. You can't make the limit disappear; you design so that when the water's cut, nothing downstream silently fills the glass with something fake.
You fetched heavily yesterday. Today's deploy is clean and green, but every fetcher gets connection refused. What happened?
Same rule as always: answer it right, or the module isn't done.
You don't control whether the API says no — only what your app does when it does. Fail closed: mark it, never fake it, retry later. The outage validates the path.
A real safe-fetch.js that detects a rate-limit / connection refusal, returns an explicit { status: 'TRANSIENT_FAIL' } instead of fabricating data, backs off, and throttles your own outgoing rate so today's burst can't refuse tomorrow. Plus a one-page resilience checklist for any app that depends on an upstream API.