ActorStack.dev

TennisExplorer output fields, by entity type

What each of the four entity types returns, which fields are derived rather than read, and the one column that is recounted when the source publishes a flag instead.

By Oswaldo Carabano7 min read

Short answer

Each of the four entity types returns its own shape. Results and schedule rows carry match identity, `start_time_utc`, both players, the raw scoreline, recounted set counts and the derived `status`. Player rows carry profile data and optional match history. Ranking rows carry position, points and the publication week. Two fields are derived rather than read: `status`, which the source never labels, and `home_sets`/`away_sets`, which are recounted from the scoreline on unfinished matches because the source's result column becomes a won/lost flag there rather than a set count.

Key points

  • `status` is derived, not read — the source labels no retirements or walkovers anywhere.
  • On an unfinished match the source's result column is a won/lost flag reading `1-0` regardless of how many sets were played, so `home_sets` and `away_sets` are recounted from the scoreline.
  • `sets` always carries the raw scoreline, so a recount can be checked against the source rather than trusted.
  • `start_time_utc` is named for its timezone because the source's own day boundary moves with a cookie.
  • Round, surface, both rankings and head-to-head only appear when match detail is enabled, at one extra request per match.
On this page6 sections

Four entity types, four shapes. Two fields in the match shapes are derived rather than read, and both are derived because the source publishes something that would otherwise be misread.

Results and schedule rows

FieldNotes
match_idStable within the date and tour.
start_time_utcPinned to UTC. The name states the assumption.
touratp-single, atp-double, wta-single or wta-double.
tournamentThe tournament the match belongs to.
home_player / away_playerFull names, read from the attribute rather than the visible label.
setsThe raw scoreline, always, exactly as published.
home_sets / away_setsRecounted from the scoreline on unfinished matches.
statusDerived: completed, retired or walkover.

The two derived fields

status is derived because the source labels no retirements or walkovers anywhere — how, and against what sample. About 4.6% of matches are affected.

The set counts are derived on a subset of rows, for the reason below.

Why set counts are recounted

So home_sets and away_sets are recounted from the scoreline on those rows, and sets always carries the raw string — which is what lets you check the recount rather than trust it.

Fields that need match detail

Round, surface, the players' rankings at the time and the head-to-head record. Each costs one extra request per match, so on a 400-match day the request count goes from 1 to 401 and the surcharge is $0.0024 per match.

Player and ranking rows

Player rows carry profile fields and, optionally, match history by season. Under-18 players are returned with birth_year instead of a full birthdate and no photo URL — why. Ranking rows carry position, points and the publication week.

Odds, and why they are empty by default

odds_home and odds_away exist and are null unless includeOdds is switched on. That default is deliberate — scores and odds are not the same kind of data.

Frequently asked questions

Which fields are derived rather than read from the page?
Two: `status`, because the source labels no retirements or walkovers, and the set counts on unfinished matches, which are recounted from the scoreline because the source's result column becomes a won/lost flag there.
Why does an unfinished match show 1-0?
Because that column is the source's won/lost flag rather than a set count on those rows — it reads `1-0` no matter how many sets were actually played. `home_sets` and `away_sets` are recounted from the scoreline so they are never the flag, and `sets` keeps the raw string.
Which fields need match detail enabled?
Round, surface, full player names on detail pages, both players' rankings and the head-to-head. Each costs one extra request per match, which is why it is off by default.
Why are the odds columns empty?
Because `includeOdds` is off by default. Odds are licensed from bookmakers rather than being facts about the match, so they are opt-in.

Sources

Every URL below was requested and returned a page on the date shown.

  1. Operator claimchecked 9 Sept 2026
    TennisExplorer Scraper — Actor README and input schemaActorStack / Apify Store
A single tennis ball resting on the red clay surface of an empty court.
TennisExplorerReference

Player profiles

Profiles with as many past seasons as you ask for, one request per season each — and a deliberate reduction for players under 18.

5 min
A white measuring tape curving across a dark background, showing the numbers 15 to 45.
TennisExplorerReference

Rankings

Singles, doubles and the season race, for the current week or a past one — with the constraint that a historical week has to be a date the source actually published.

5 min
Two players mid-rally on an indoor clay tennis court during a competitive match.
TennisExplorerGuide

Scrape tennis results

A walkthrough of extracting tennis data: one entity type per run, the day boundary that has to be pinned, and the two enrichments that cost an extra request each.

8 min