Tennis Scraper & Scores API โ€” ATP, WTA, Live, Stats avatar

Tennis Scraper & Scores API โ€” ATP, WTA, Live, Stats

Pricing

from $2.10 / 1,000 result rows

Go to Apify Store
Tennis Scraper & Scores API โ€” ATP, WTA, Live, Stats

Tennis Scraper & Scores API โ€” ATP, WTA, Live, Stats

Tennis scraper on SofaScore data: live scores, schedules, results, match statistics, point by point, betting odds, ATP and WTA rankings, player profiles and draws for ATP, WTA, Challenger, ITF and UTR. One flat row per match. Export to CSV or JSON, run via API, schedule, or call from AI agents.

Pricing

from $2.10 / 1,000 result rows

Rating

5.0

(5)

Developer

Matvey

Matvey

Maintained by Community

Actor stats

0

Bookmarked

22

Total users

17

Monthly active users

21 hours ago

Last modified

Share

Tennis Scores & Stats API returns live tennis scores, the full daily schedule, finished results with set scores and tiebreaks, match statistics, point-by-point records, head-to-head and the official ATP and WTA rankings for ATP, WTA, ATP Challenger, WTA 125, ITF men and women, Davis Cup, Billie Jean King Cup and United Cup โ€” one flat row per match with both players, their countries, sets, games, tiebreak points and a one-sentence summary you can drop straight into a message, a spreadsheet or a prompt. No API key, no browser, no login.

One run of Tennis Scores & Stats API: todayโ€™s ATP and WTA card with scores, status and surface.

Pick what you want โ€” the schedule for a date, matches in play now, yesterday's results, one match in depth, a player, the rankings or a name lookup โ€” and click Start. Export JSON, CSV or Excel, run it on a schedule, or call it from the API, n8n, Make or an AI agent through MCP.

What is Tennis Scores & Stats API?

It is a tennis data API for people who need scores as a table rather than a web page: betting and trading models, fantasy tools, Discord and Telegram bots, dashboards, newsletters, coaching and scouting research, and AI agents that get asked "who is playing today", "did Sinner win" or "who is number one". The official tour feeds are licensed to broadcasters and cost thousands a month; this Actor turns the public live-score data into clean rows at pay-per-result prices.

  • Every tour in one place: ATP, WTA, ATP Challenger, WTA 125, ITF men and women, Davis Cup, Billie Jean King Cup, United Cup and exhibitions. Grand Slams sit under ATP and WTA.
  • One request per day of tennis. A single feed carries the whole professional day โ€” around 450 matches across 65 tournaments, with set scores and tiebreaks already in it. Filtering by tour makes a run cheaper, never slower.
  • The state of play, exactly. A match is upcoming, live (with the set being played), finished, retired, walkover, awarded, canceled, postponed, interrupted or suspended. A retirement is not passed off as a completed match and a cancelled match does not arrive as a finished one with an empty score.
  • Match statistics per match and per set: aces, double faults, first and second serve, break points saved and converted, return points, winners โ€” around 65 numbers on a played match.
  • Point by point: every game of every set with its point sequence, who served and who won the game โ€” the raw material for pressure-point and momentum models.
  • Head-to-head: both players' recent form and their previous meetings, grouped by surface.
  • Official rankings: the ATP list from atptour.com and the WTA list from the WTA's own API, singles or doubles, with points, weekly change, tournaments played and age. Shared ranks are marked, not silently collapsed.
  • Official WTA feed: ranking points per match and prize money, which no live-score source publishes.
  • Pure HTTP: no headless browser, so a run finishes in seconds.

What data can Tennis Scores & Stats API extract?

Matches โ€” schedule, live and results

