diff --git a/CHANGELOG.md b/CHANGELOG.md index db78618..72f7f7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ All notable changes to the specification are recorded here. The API surface is versioned as `v1`. Changes within `v1` are **additive only**; removing a field or changing its type would require `v2`. +## [1.13.78] - 2026-10-29 + +### Changed +- **Shot-level winners and errors: where they are and when they are withheld.** The family is present where the statistics source counts it: the 2026 Grand Slam main draws (Wimbledon and the US Open near complete, the Australian Open and Roland Garros filling as the completed-match statistics fetch walks back) and the odd regular-tour match. The earlier note that it had not been available since 2026-07-12 described live payloads of the regular tour and is replaced. A family the source filled with zeros is now withheld: a side that won 20 points or more with every by-shot winner and error at 0 is not measured, and the whole family is omitted, totals included. 33 of 33 Roland Garros 2026 qualifying payloads carried such zeros. + ## [1.13.77] - 2026-10-29 ### Fixed diff --git a/docs/auth-quota-and-health.html b/docs/auth-quota-and-health.html index 8731ef1..869de53 100644 --- a/docs/auth-quota-and-health.html +++ b/docs/auth-quota-and-health.html @@ -202,7 +202,7 @@
Live Tennis API DocsGet a free key
Explore the documentation
-

Live Tennis API · docs · version 1.13.77

+

Live Tennis API · docs · version 1.13.78

Tennis API authentication, quota and status

How do you authenticate, and how do you see what quota is left? Send your key as X-API-Key on every request. GET /usage returns your own consumption against your plan's quota and works on every tier including FREE, so a client can check its own headroom before a burst. GET /health is the unauthenticated liveness probe.

2 endpoints on this page. Base URL diff --git a/docs/broadcast-graphics.html b/docs/broadcast-graphics.html index 178c4df..24369db 100644 --- a/docs/broadcast-graphics.html +++ b/docs/broadcast-graphics.html @@ -202,7 +202,7 @@

Live Tennis API DocsGet a free key
Explore the documentation
-

Live Tennis API · docs · version 1.13.77

+

Live Tennis API · docs · version 1.13.78

Tennis scores for on-air graphics

How do you put live tennis scores into a broadcast graphics template? GET /broadcast/match/{matchId} returns ONE flat object for one match and GET /broadcast/live the same object for every live match in a single call. Both are ULTRA. A graphics template binds each field to a fixed path, so three things are contractual: the object is flat, every key is present on every read (null, never missing), and the score is already in display form — p1_points reads "40" or "AD" and set_line is one string. Built for 1 Hz: every response carries a strong ETag, so If-None-Match makes an unchanged state a 304 with no body. Detect a new state on sequence, never on served_at, which changes on every read.

2 endpoints on this page. Base URL diff --git a/docs/changelog.html b/docs/changelog.html index 16cfd75..1425d1e 100644 --- a/docs/changelog.html +++ b/docs/changelog.html @@ -4,7 +4,7 @@ Live Tennis API — Changelog - + @@ -14,7 +14,7 @@ @@ -204,8 +204,13 @@

Live Tennis API · docs

Changelog

-

Every change to the specification, dated and versioned. The API surface is v1; changes within it are additive only. Current version 1.13.77, last change . Also as the full reference, OpenAPI YAML / JSON, and the dated facts file.

+

Every change to the specification, dated and versioned. The API surface is v1; changes within it are additive only. Current version 1.13.78, last change . Also as the full reference, OpenAPI YAML / JSON, and the dated facts file.

+

1.13.78

+

Changed

+
    +
  • Shot-level winners and errors: where they are and when they are withheld. The family is present where the statistics source counts it: the 2026 Grand Slam main draws (Wimbledon and the US Open near complete, the Australian Open and Roland Garros filling as the completed-match statistics fetch walks back) and the odd regular-tour match. The earlier note that it had not been available since 2026-07-12 described live payloads of the regular tour and is replaced. A family the source filled with zeros is now withheld: a side that won 20 points or more with every by-shot winner and error at 0 is not measured, and the whole family is omitted, totals included. 33 of 33 Roland Garros 2026 qualifying payloads carried such zeros.
  • +

1.13.77

