This site publishes machine-readable ATP tennis prediction data, refreshed three times daily (~6:00 / 12:00 / 18:00 ET). Automated reading at reasonable rates is welcome.
Endpoints (static JSON, no auth):
/predictions.json — the current board. Fields:
generated_utc; upcoming_board[] with players, ISO-UTC start, model win
probability, confidence band; kalshi_evaluations[] with match,
our_p1, kalshi_p1 (both decimal probabilities for player 1),
confidence_band, product; player_notes[] with AI-summarized
news/injury lines.
/track_record.json — the full settled history:
overall (n, accuracy, our_brier, kalshi_brier, brier_edge, avg_clv_pp),
slices[] (same stats per confidence band and disagreement segment),
bets.history[] (every proposed bet: logged_at, match, pick, our_prob,
market_at_log, edge_pp, band, status, won, pnl_units, clv_pp). Timestamps prove predictions
preceded matches.
/llms.txt — this description in plain text at the standard location.
Semantics: probabilities are decimals in [0,1] for the named side. Brier score is mean
squared error of the probability — lower is better, 0.25 is a coin flip. clv_pp is
the pre-match price move toward our side after logging, in percentage points — positive means
the market sharpened toward our number. Confidence bands (high/medium/low) reflect how much
verified history the model has on both players; low-band rows are published for completeness,
not conviction. pnl_units is bankroll-fraction profit on the staked fraction, fee-aware,
settled at the logged entry ask; older rows without a logged ask settle at the mid and carry
pnl_at_mid_legacy: true.
Want richer data? Historical features, ratings, and per-match model output may be made available as a data product — tell us what you'd build.
Prediction data only — not betting advice. Quotes are snapshots and go stale.