FieldExample
tour, tournament, tournamentCountry, surface, qualificationATP ยท Beijing ยท China ยท hard ยท false
status, statusStage, playedlive ยท thirdSet ยท false
startTime, date, endTime2026-09-30T03:00:00Z ยท 2026-09-30 ยท null
homePlayer, homePlayerId, homeCountryName, homeAbbrKhachanov K. ยท xrv5d34n ยท Russia ยท KHA
awayPlayer, awayPlayerId, awayCountryName, awayAbbrAuger-Aliassime F. ยท AexDfsZb ยท Canada ยท AUG
matchType, discipline, homePartners, awayPartnersdoubles ยท doubles ยท ["Bublik A.", "Shang J."] ยท ["Cerundolo F.", "Rinderknech A."]
homeSets, awaySets, score, sets1 ยท 1 ยท 6-4 6-7(3) 2-4 ยท [{set: 1, home: 6, away: 4, homeTiebreak: null, โ€ฆ}]
winner, winnerNameaway ยท Smith K.
summary"Bigun K. vs Smith K., CHALLENGER MEN Columbus โ€” Smith K. won 6-4 6-7(3) 2-6"
matchId, matchUrl, homePlayerUrlQJjs1NQF ยท flashscore.com/match/QJjs1NQF/ ยท flashscore.com/player/bigun-kaylan/4x8wdYzS/

Optional blocks on every match row: statistics, pointByPoint, headToHead.

