Upcoming close capture tasks that will fetch closing odds near game start time.
Game
League
Game Start
Next Capture
Captures
Source
Loading scheduled captures...
Games that have started but are waiting for final results to be fetched from result sources.
Event Date
League
Game
Bet
Bookmaker
Initial EV%
CLV%
Time Since Start
Close Capture
CLV Source
Loading pending results...
All opportunities regardless of settlement status.
Found
Event Date
League
Game
Bet
Bookmaker
Initial EV%
CLV%
Status
Result
Units +/-
Loading all results...
Bookmaker Performance Analytics
Performance metrics per bookmaker based on historical opportunities from the last 30 days.
Bookmaker
Total Opps
Avg EV%
Wins
Losses
Win Rate
Profit (Units)
Avg CLV%
Click "Refresh Stats" to load bookmaker analytics...
Active Opportunities--Live right now
Distribution by Time Horizon
By Sport
Loading...
14-Day Trend
Historical Trends(from daily snapshots)
Latest Snapshot
-
Period Avg: -
Range: -
Change: -
Total Opportunities
0
High EV (>5%)
0
Avg EV%
0%
Avg Opportunities/Day
0
Active Sources
0
Unique Leagues
0
Market Mix
0 1X20 ML0 DNB
System Health & FlagsLoading...Current issues only
Loading health indicators...
⚠️ Warning History
Detected
Warning
Details
Affected
Type
Status
Loading warning history...
🔧 Service ReliabilityLoading...
Loading service health...
Error History (Last 7 Days)
Date
Service
Error Pattern
Count
Severity
Status
Loading error history...
SRE Run Report
⏰ Automated Agents
🔍Data Quality Agent
Investigates data anomalies, validates fairlines, checks for cross-game contamination
Schedule:Every 2h at :00
Last run:-
Next run in --:--:--
🔧SRE Monitoring Agent
Monitors Render services, detects errors/outages, tracks service health patterns
Schedule:Every 2h at :30
Last run:-
Next run in --:--:--
Agents run via macOS launchd every 2 hours. Reports kept for 30 days.
Result SettlementLoading...
Overall Settlement
-
Soccer
-
Basketball
-
Ice Hockey
-
Missing Results
-
Daily Settlement Rate (Last 7 Days)
Date
Total
Settled
Rate
Worst Sport
Loading...
Settlement = past games with bet_result populated. Missing results are caused by TheSportsDB API 429 rate limits. Games must be 3+ hours past start time.
Result Linking Pipeline
Game Results (7d)
-
Linked to Opps
-
Unlinked Opps
-
Link Rate
-
League (unsettled)
Pending
Blocker
Loading...
Linking matches ev_opportunities to game_results by sport + team names + time window. Failures are usually team name mismatches or missing results.
Fairline Calibration by Sport
Sport
Settled
Expected Win%
Actual Win%
Calibration Error
Status
Loading...
Calibration error = Actual Win% - Expected Win%. Negative means underperforming. Values beyond ±3% indicate potential fairline issues.
🤖 Data Quality Investigation Agent
Loading...
Autonomous agent (powered by Claude Code) that investigates every indicator, examines every high EV opportunity, and produces detailed reports.
Run manually: ./scripts/run_dq_agent.sh
Loading latest report...
📋 Report History
Time
Status
Type
Loading...
📊 Fairline Accuracy
Fairline AccuracyMeasures how well fairlines predict outcomes. Compares actual win rates vs expected rates based on fairline probabilities. "Accurate" means within ±3% deviation.Loading...
Validates fairline quality by comparing different sources and detecting anomalies. Healthy fairlines are essential for accurate EV calculations.
🔬 Fairline Audit Results
Fairline Source Comparison
Source
Count
Avg EV%
Win Rate
Accuracy
Alt EV%
EV Δ
Loading...
Accuracy = Win Rate vs Expected. Alt EV% = avg EV if the other fairline source had been used. EV Δ = difference (positive = current source is more conservative).
Pinnacle vs Consensus Agreement
Sport
Both Present
Avg Diff
High Diff (>5%)
Agreement
Loading...
High disagreement between Pinnacle and Consensus may indicate data quality issues.
+EV opportunities where platforms_included array has 2+ entries. These have stronger confidence due to cross-verification.
--
Loading...
Cross-League Issues
Cross-League IssuesCount of leagues where platform naming doesn't match (e.g., "UEFA Europa League" vs "UEFA - Europa League"). These block cross-platform matching.
--
Loading...
Cross-Platform Rate (Last 7 Days)
Opportunities with data from 2+ platforms
Date
Opportunities
Multi-Platform
Rate
Status
Loading...
Data Source Flow (Last 7 Days)
Opportunities by contributing platform (one opp can count for multiple platforms)
Date
OddsJam
TheOddsAPI
BetBurger
Status
Loading...
Data Freshness (Queue Status)
Data FreshnessMeasures how recently odds in omenizer_queue were updated. Fresh data (<15min) is used for opportunity detection. Stale data is excluded to prevent acting on outdated prices.
Data older than 15 minutes is excluded from opportunity detection. Low freshness = missing from cross-platform merging.
Platform
Fresh (<15min)
Fresh RecordsRecords where updated_at is within last 15 minutes. These are eligible for +EV opportunity detection.
Stale (>60min)
Stale RecordsRecords not updated in 60+ minutes. Excluded from processing - may indicate scraper issues or low-volume leagues.
Fresh %
Freshness RateFormula: fresh / total × 100
Target: ≥70% for Good status. Low rates mean opportunities may be missed due to stale data.
Status
Loading...
🔀 Platform Divergence Detection
0
Opportunities where median odds differ >20% between data sources. This may indicate mapping issues, stale data, or mixed market types.
Divergence by Sport
Sport
Divergent
Total
Rate
Status
Loading...
Recent Divergent Opportunities
Event
Sport
EV%
Platforms
Detected
Loading...
🛡️ Market Data Validation
0
Markets rejected from fairline calculation due to invalid data. High rejection rates are expected for Soccer (2-way markets without draw) and incomplete SSE data. This prevents false +EV opportunities.
Sharp Book Availability
Sharp Book AvailabilityFormula: events_with_sharp / total_events × 100
Percentage of matched events where at least 1 sharp bookmaker has odds across any platform source. Events without sharp data cannot produce fairlines.
Of events that have sharp book odds, what % produced a fairline. 100% = engine converts every sharp signal. Event-level, deduplicated across platforms.
--
Loading...
Line Rejection Rate (24h)
Line Rejection RateFormula: rejected_lines / total_lines × 100
Per-bookmaker line rejections. High rates (>95%) are normal — most soft books have missing odds or bad overround. Only 2-3 sharp books per game are needed for fairline calculation.
--
Loading...
Lines Processed (24h)
Lines ProcessedTotal individual bookmaker lines validated in the last 24h. Each game has ~50-120 bookmaker lines; most are expected to be rejected.
Liquidity GovernanceLoading...PRD v1.02 Appendix C
Actionable Rate
--
Loading...
Suppressed
--
Loading...
Avg Confidence (Exch. Included)
--
LIQUID / THIN exchanges
Avg Confidence (Exch. Excluded)
--
ILLIQUID / UNKNOWN exchanges
Actionable Rate Trend
Suppression Reasons
Why opportunities are non-actionable
Reason
Count
%
Loading...
Exchange Liquidity by Sport
Classification of exchange volume (LIQUID / THIN / ILLIQUID)
Sport
Liquid
Thin
Illiquid
Unknown
Loading...
League Breakdown (Upcoming Games)
League ↕
Sport
Events ↕
Odds Records ↕
Fairline Cov.
Opps (24h) ↕
Loading...
Mapping Issues
Issue Type
Details
Count
Severity
Suggested Action
Loading...
Daily Opportunities Found
Opportunities by EV Threshold
Platform Coverage Analysis
Coverage by # of Platforms
Platform Combinations
Combination
Count
Avg EV%
%
Loading...
Platform Coverage Over Time
Bookmaker Performance
Top Bookmakers by Opportunities
Bookmaker Statistics
Bookmaker
Opps
Avg EV
≥5% EV
≥10% EV
Loading...
Top 5 Bookmakers Trend (Opportunities per Day)
Top Performing Leagues
Opportunities by League (Top 10)
League Statistics
League
Opps
Avg EV
Win Rate
ROI
Loading...
Top 5 Leagues Trend (Opportunities per Day)
Daily Breakdown
Date
Total
≥1% EV
≥3% EV
≥5% EV
≥10% EV
Avg EV
Leagues
Bookmakers
Loading...
Performance by EV Range
EV Range
Count
Win Rate
Avg CLV
ROI
Total P&L
Loading performance data...
CLV Performance
CLV Range
Count
Win Rate
Avg EV
ROI
Total P&L
Loading CLV data...
📊 League Coverage & Cross-Platform Analysis
--
Leagues
--
Total Events
--
Cross-Platform %
--
Active Opps
--
Mapping Gaps
-
Events vs Yesterday
League
Platforms
Events
Days Ahead
Cross-Platform
Opportunities
Opp Density
Health
Loading league coverage data...
OddsJam TheOddsAPI BetBurger|🟢 Healthy (2+ platforms, fresh)🟡 Warning (1 platform or stale)🔴 Critical (no data)⚠️ Mapping gaps|↑ More vs yesterday↓ Less vs yesterday
🗺️ Team Mapping Health
--
Match Rate
-- mapped / -- seen
--
Unmapped Teams
blocking event matching
--
Leagues with Gaps
--
--
Stale Mappings
not used in 90+ days
⚠️ Top Unmapped Teams (Last 7 Days)
Team
League
Platform
#
Loading...
📊 League Coverage Gaps (Worst First)
League
Platform
Coverage
%
Loading...
Pinnacle Odds Divergence Monitor
Multi-Source Events
-
Avg Divergence
-
Max Divergence
-
PIN/TOA Exact Match
-
OJ Mkt Mismatch
-
PIN Direct Events
-
PIN Direct
-
TheOddsAPI w/ PIN
-
OddsJam w/ PIN
-
Event
Sport
PIN H/A
TOA H/A
OJ H/A
Max Div%
Src
Loading...
Compares Pinnacle odds from PIN direct, TheOddsAPI, and OddsJam. PIN/TOA should be ~0% (same CDN). OJ soccer uses draw_no_bet (not comparable to h2h).
Spider Run Health (Last 24h)
Run Status Distribution
Current Cycle
Loading...
Cycle Duration Trend
Scraping Freshness by Platform
Platform
Last Scraped
Age
Status
Loading...
Stale Fairline Backlog
Stale Events
--
Total Upcoming
--
Stale Rate
--
Recent Spider Runs
Platform
Started
Duration
Status
Loading...
Leagues with Opportunities
0
Missing ESPN Mappings
0
Unprocessed Past Games
0
Coverage Rate
0%
League Coverage Report
League
Total Opps
With Results
Without Results
Coverage %
Result Sources
Mapping Status
Overall Status
Action
Loading results tracker data...
Add Custom Mapping
Find ESPN slugs: Soccer |
NBA |
MLB -
look at the URL (e.g., league=eng.1, league=nba)
Potential Name Mismatches
These leagues might have ESPN coverage under a different name:
Opportunity League Name
Possible ESPN Match
Similarity
Action
Checking for mismatches...
League Details
Select a league to see its games and identify mapping issues:
Game
Sport
Platform(s)
Start Time
EV %
Has Result
Result Source
Reprocess Results
After adding new ESPN mappings, you need to reprocess older games to fetch their results:
# Navigate to the ESPN scraper directory
cd scrapy-scraper/espn-results-scraper
# Run the fetch missing results script
python3 fetch_missing_results.py
# Or run the full pipeline (fetch + match + update)
Note: The fetch_missing_results.py script targets games older than 72 hours and uses the ESPN Core API to search for results by team names and date.
Make sure the config.json file has the correct database credentials.
Result Sources Statistics
Overview of all configured result sources, their mappings, and actual results obtained.
Total Sources
-
Active Mappings
-
Results Obtained
-
Overall Coverage
-
Source
Type
Configured Mappings
Unique Leagues
Results Obtained
Result Leagues
Coverage %
Status
Loading...
EV Tracking Configuration
Only include games with odds updated within this time window when calculating EV opportunities
Method for removing bookmaker margin (vig) from odds to calculate fair probabilities.
Additive: Simple proportional removal (default)
Power: Adjusts for favorite-longshot bias
Shin: Accounts for informed bettors, best for soccer
Worst Case: Assumes all vig on your side (conservative)
🎯 Fairline Configuration
Configure sharp bookmaker weights, prediction market settings, and consensus bookmakers.
These settings control how fairlines are calculated.
Weight determines influence in consensus. 0 = excluded, 1.0 = full weight.
These bookmakers are used for the Consensus fairline (public market mean).
🤖 Data Quality Agent Thresholds
Configure detection thresholds for the Data Quality Monitoring Agent. Values beyond these thresholds trigger warnings or critical alerts.