Polling schedule
All of these run as scheduled jobs. The 30-min and 10-min jobs were moved to GitHub Actions because the Vercel Hobby tier caps cron schedules to daily frequency. GitHub Actions runs them for free and triggers our Vercel routes via authenticated HTTPS.
Freshness indicators
The dashboard shows a last-updated badge at the page header, displaying the relative time since the most recent snapshot in the visible dataset:- Under 5 min — green, considered live
- 5–30 min — neutral, expected for a 30-min polling cycle
- Over 30 min — yellow, may indicate the cron skipped a beat
- Over 60 min — red, treat as stale
Snapshot types
Every captured row has asnapshot_timestamp and a snapshot type:
- Opening — earliest captured value for a prop, marked
is_opening_line=true - Scheduled — regular 30-min polling cycle
- Closing — captured during the tipoff window for tracked events
Bets-driven closing-line capture
The closing-line cron is bets-driven — it only fetches close snapshots for events where:- A user has a pending bet with an
odds_idreferencing the event, OR - A parlay leg references the event, OR
- The Discord bot has scheduled a pick for the event
ODDS_API_DAILY_BUDGET_CREDITS, default 400) hard-stops the cron if projected spend exceeds the cap.
What “real-time” would require
True sub-second live odds require a different data tier — typically $5,000+/month. Line Gap is built around what affordable polling can deliver well, which is pre-game intelligence: line movement charts, sharp signal detection, cross-book comparison, CLV. Live in-game betting is explicitly not supported.Coming soon
Per-user webhooks for tracked bets
Tracked as enhancementTrigger a closing-line snapshot the moment any user tracks a new bet, rather than waiting for the next 10-minute scan. Would tighten close coverage for last-minute bets.