Two things this source does not carry, stated plainly so you do not plan around them: the round of a tournament (a schedule row's round is null) and betting odds. If you need either, the schedule and result data here will not give it to you.

Rankings

tour, rank, tied, player, playerId, country, countryName, age, points, pointsChange, rankChange, tournamentsPlayed, playerUrl โ€” the same columns for both tours, so a run with rankingTour: "both" is one clean table rather than two glued together.

ATP comes from atptour.com, WTA from the tour's own API; if one is unavailable the other still runs. The two tours publish different movement numbers and this Actor does not pretend otherwise: pointsChange is how many points a player gained or lost (ATP) and rankChange is how many places they moved (WTA). Each tour fills the one it actually publishes and leaves the other null.

Official WTA feed โ€” ranking points and prize money

Live-score sites publish scores; they do not publish what a match was worth. The four wta* modes read the WTA tour's own API instead, so every row carries the money and the points.

ModeWhat you get
wtaMatchesA player's match history, newest first: date, tournamentName, round, discipline, opponentName, opponentRank, score, won, outcome, rankingPoints, prizeWon, tournamentPrizeMoney
wtaRankingsThe official singles or doubles list: rank, points, tournamentsPlayed, movement, rankedAt
wtaPlayersTour player profiles: playerName, countryCode, dateOfBirth, profileUrl
wtaTournamentsThe tour calendar: title, level, surface, indoorOutdoor, city, country, singlesDrawSize, doublesDrawSize, prizeMoney

Every row from these modes is marked source: "wta", so a mixed dataset stays easy to split. Look a player up by name in playerName, or pass tour ids in playerIds; set wtaYear for a single season, and newestFirst: false to read a career from its first match forward.

How much does it cost to get tennis scores?

The Actor uses Apify's pay-per-event pricing with one price for every row: a match, a ranking line, a WTA player, a tournament or a search hit. Nothing per page, nothing per proxy megabyte, and error and notice rows are never charged.

What you getPricePer 1,000
Any row (match, ranking, player, tournament, search hit)$0.0009$0.90
Optional detail block on a match (statistics, point-by-point or head-to-head), each$0.0009$0.90

Bronze, Silver and Gold Store tiers pay 10%, 20% and 30% less. These prices apply from 8 October 2026; until then a row costs $0.003.

What typical jobs cost: yesterday's finished matches across all professional tours, 100 rows โ€” $0.09; the same 100 matches with statistics โ€” $0.18; today's ATP and WTA card, about 30 rows โ€” $0.03; ATP top 100 โ€” $0.09. The Apify Free plan ($5 monthly credit) covers about 5,500 rows a month.

Bulk export

Put a wide date range into one run or call the Actor from the API on a schedule: 50,000 match rows cost $45, whether they come from one run or a thousand. Detail blocks are off by default, so you pay for them only when you switch them on.

How to get tennis scores with Tennis Scores & Stats API

  1. Open the Actor and pick What to get โ€” Schedule is the default.
  2. Choose the Tours (ATP and WTA are preselected; adding Challenger and ITF adds several hundred matches a day), the Date (today by default) and how many Days back or Days ahead.
  3. Optionally keep only live, upcoming, played or not-played matches, singles or doubles, or one player's matches.
  4. Switch on statistics, point by point or head-to-head if you need them on every match โ€” each adds a request per match and is billed as one extra row.
  5. Click Start. Results appear in the Matches table view; other modes fill the Results, Rankings, Players and Search views.
  6. Download as JSON, CSV or Excel, or read the dataset through the API.

โฌ‡๏ธ Input

Tennis Scores & Stats API input form: the fields a buyer fills in before pressing Start

Today's ATP and WTA schedule with live scores

{ "mode": "schedule" }

Yesterday's and today's results with scores and winners

{ "mode": "results", "tours": ["atp", "wta"], "daysBack": 1 }

The week of a tournament, singles only, with statistics

{
"mode": "schedule",
"dateFrom": "2026-09-28",
"days": 6,
"tours": ["atp", "wta"],
"status": "finished",
"matchType": "singles",
"includeStatistics": true
}

Matches in play right now, every tour

{ "mode": "live", "tours": ["all"] }

One match in depth โ€” statistics, point by point and head-to-head

{ "mode": "match", "matchIds": ["QJjs1NQF"], "includeStatistics": true, "includePointByPoint": true }

One player's matches over the last two weeks

{ "mode": "player", "playerName": "Alcaraz", "daysBack": 14, "maxMatchesPerPlayer": 20 }

ATP and WTA top 100

{ "mode": "rankings", "rankingTour": "both", "rankingTop": 100 }

Find a player id by name

{ "mode": "search", "query": "Alcaraz" }
FieldDescription
modeschedule, live, results, match, player, search, rankings, or one of the four wta* modes
dateFrom, daysBack, daysDay in UTC and how many days before and after it to include (up to 14 each way)
toursatp, wta, challenger, challenger_women, itf_men, itf_women, davis_cup, bjk_cup, united_cup, exhibition, all
status, matchType, playerNameKeep only upcoming / live / played / not-played, singles / doubles, or one player's matches
includeStatistics, includePointByPoint, includeHeadToHeadDetail blocks on every match ($)
matchIds, playerIds, queryIds or URLs for match and player modes, and the name to search
rankingTour, rankingDiscipline, rankingTopatp, wta or both; singles or doubles; rows per list
maxMatches, maxMatchesPerPlayer, concurrencyCaps and speed
proxyConfigurationOff by default โ€” see the FAQ

Ids appear in every row: matchId on matches, homePlayerId / awayPlayerId for players. Search mode returns them by name.

โฌ†๏ธ Output

Match

{
"type": "match",
"matchId": "QJjs1NQF",
"eventId": "QJjs1NQF",
"matchUrl": "https://www.flashscore.com/match/QJjs1NQF/",
"tour": "CHALLENGER MEN",
"tournament": "Columbus",
"tournamentFull": "CHALLENGER MEN - SINGLES: Columbus (USA), hard (indoor)",
"tournamentCountry": "USA",
"surface": "hard (indoor)",
"qualification": false,
"matchType": "singles",
"discipline": "singles",
"round": null,
"status": "finished",
"statusStage": "finished",
"played": true,
"startTime": "2026-09-29T17:00:00Z",
"date": "2026-09-29",
"homePlayer": "Bigun K.", "homePlayerId": "4x8wdYzS", "homeCountryName": "United States", "homeAbbr": "BIG",
"awayPlayer": "Smith K.", "awayPlayerId": "8mKp2lQr", "awayCountryName": "United States", "awayAbbr": "SMI",
"homeSets": 1, "awaySets": 2,
"score": "6-4 6-7(3) 2-6",
"sets": [
{ "set": 1, "home": 6, "away": 4, "homeTiebreak": null, "awayTiebreak": null },
{ "set": 2, "home": 6, "away": 7, "homeTiebreak": 3, "awayTiebreak": 7 },
{ "set": 3, "home": 2, "away": 6, "homeTiebreak": null, "awayTiebreak": null }
],
"winner": "away",
"winnerName": "Smith K.",
"summary": "Bigun K. vs Smith K., CHALLENGER MEN Columbus โ€” Smith K. won 6-4 6-7(3) 2-6",
"statistics": [
{ "section": "Match", "group": "Service", "name": "Aces", "home": "9", "away": "14" },
{ "section": "Match", "group": "Service", "name": "Double Faults", "home": "2", "away": "9" },
{ "section": "Match", "group": "Service", "name": "1st serve points won", "home": "69% (53/77)", "away": "77% (47/61)" },
{ "section": "Set 1", "group": "Service", "name": "Aces", "home": "4", "away": "6" }
],
"pointByPoint": [
{ "set": "Set 1", "games": [ { "server": "home", "winner": "away", "points": "0:15, 0:30, 0:40, 15:40, 30:40" } ] }
],
"scrapedAt": "2026-09-30T06:00:00.000Z"
}

A live match carries the set in play in statusStage (firstSet โ€ฆ fifthSet, or firstSetTiebreak and friends) and the sets finished so far in score and sets. An upcoming match carries the start time and no score.

A retirement, a walkover and a cancellation

These are the rows most tennis datasets get wrong, so here is what they look like:

{ "status": "retired", "played": true, "score": "5-7 0-3", "winnerName": "Pace F.", "summary": "Rogers A. S. vs Pace F., ITF WOMEN W100 Templeton, CA โ€” Pace F. won after a retirement 5-7 0-3" }
{ "status": "walkover", "played": true, "score": null, "winnerName": "Bianchi J. J.", "summary": "Bianchi J. J. / Pearson K. vs Krumich M. / Martin A., CHALLENGER MEN Bari โ€” Bianchi J. J. / Pearson K. won by walkover" }
{ "status": "canceled", "played": false, "score": null, "winnerName": null, "summary": "Golubic V. vs Korneeva A., WTA Beijing โ€” canceled, was due 2026-09-30 03:00:00 UTC" }

Filter with status: "finished" to keep everything that produced a result โ€” including retirements and walkovers โ€” or status: "notPlayed" for the ones that did not happen.

Ranking row

{ "type": "ranking", "tour": "ATP", "rank": 1, "tied": false, "player": "Jannik Sinner", "playerId": "s0ag", "country": "ITA", "countryName": "Italy", "age": 25, "points": 11000, "pointsChange": -500, "rankChange": null, "tournamentsPlayed": 16, "playerUrl": "https://www.atptour.com/en/players/jannik-sinner/s0ag/overview" }
{ "type": "ranking", "tour": "WTA", "rank": 1, "tied": false, "player": "Elena Rybakina", "playerId": 324166, "country": "KAZ", "countryName": "Kazakhstan", "age": 27, "points": 9901, "pointsChange": null, "rankChange": 0, "tournamentsPlayed": 18, "playerUrl": "https://www.wtatennis.com/players/324166" }

In doubles two players can share a rank; both rows carry "tied": true and the next number is skipped, exactly as the tour publishes it.

Search result

{ "type": "search", "resultType": "player", "name": "Alcaraz Carlos", "title": "Alcaraz Carlos (Spain)", "playerId": "UkhgIFEq", "playerUrl": "https://www.flashscore.com/player/alcaraz-garfia-carlos/UkhgIFEq/", "useAs": "playerIds", "query": "alcaraz" }

Use the Matches, Results, Rankings, Players and Search results table views in the dataset to browse, or download everything as CSV/Excel.

Use cases for tennis data

Betting models and trading bots

Pull the day's schedule in the morning, the live board every minute during play, and includePointByPoint on played matches to build serve-hold, break-point and momentum features. statusStage tells you which set is on court without parsing a score string, and played separates real results from walkovers before they poison a model.

Fantasy, pools and bracket challenges

Run results daily with daysBack: 1 to advance winners automatically. status tells you whether a win came from a retirement or a walkover, which most scoring rules treat differently.

Bots, alerts and newsletters

summary is a ready sentence per match; filter on status: "finished" and playerName to post "Smith K. won 6-4 6-7(3) 2-6" the moment it happens.

Coaching, scouting and research

Statistics per set and the point sequence per game for any match on any tour, including Challenger and ITF where no other free source exists, plus head-to-head split by surface.

AI agents

Agents answer "who plays in Beijing today", "did Alcaraz win" or "who is number one" from one call โ€” the rows are flat, self-describing and carry the ids for follow-up questions.

Integrations and tennis API

Run the Actor from the Apify API or the JavaScript and Python clients, on a schedule (every minute during play for live scores, daily for schedules and rankings), and connect it to n8n, Make, Zapier, Google Sheets, Slack, Discord or webhooks through Apify integrations.

curl -X POST "https://api.apify.com/v2/acts/lergassy~tennis-scores-api/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "mode": "live", "tours": ["atp", "wta"] }'
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("lergassy/tennis-scores-api").call(run_input={"mode": "results", "daysBack": 1, "tours": ["atp", "wta"]})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row["summary"])

