Three sleep intervals for three APIs: Steam 250ms, GitHub 100ms, HuggingFace none A developer built ETL pipelines for three directory sites in April, encountering different rate limits for the Steam, GitHub, and HuggingFace APIs. The Steam pipeline uses a 250ms sleep interval despite a documented safe rate of 1.5 seconds per request, accepting occasional HTTP 429 errors as non-fatal for review data. The GitHub pipeline relies on an authenticated token for 5,000 requests per hour, while the HuggingFace model registry API requires no sleep interval even for rapid-fire requests. When I built the ETL pipelines for three programmatic directory sites in April — Top AI Tools HuggingFace data , Find Games Like Steam data , and Open Alternative To GitHub data — I had to figure out rate limits for three completely different APIs in the same week. The numbers, the failure modes, and the right way to handle errors are all different. Here's what I actually shipped and the reasoning behind each number. Steam's developer docs are sparse on hard rate-limit specifics. What I found from community discussion and trial: roughly 200 requests per 5 minutes per IP on the public Web API, which works out to one request per 1.5 seconds as a documented-safe interval. My code comments this openly: await sleep 250 ; // Steam rate limit: ~200/5min, 1.5s is safe; 250ms is aggressive but usually fine I chose 250ms anyway because the ETL runs as a nightly GitHub Actions job over ~60 game entries. At 250ms that's 15 seconds of sleep total. At 1.5 seconds it would be 90 seconds. The gap matters when the cron has three sites to process. The acceptable risk: Steam doesn't hard-ban on the first rate-limit violation, it returns HTTP 429 and the job logs the error. The games ETL treats review-endpoint failures as non-fatal — the game row is still written; only the review stats are absent until the next run: js try { const r = await getAppReviewSummary appid ; // ... write to DB } catch err { reviewsFailed++; console.error Review fetch failed for appid ${appid}: , err ; } The reviewsFailed counter appears in the job log. If I see it climbing consistently, that's the signal to increase the sleep interval. So far I haven't needed to. GitHub's REST API is explicit about limits: 60 requests per hour unauthenticated, 5,000 per hour with a personal access token. The GitHub docs on rate limiting https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api cover both the primary limit and the secondary limits for specific endpoint categories. The OSS alternatives ETL makes one GET /repos/:owner/:repo call per alternative project — roughly 3–5 repos per SaaS tool in the seed data. Even a large seed run of 50 tools with 5 alternatives each is only 250 requests. The sleep is there as a politeness interval, but authentication is doing the real rate-limit work: js function authHeaders : Record