Tennis Scores & Results – ATP & WTA Live Matches, Draws & Odds
Pricing
from $1.00 / 1,000 matches
Tennis Scores & Results – ATP & WTA Live Matches, Draws & Odds
One row per ATP/WTA match: live scores, set-by-set results with tiebreaks, round and draw, plus matched Kalshi exchange odds. Singles and doubles, today or any date range.
Pricing
from $1.00 / 1,000 matches
Rating
0.0
(0)
Developer
Rowfeed
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Get live and finished ATP/WTA tennis matches as one clean JSON row per match: set-by-set scores with tiebreaks, round, draw and court, plus matched Kalshi exchange odds. Built for tennis dashboards, score-alert bots, betting research and AI agents that need to ask "what's the score in this match right now" without a login or a headless browser. Source data is ESPN's public tennis scoreboard, so scores update from the same feed ESPN's own site uses, and odds come from Kalshi, the CFTC-regulated exchange - real trades, not a bookmaker's model.
What you get
- One row per match – tour, tournament, round, venue/court, scheduled time, status (scheduled/live/final), both players (name, country, singles or doubles pair), set-by-set score with tiebreak points, ESPN's own free-text recap, and
best_of(3 or 5) once a match has finished normally. - Odds matched in for you – each match is joined to Kalshi's moneyline market for the same tour by player surname and date, while the market is trading (upcoming and live matches);
kalshiisnull(never guessed) when no confident match exists or Kalshi has already settled the market. - Today, live-first, or any date range – the default run returns today's live and upcoming singles matches first, finished ones after; set
dateFrom/dateTofor any past or future window (up to 31 days) and switch on doubles.
Sample row
One live WTA quarterfinal, matched to Kalshi, from an actual run.
{"tour": "WTA","tournament": "Singapore Tennis Open presented by BNP Paribas","draw": "Women's Singles","round": "Quarterfinal","venue": "Singapore, Singapore","court": "Center Court","scheduled_time": "2026-09-25T06:55Z","status": "live","status_detail": "2nd Set","player_a": { "name": "Wang Xinyu", "country": "China", "seed": null, "winner": false, "athletes": [{ "name": "Wang Xinyu", "country": "China" }] },"player_b": { "name": "Tatiana Prozorova", "country": "Russia", "seed": null, "winner": false, "athletes": [{ "name": "Tatiana Prozorova", "country": "Russia" }] },"sets": [{ "a": 6.0, "b": 3.0, "tiebreak_a": null, "tiebreak_b": null },{ "a": 5.0, "b": 5.0, "tiebreak_a": null, "tiebreak_b": null }],"score_text": "Wang Xinyu (CHN) is tied with Tatiana Prozorova (RUS) 6-3 5-5","best_of": null,"kalshi": {"event_ticker": "KXWTAMATCH-26SEP24WANPRO","player_a_yes_ask": 0.81,"player_b_yes_ask": 0.2,"player_a_probability": 0.805,"player_b_probability": 0.195,"url": "https://kalshi.com/markets/kxwtamatch"},"url": "https://www.espn.com/tennis/scoreboard/tournament/_/eventId/1009-2026/competitionType/2","scraped_at": "2026-09-25T08:45:56+00:00","match_id": "184104"}
A doubles row's player_a/player_b carry two entries under athletes (e.g. "David Stevenson / Marcus Willis"), and seed is always null - ESPN's scoreboard feed never sends a seed, so this Actor never guesses one. best_of is read off the sets the winner needed in a normally finished match (2 sets = best of 3, 3 sets = best of 5). It stays null for scheduled and live matches, retirements and walkovers, because ESPN's own format field is wrong for many ATP events.
Filters
| Input | Default | What it does |
|---|---|---|
tours | ["ATP","WTA"] | Men's (ATP) and/or women's (WTA) tour. Each match is tagged by its own draw, so a Grand Slam (men's and women's draws in one event) returns each match once, under the right tour. |
draws | ["singles"] | singles and/or doubles. |
status | all | all, live, upcoming or finished. Rows are always sorted live first, then upcoming, then finished. |
dateFrom / dateTo | today | UTC dates (YYYY-MM-DD). A match is kept only when its own scheduled day falls in the range, not just its tournament's week. Capped at 31 days. |
includeKalshi | true | Join each match to its live Kalshi moneyline market (same tour) by player surname + date. |
maxMatches | 200 | Cap on rows, live/upcoming/finished order then soonest-scheduled first (1-1000). |
A tour or date range with nothing scheduled simply contributes zero rows - not an error.
Pricing
Pay per event, no subscription: $1 per 1,000 matches and $1 per 1,000 run starts (kept tiny so you can poll a single day at a time). The Kalshi join, when it finds one, rides along on the match row for free. Set a maximum charge on the run and the Actor stops cleanly when it is reached, charging only for rows actually saved.
Details
- Sources: ESPN's public site API (
site.api.espn.com, no auth) for scores, Kalshi's public trade API v2 (api.elections.kalshi.com, no auth) for odds. No proxies, no browser, no login. Not affiliated with ESPN or Kalshi. - Set scores: built from ESPN's own structured
linescores, not parsed out of the text recap -score_textis included for reference butsetsis the reliable field to compute with. - The Kalshi join is conservative: it requires both players' surnames to match one live Kalshi market in the same tour's series (
KXATPMATCHorKXWTAMATCH) on the same date (+/- a day, since Kalshi's contract-expiry timestamp can land a day off the match date). No confident match meanskalshi: null, never a guess. - Reliability: 429 and 5xx responses are retried with exponential backoff (5 tries), a 200 without the expected data counts as a failure, and one bad request never stops the run - it becomes an error row (
error,errorMessage) and the rest continues. A run fails only when it produced no rows and a source failed; a tour or date with nothing scheduled is a successful run with zero charged rows. - Run stats: the
STATSrecord in the run's key-value store holds match rows, Kalshi-matched count, error rows, tournaments scanned, request and error counts per category. - Output: one dataset row per match, live first. Export as JSON, CSV or Excel, fetch through the Apify API, or schedule runs and pipe them into Google Sheets, Make, Zapier, n8n or your own code. Eligible for agentic use via Apify's MCP server.