Use it from Claude, Cursor or any MCP agent

Connect the Apify MCP server and let the agent call lergassy/tennis-scores-api โ€” the modes map onto natural questions (schedule โ†’ "who plays today", results โ†’ "did X win", rankings โ†’ "who is number one").

๐Ÿค– For AI Agents & LLM Apps

Compact reference for agents calling this Actor through the Apify MCP server or the Apify API (lergassy/tennis-scores-api).

Purpose: live and scheduled tennis matches with scores, players, statistics, point by point, head-to-head and official ATP/WTA rankings for every professional tour. Use it to answer "who is playing today / now", "did X win and what was the score", "who is number one" and "how did X's last matches go".

Minimal input:

{ "mode": "schedule" }

Output: one row per match โ€” type, matchId, matchUrl, tour, tournament, tournamentCountry, surface, qualification, matchType, discipline, status, statusStage, played, startTime, date, endTime, homePlayer, homePlayerId, homeCountryName, homeAbbr, homePartners, the same four for away, homeSets, awaySets, score, sets[], winner, winnerName, summary, plus optional statistics[], pointByPoint[] and headToHead[]. Other modes return ranking and search rows, and the wta* modes return WTA player, ranking, tournament and match rows.

Behaviors an agent should know:

  • Dates are UTC days. status is upcoming, live, finished, retired, walkover, awarded, canceled, postponed, interrupted, suspended or unknown; played is true for the four that produced a result. Do not report a canceled or postponed match as a result โ€” it has no score.
  • While a match is live, statusStage names the set in play. round is always null: this source does not publish it.
  • Quote summary when the user wants a sentence; quote score and winnerName when they want the result.
  • Ids chain: homePlayerId / awayPlayerId โ†’ playerIds; matchId โ†’ matchIds for statistics and point by point. Unknown name? Run search first.
  • matchIds only works while the match is inside the source's rolling week; older matches must be reached through dateFrom.
  • Doubles rows name the pair (Bublik A. / Shang J.) and list both players in homePartners / awayPartners; use matchType: "singles" to skip them.
  • includeStatistics, includePointByPoint and includeHeadToHead each add a request and one billed row per match โ€” turn them on only when the question needs them. Head-to-head is the heaviest; do not switch it on for a whole day.
  • Rankings are the official weekly lists. In doubles, tied: true means two players share a rank. pointsChange (ATP) and rankChange (WTA) are different quantities โ€” points versus places โ€” so do not compare them to each other.
  • Rows are a snapshot at run time. For live scores schedule the run every minute rather than polling inside one run.