Fixed

    diff --git a/docs/historical-results-archive.html b/docs/historical-results-archive.html index 1cecdcb..4042e7b 100644 --- a/docs/historical-results-archive.html +++ b/docs/historical-results-archive.html @@ -202,7 +202,7 @@
    Live Tennis API DocsGet a free key
    Explore the documentation
    -

    Live Tennis API · docs · version 1.13.77

    +

    Live Tennis API · docs · version 1.13.78

    Historical tennis results API — 1968 onward

    How far back does the historical tennis data go, and what is in it? The results archive covers 1968 to 2022: GET /history/archive/matches for results, /archive/players for bios, /archive/career for career aggregates and GET /h2h for head-to-head across both the archive and our own completed matches. All BASIC. Matches from 2013 onward additionally carry a reconstructed point-by-point tape at /archive/matches/{archiveId}/tape (ULTRA).

    6 endpoints on this page. Base URL diff --git a/docs/live-scores.html b/docs/live-scores.html index b6eb6fa..75d2c09 100644 --- a/docs/live-scores.html +++ b/docs/live-scores.html @@ -202,7 +202,7 @@

    Live Tennis API DocsGet a free key
    Explore the documentation
    -

    Live Tennis API · docs · version 1.13.77

    +

    Live Tennis API · docs · version 1.13.78

    Live tennis scores API

    How do you read live tennis scores from the API? Poll GET /matches?status=live for the slate, then GET /matches/{matchId}/score for the lowest-latency read of one match. Both are on the FREE plan. Scores carry sets, games, points and the server; /events and /points give the same match as a stream of changes rather than a snapshot, so a client can catch up without re-reading state.

    11 endpoints on this page. Base URL diff --git a/docs/openapi.json b/docs/openapi.json index eb1af03..d3e577b 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.1.0", "info": { "title": "Live Tennis API", - "version": "1.13.77", + "version": "1.13.78", "contact": { "name": "Live Tennis API", "url": "https://livetennisapi.com" @@ -7505,7 +7505,7 @@ }, "MatchStatisticsMeasured": { "type": "object", - "description": "Measured counting statistics for one player. These are COUNTED during the match, not derived from the point record — which is why they can include aces and double faults, and the derived fields above cannot. They are MATCH TOTALS only — one whole-match rollup per player; there are no per-set measured statistics.\nEVERY FIELD IS OPTIONAL AND AN ABSENT FIELD IS OMITTED, never zero-filled — absent means NOT MEASURED, and a present 0 is a real measured zero. Do not assume a fixed shape; read the keys you are given. Measured over 24,552 stored payloads (2026-07-31), coverage falls into three tiers:\nTIER 1 — present on 98.6-100% of payloads, on every tour including ITF: aces, double faults, points won, service and return points won, break points won, service games won, longest point and game runs, return points.\nTIER 2 — present on essentially all ATP, WTA and Challenger matches and on NO ITF singles match: the first and second serve split, break points saved, tiebreaks won, games won, service games played.\nTIER 3 — the winners / unforced-errors / forced-errors family, in total and by shot type. Historically delivered on ~43% of ATP singles, ~24% of WTA singles and ~47% of tour doubles, and on NONE of Challenger, ITF or juniors — those zeros are hard, not sampling noise. This group has NOT BEEN AVAILABLE at all since 2026-07-12 (measured 2026-08-17: 0 of 4,513 August payloads carry it, live ATP Masters included), so expect it absent on current matches until it returns.\nA `_of` suffix is the denominator of its base field and a `_pct` suffix is the percentage, recomputed from the two counts rather than read as a rounded figure.", + "description": "Measured counting statistics for one player. These are COUNTED during the match, not derived from the point record — which is why they can include aces and double faults, and the derived fields above cannot. They are MATCH TOTALS only — one whole-match rollup per player; there are no per-set measured statistics.\nEVERY FIELD IS OPTIONAL AND AN ABSENT FIELD IS OMITTED, never zero-filled — absent means NOT MEASURED, and a present 0 is a real measured zero. Do not assume a fixed shape; read the keys you are given. Measured over 24,552 stored payloads (2026-07-31), coverage falls into three tiers:\nTIER 1 — present on 98.6-100% of payloads, on every tour including ITF: aces, double faults, points won, service and return points won, break points won, service games won, longest point and game runs, return points.\nTIER 2 — present on essentially all ATP, WTA and Challenger matches and on NO ITF singles match: the first and second serve split, break points saved, tiebreaks won, games won, service games played.\nTIER 3 — the winners / unforced-errors / forced-errors family, in total and by shot type. Present where the statistics source counts it: the 2026 Grand Slam main draws (Wimbledon and the US Open near complete; the Australian Open and Roland Garros filling as the completed-match statistics fetch walks back) and the odd regular-tour match (two at Basel 2026). On NONE of Challenger, ITF or juniors, and on almost no regular-tour match since 2026-07-12. Nothing is promised for a future event: the family appears when the source states it. A family the source filled with zeros is withheld (2026-10-29): a side that won 20 points or more with every by-shot winner and error at 0 is not measured, and the whole family is omitted, totals included.\nA `_of` suffix is the denominator of its base field and a `_pct` suffix is the percentage, recomputed from the two counts rather than read as a rounded figure.", "properties": { "aces": { "type": [ diff --git a/docs/players-and-tournaments.html b/docs/players-and-tournaments.html index d9c4329..26e799e 100644 --- a/docs/players-and-tournaments.html +++ b/docs/players-and-tournaments.html @@ -202,7 +202,7 @@

    Live Tennis API DocsGet a free key
    Explore the documentation
    -

    Live Tennis API · docs · version 1.13.77

    +

    Live Tennis API · docs · version 1.13.78

    Tennis players, tournaments and rankings API

    How do you look up a player, a tournament or a ranking? GET /players searches by name and GET /players/{playerId} returns one player's bio, current ranking and cached statistics — both FREE. GET /players/{playerId}/stats (PRO) is the player's win/loss record over our completed matches, split by surface, level and season, with ULTRA adding summed serve and return statistics. GET /tournaments is the catalogue that Match.tournament_id joins against, so a match can be resolved to its event without a second lookup. GET /rankings serves rank-ordered listings on PRO. The per-player as-of records, including the Elo tape, are ULTRA.

    8 endpoints on this page. Base URL diff --git a/docs/point-by-point-history.html b/docs/point-by-point-history.html index 4947905..c18eff9 100644 --- a/docs/point-by-point-history.html +++ b/docs/point-by-point-history.html @@ -202,7 +202,7 @@

    Live Tennis API DocsGet a free key
    Explore the documentation
    -

    Live Tennis API · docs · version 1.13.77

    +

    Live Tennis API · docs · version 1.13.78

    Point-by-point tennis data API

    Which endpoints return point-by-point tennis data, and how complete is it? GET /history/matches/{matchId} returns the tape for one completed match: the ordered score states we hold for it. The model's win probability sits on the rows that were observed live, and coverage is declared per match. GET /history/matches lists completed matches with their tape coverage, and GET /history/coverage is the measured completeness rollup per tour and draw bucket — a number we publish rather than estimate, with its own as_of. GET /history/packages serves the same data as pre-built monthly bulk files.

    8 endpoints on this page. Base URL diff --git a/docs/push-feed-and-webhooks.html b/docs/push-feed-and-webhooks.html index d4ef447..e53df41 100644 --- a/docs/push-feed-and-webhooks.html +++ b/docs/push-feed-and-webhooks.html @@ -202,7 +202,7 @@

    Live Tennis API DocsGet a free key
    Explore the documentation
    -

    Live Tennis API · docs · version 1.13.77

    +

    Live Tennis API · docs · version 1.13.78

    Tennis WebSocket feed and webhooks

    How do you receive tennis data as it happens instead of polling? Two ways, both ULTRA. GET /ws-token mints a short-lived token for the high-fan-out push feed, which streams score and point changes as they are written. POST /webhooks registers an outbound HTTP callback for the same events; GET /webhooks lists your registrations and never returns the signing secret. Webhooks require a direct key, not a marketplace one.

    4 endpoints on this page. Base URL diff --git a/docs/reference.html b/docs/reference.html index 829dd04..e6b25f1 100644 --- a/docs/reference.html +++ b/docs/reference.html @@ -207,7 +207,7 @@

    Live Tennis API — Full Reference

    -

    Version 1.13.77 · OpenAPI 3.1.0

    +

    Version 1.13.78 · OpenAPI 3.1.0