A duplicate match should not add a second win to a player's history. A conflicting duplicate is more difficult: choosing whichever row arrived last can create a clean-looking summary while concealing a source disagreement. A quality step should keep that identity out of the aggregate until the conflict is resolved.
Tennis Match Dataset Quality Analyzer validates supplied records and returns descriptive historical summaries plus quality findings. It does not collect match results or predict future performance. The useful output is an inspectable account of the submitted batch.
Keep provider identity in the input
This fictional synthetic match follows the installed README's real-analysis example. demo:false selects the billable analysis route when a useful report is produced; fictional data does not automatically make that route free. No platform run was started for this article.
{
"demo": false,
"matches": [
{
"namespace": "synthetic-example",
"matchId": "demo-match",
"playedOn": "2026-09-01",
"winnerId": "demo-player-a",
"loserId": "demo-player-b",
"status": "completed",
"surface": "hard",
"bestOf": 3,
"sets": [
{
"winnerGames": 6,
"loserGames": 3
},
{
"winnerGames": 7,
"loserGames": 5
}
]
}
]
}
namespace scopes matchId and player IDs. Do not remove it when combining providers unless you have separately established their crosswalk. The analyzer does not perform fuzzy player matching or merge identity spaces. Keep a mapping review outside the quality report when two feeds use different IDs for the same person.
Read set orientation carefully
winnerGames and loserGames follow the overall match winner and loser. In a set lost by the eventual match winner, winnerGames can be smaller. Relabeling each set independently would change the meaning of the record and can produce incorrect match validation.
The supported completed-set formats include ordinary six-game sets and supported tiebreak endings. Short-set, match-tiebreak and advantage-set formats are outside this contract. If your feed uses them, route those records for an explicit adapter decision rather than coercing them into the nearest allowed score. Unsupported scoring should remain visible as a quality issue.
Quarantine by identity rather than arrival order
Normalized exact duplicates count once; JSON property order alone does not create a conflict. Conflicting valid rows quarantine their whole identity group. A malformed row with a readable identity also quarantines valid siblings in that group. Independent valid identities remain usable, so a partial report can still carry useful descriptive results.
That behavior belongs in the importer's acceptance criteria. Test one exact duplicate, one conflict for the same namespace and matchId, and another independent valid match. Inspect the accepted counts and issue row indexes rather than only the run status. A successful computation is not enough if the downstream importer silently reintroduces the quarantined records.
Keep descriptive statistics descriptive
Retired and walkover records do not become ordinary completed wins in the same way as accepted completed matches. The report distinguishes those categories and can return null rates where no completed-match denominator exists. Preserve null rather than replacing it with a zero-percent estimate.
issues is bounded to 100 findings while counting continues; issuesTruncated signals more evidence than the displayed list. Fetch the complete nested Dataset report and retain the quality section with the player summaries. Each new run is a new analysis, and an uncertain Dataset write is not automatically retried. Inspect the existing Dataset and event counters before repeating delivery. This establishes a reproducible batch-quality boundary without turning a historical sample into a skill ranking or source-accuracy certificate.
Price and verification scope
FREE-tier event prices read on 24 October 2026 are $0.005 for apify-actor-start and $0.15 for result-found. Start-event count can depend on allocated memory; other account tiers have their own rates. Check the listing's current billable unit and the platform's run spending limit before executing an example. Input row or result caps are separate from Max total charge. A free diagnostic does not necessarily remove the platform start charge.
This article is pinned to public latest build 0.1.5 (gDFJh50dTmhscNQ3e) at the recorded read time. Source, input and pricing were read from Apify; no new cloud build or run was started. The supplied example and any synthetic local checks do not establish current source facts, cloud delivery or customer outcomes.
Inspect the Actor's current contract and pricing.
AI-assisted writing. Source contracts and verification limits are documented above.
Top comments (0)