โ“ FAQ

Scores, schedules, rankings and statistics are facts, and this Actor reads only public, non-personal data shown to every visitor. Respect the source's terms and your local law for commercial use, especially around betting โ€” consult a lawyer if unsure.

Is there an official ATP or WTA API?

Not for the public. The tours license their data to broadcasters and betting companies. The ranking modes here read each tour's own public pages, and the wta* modes read the WTA's own API; everything else is a tennis scores API alternative built on public live-score data.

Can I use Tennis Scores & Stats API with the Apify API?

Yes โ€” start runs, pass input and read the dataset with any HTTP client or the official JavaScript and Python clients. See the snippets above.

Can I use it through an MCP server?

Yes. Add the Apify MCP server to Claude, Cursor, ChatGPT or your own agent and call lergassy/tennis-scores-api.

Can I integrate it with other apps?

Yes โ€” n8n, Make, Zapier, Google Sheets, Slack, Discord, Airtable and webhooks through Apify integrations, or a scheduled run that posts the dataset anywhere.

How fresh are live scores?

Each run is a snapshot of the live feed at that moment, usually within seconds of the court. Schedule the live mode every minute during sessions you care about.

Which tours and tournaments are covered?

All four Grand Slams, ATP Masters 1000 down to 250, WTA 1000 to 250, WTA 125, ATP Challenger, ITF World Tennis Tour men and women, Davis Cup, Billie Jean King Cup, United Cup and exhibitions โ€” roughly 450 matches across 65 tournaments on a normal day.

