Home-host source ingestion goes through src/policy/fetch.ts. It refuses, at runtime, anything below.
www.draftkings.com/lobby/getcontests and /lineup/getavailableplayers* — unauthenticated, the same URLs DK's own lobby page loads. Rate-limited to one request per 6 s per host. Never run from a datacenter IP.api.draftkings.com, sportsbook*.draftkings.com, *.underdogfantasy.com, *.prizepicks.com. These are bot-walled by their operators; the wall is the answer. No proxies (HTTP_PROXY/HTTPS_PROXY/ALL_PROXY set → refuse to start), no stealth, no spoofed browser fingerprints.policyFetch strips Cookie and Authorization headers. No logged-in scraping, ever.dfsroto/<version> (+dfsroto.win/policy). If a host blocks that UA, we stop, we do not disguise. (Bisected 2026-09-16: DK's WAF rejects any UA containing https:// — a scanner-signature rule; curl/8.7.1 and no-UA both pass. So: no URL scheme in the string. Still named.)DFSROTO_HOME_IP (or DFSROTO_ALLOW_ANY_IP=1 is set explicitly for local dev with cached data).NFL, NBA, NHL and MLB game boards and live player statistics refresh from public ESPN data every five minutes. Each feed shows its last successful timestamp. A failed request preserves the last good data and is marked delayed.
DraftKings salary pools refresh separately from our home-IP publisher. Additional-sport targets begin at historical fantasy averages; they are not projections. NFL uses our existing projection model. User CSVs and lineup edits stay in the browser.
Test: test/policy.test.ts asserts every denylisted host is refused and every allowlisted host is rate-limited.