Do I get doubles?

Yes โ€” doubles matches are rows with matchType: "doubles" and both partners listed. Filter with matchType if you only want singles.

Do you have betting odds?

No. Odds are the one thing this source does not hand over to a server outside its licensed regions, and an option that quietly returns nothing is worse than no option, so there is none. If odds are what you need, Sports Odds API covers tennis among other sports.

Why is round empty?

The day feed that makes this Actor fast and cheap does not carry the round โ€” it is only on an individual match page, which would mean one extra page fetch per match. Rather than charge for that or guess it from the draw, the field is honestly null.

Why is the point-by-point empty for a match?

Point sequences exist for matches with live scoring, which covers ATP, WTA, Challenger and most ITF events. Some ITF matches are entered set by set, and upcoming matches have no points yet.

How far back can I go?

About two months around today, which is what the source keeps. matchIds works for roughly the last week; for older matches use dateFrom.

Do I need proxies?

No, and they are off by default. The source answers ordinary datacenter addresses, and one day of matches is well over a megabyte โ€” pushing that through residential addresses would cost more in bandwidth than the rows themselves. If a run is ever refused, the Actor retries once through the Apify proxy and says so in the log.

What happens on an error?

The Actor writes an error row with the scope (date, tour or id) instead of failing silently, and you are not charged for it. A quiet day โ€” no matches matching your filters โ€” produces a notice row that says so, also free.

Your feedback

Need another field (serve speeds, rally lengths, the round, historical seasons) or another mode (head-to-head by player pair, weekly ranking history)? Open an issue in the Issues tab. If the data helped, a review helps other tennis people find it.

You might also like

ActorWhat it does
WTA Tennis ScraperOfficial WTA data by player: match history with points and prize money, live ranking tables, profiles, calendar
Sports Odds APIBetting odds and lines across tennis, football, basketball and more
Sports Scores & Schedules APIScores, schedules, standings, rosters and betting lines for NFL, NBA, MLB, NHL, soccer, UFC, F1 and golf
Google Flights ScraperFlight prices, price calendars and booking links from Google Flights
Agoda Reviews ScraperHotel reviews from Agoda, including the Booking.com reviews shown on Agoda
Trip.com ScraperHotels with prices, details and guest reviews from Trip.com