Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion docs/auth-quota-and-health.html
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@
<header class="docs-site-header"><a class="docs-brand" href="./"><img src="logo.svg" width="28" height="28" alt="">Live Tennis API <span>Docs</span></a><nav class="docs-desktop-nav" aria-label="Documentation"><a href="./">Overview</a><a href="./reference.html">API reference</a><a href="./changelog.html">Changelog</a></nav><a class="docs-key" href="https://livetennisapi.com/subscribe/free">Get a free key <span aria-hidden="true">↗</span></a></header><details class="docs-topic-menu"><summary>Explore the documentation</summary><nav aria-label="Documentation topics"><a href="./">Overview</a><a href="./reference.html">API reference</a><a href="./changelog.html">Changelog</a><a href="./live-scores.html">Live tennis scores API</a><a href="./players-and-tournaments.html">Tennis players, tournaments and rankings API</a><a href="./tennis-odds.html">Tennis odds API — markets and price ticks</a><a href="./point-by-point-history.html">Point-by-point tennis data API</a><a href="./historical-results-archive.html">Historical tennis results API — 1968 onward</a><a href="./shot-level-rally-data.html">Shot-by-shot tennis rally and charting API</a><a href="./broadcast-graphics.html">Tennis scores for on-air graphics</a><a href="./push-feed-and-webhooks.html">Tennis WebSocket feed and webhooks</a><a href="./auth-quota-and-health.html" aria-current="page">Tennis API authentication, quota and status</a><a href="./ai-sdk.html">Live Tennis API tools for the Vercel AI SDK</a></nav></details>
<div class="wrap">
<header>
<p class="meta">Live Tennis API &middot; docs &middot; version 1.13.77</p>
<p class="meta">Live Tennis API &middot; docs &middot; version 1.13.78</p>
<h1>Tennis API authentication, quota and status</h1>
<p><strong>How do you authenticate, and how do you see what quota is left?</strong> Send your key as <code>X-API-Key</code> on every request. <code>GET /usage</code> 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. <code>GET /health</code> is the unauthenticated liveness probe.</p>
<p class="meta">2 endpoints on this page. Base URL
Expand Down
2 changes: 1 addition & 1 deletion docs/broadcast-graphics.html
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@
<header class="docs-site-header"><a class="docs-brand" href="./"><img src="logo.svg" width="28" height="28" alt="">Live Tennis API <span>Docs</span></a><nav class="docs-desktop-nav" aria-label="Documentation"><a href="./">Overview</a><a href="./reference.html">API reference</a><a href="./changelog.html">Changelog</a></nav><a class="docs-key" href="https://livetennisapi.com/subscribe/free">Get a free key <span aria-hidden="true">↗</span></a></header><details class="docs-topic-menu"><summary>Explore the documentation</summary><nav aria-label="Documentation topics"><a href="./">Overview</a><a href="./reference.html">API reference</a><a href="./changelog.html">Changelog</a><a href="./live-scores.html">Live tennis scores API</a><a href="./players-and-tournaments.html">Tennis players, tournaments and rankings API</a><a href="./tennis-odds.html">Tennis odds API — markets and price ticks</a><a href="./point-by-point-history.html">Point-by-point tennis data API</a><a href="./historical-results-archive.html">Historical tennis results API — 1968 onward</a><a href="./shot-level-rally-data.html">Shot-by-shot tennis rally and charting API</a><a href="./broadcast-graphics.html" aria-current="page">Tennis scores for on-air graphics</a><a href="./push-feed-and-webhooks.html">Tennis WebSocket feed and webhooks</a><a href="./auth-quota-and-health.html">Tennis API authentication, quota and status</a><a href="./ai-sdk.html">Live Tennis API tools for the Vercel AI SDK</a></nav></details>
<div class="wrap">
<header>
<p class="meta">Live Tennis API &middot; docs &middot; version 1.13.77</p>
<p class="meta">Live Tennis API &middot; docs &middot; version 1.13.78</p>
<h1>Tennis scores for on-air graphics</h1>
<p><strong>How do you put live tennis scores into a broadcast graphics template?</strong> <code>GET /broadcast/match/{matchId}</code> returns ONE flat object for one match and <code>GET /broadcast/live</code> 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 (<code>null</code>, never missing), and the score is already in display form — <code>p1_points</code> reads <code>"40"</code> or <code>"AD"</code> and <code>set_line</code> is one string. Built for 1 Hz: every response carries a strong <code>ETag</code>, so <code>If-None-Match</code> makes an unchanged state a 304 with no body. Detect a new state on <code>sequence</code>, never on <code>served_at</code>, which changes on every read.</p>
<p class="meta">2 endpoints on this page. Base URL
Expand Down
11 changes: 8 additions & 3 deletions docs/changelog.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Live Tennis API — Changelog</title>
<meta name="description" content="Every change to the Live Tennis API specification, dated and versioned: additive within v1, newest first. Current version 1.13.77, last change 2026-10-29.">
<meta name="description" content="Every change to the Live Tennis API specification, dated and versioned: additive within v1, newest first. Current version 1.13.78, last change 2026-10-29.">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://docs.livetennisapi.com/changelog.html">
<meta property="og:type" content="article">
Expand All @@ -14,7 +14,7 @@
<meta name="twitter:card" content="summary_large_image">
<link rel="icon" href="favicon.ico" sizes="any">
<script type="application/ld+json">
{"@context": "https://schema.org", "@type": "TechArticle", "headline": "Live Tennis API — Changelog", "description": "Every change to the Live Tennis API specification, dated and versioned: additive within v1, newest first. Current version 1.13.77, last change 2026-10-29.", "url": "https://docs.livetennisapi.com/changelog.html", "dateModified": "2026-10-29", "inLanguage": "en", "isPartOf": {"@type": "WebSite", "name": "Live Tennis API", "url": "https://livetennisapi.com"}, "publisher": {"@type": "Organization", "@id": "https://livetennisapi.com/#org", "name": "JSB Holdings LLC", "alternateName": "Live Tennis API", "url": "https://livetennisapi.com", "logo": "https://docs.livetennisapi.com/icon-256.png", "sameAs": ["https://rapidapi.com/contact-whTqTESH5/api/tennis-data-analytics-api3", "https://apify.com/livetennisapi/tennis-data-analytics", "https://api.market/store/live-tennis-api/tennis-data-analytics", "https://www.postman.com/livetennisapi", "https://github.com/livetennisapi", "https://pypi.org/project/livetennisapi/", "https://www.npmjs.com/package/livetennisapi", "https://www.npmjs.com/package/livetennisapi-mcp", "https://docs.livetennisapi.com", "https://x.com/livetennisapi"]}}
{"@context": "https://schema.org", "@type": "TechArticle", "headline": "Live Tennis API — Changelog", "description": "Every change to the Live Tennis API specification, dated and versioned: additive within v1, newest first. Current version 1.13.78, last change 2026-10-29.", "url": "https://docs.livetennisapi.com/changelog.html", "dateModified": "2026-10-29", "inLanguage": "en", "isPartOf": {"@type": "WebSite", "name": "Live Tennis API", "url": "https://livetennisapi.com"}, "publisher": {"@type": "Organization", "@id": "https://livetennisapi.com/#org", "name": "JSB Holdings LLC", "alternateName": "Live Tennis API", "url": "https://livetennisapi.com", "logo": "https://docs.livetennisapi.com/icon-256.png", "sameAs": ["https://rapidapi.com/contact-whTqTESH5/api/tennis-data-analytics-api3", "https://apify.com/livetennisapi/tennis-data-analytics", "https://api.market/store/live-tennis-api/tennis-data-analytics", "https://www.postman.com/livetennisapi", "https://github.com/livetennisapi", "https://pypi.org/project/livetennisapi/", "https://www.npmjs.com/package/livetennisapi", "https://www.npmjs.com/package/livetennisapi-mcp", "https://docs.livetennisapi.com", "https://x.com/livetennisapi"]}}
</script>
<link rel="preload" href="fonts/inter-latin-400.woff2" as="font" type="font/woff2" crossorigin fetchpriority="high">
<link rel="preload" href="fonts/space-grotesk-latin-700.woff2" as="font" type="font/woff2" crossorigin fetchpriority="high">
Expand Down Expand Up @@ -204,8 +204,13 @@
<header>
<p class="eyebrow">Live Tennis API · docs</p>
<h1>Changelog</h1>
<p>Every change to the specification, dated and versioned. The API surface is <code>v1</code>; changes within it are additive only. Current version <strong>1.13.77</strong>, last change <time datetime="2026-10-29">2026-10-29</time>. Also as <a href="https://docs.livetennisapi.com/reference.html">the full reference</a>, <a href="https://docs.livetennisapi.com/openapi.yaml">OpenAPI YAML</a> / <a href="https://docs.livetennisapi.com/openapi.json">JSON</a>, and <a href="https://livetennisapi.com/facts.json">the dated facts file</a>.</p>
<p>Every change to the specification, dated and versioned. The API surface is <code>v1</code>; changes within it are additive only. Current version <strong>1.13.78</strong>, last change <time datetime="2026-10-29">2026-10-29</time>. Also as <a href="https://docs.livetennisapi.com/reference.html">the full reference</a>, <a href="https://docs.livetennisapi.com/openapi.yaml">OpenAPI YAML</a> / <a href="https://docs.livetennisapi.com/openapi.json">JSON</a>, and <a href="https://livetennisapi.com/facts.json">the dated facts file</a>.</p>
</header>
<article id="v1.13.78"><h2>1.13.78 <time datetime="2026-10-29">2026-10-29</time></h2>
<h3>Changed</h3>
<ul>
<li><strong>Shot-level winners and errors: where they are and when they are withheld.</strong> 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.</li>
</ul></article>
<article id="v1.13.77"><h2>1.13.77 <time datetime="2026-10-29">2026-10-29</time></h2>
<h3>Fixed</h3>
<ul>
Expand Down
2 changes: 1 addition & 1 deletion docs/historical-results-archive.html
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@
<header class="docs-site-header"><a class="docs-brand" href="./"><img src="logo.svg" width="28" height="28" alt="">Live Tennis API <span>Docs</span></a><nav class="docs-desktop-nav" aria-label="Documentation"><a href="./">Overview</a><a href="./reference.html">API reference</a><a href="./changelog.html">Changelog</a></nav><a class="docs-key" href="https://livetennisapi.com/subscribe/free">Get a free key <span aria-hidden="true">↗</span></a></header><details class="docs-topic-menu"><summary>Explore the documentation</summary><nav aria-label="Documentation topics"><a href="./">Overview</a><a href="./reference.html">API reference</a><a href="./changelog.html">Changelog</a><a href="./live-scores.html">Live tennis scores API</a><a href="./players-and-tournaments.html">Tennis players, tournaments and rankings API</a><a href="./tennis-odds.html">Tennis odds API — markets and price ticks</a><a href="./point-by-point-history.html">Point-by-point tennis data API</a><a href="./historical-results-archive.html" aria-current="page">Historical tennis results API — 1968 onward</a><a href="./shot-level-rally-data.html">Shot-by-shot tennis rally and charting API</a><a href="./broadcast-graphics.html">Tennis scores for on-air graphics</a><a href="./push-feed-and-webhooks.html">Tennis WebSocket feed and webhooks</a><a href="./auth-quota-and-health.html">Tennis API authentication, quota and status</a><a href="./ai-sdk.html">Live Tennis API tools for the Vercel AI SDK</a></nav></details>
<div class="wrap">
<header>
<p class="meta">Live Tennis API &middot; docs &middot; version 1.13.77</p>
<p class="meta">Live Tennis API &middot; docs &middot; version 1.13.78</p>
<h1>Historical tennis results API — 1968 onward</h1>
<p><strong>How far back does the historical tennis data go, and what is in it?</strong> The results archive covers 1968 to 2022: <code>GET /history/archive/matches</code> for results, <code>/archive/players</code> for bios, <code>/archive/career</code> for career aggregates and <code>GET /h2h</code> 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 <code>/archive/matches/{archiveId}/tape</code> (ULTRA).</p>
<p class="meta">6 endpoints on this page. Base URL
Expand Down
2 changes: 1 addition & 1 deletion docs/live-scores.html
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@
<header class="docs-site-header"><a class="docs-brand" href="./"><img src="logo.svg" width="28" height="28" alt="">Live Tennis API <span>Docs</span></a><nav class="docs-desktop-nav" aria-label="Documentation"><a href="./">Overview</a><a href="./reference.html">API reference</a><a href="./changelog.html">Changelog</a></nav><a class="docs-key" href="https://livetennisapi.com/subscribe/free">Get a free key <span aria-hidden="true">↗</span></a></header><details class="docs-topic-menu"><summary>Explore the documentation</summary><nav aria-label="Documentation topics"><a href="./">Overview</a><a href="./reference.html">API reference</a><a href="./changelog.html">Changelog</a><a href="./live-scores.html" aria-current="page">Live tennis scores API</a><a href="./players-and-tournaments.html">Tennis players, tournaments and rankings API</a><a href="./tennis-odds.html">Tennis odds API — markets and price ticks</a><a href="./point-by-point-history.html">Point-by-point tennis data API</a><a href="./historical-results-archive.html">Historical tennis results API — 1968 onward</a><a href="./shot-level-rally-data.html">Shot-by-shot tennis rally and charting API</a><a href="./broadcast-graphics.html">Tennis scores for on-air graphics</a><a href="./push-feed-and-webhooks.html">Tennis WebSocket feed and webhooks</a><a href="./auth-quota-and-health.html">Tennis API authentication, quota and status</a><a href="./ai-sdk.html">Live Tennis API tools for the Vercel AI SDK</a></nav></details>
<div class="wrap">
<header>
<p class="meta">Live Tennis API &middot; docs &middot; version 1.13.77</p>
<p class="meta">Live Tennis API &middot; docs &middot; version 1.13.78</p>
<h1>Live tennis scores API</h1>
<p><strong>How do you read live tennis scores from the API?</strong> Poll <code>GET /matches?status=live</code> for the slate, then <code>GET /matches/{matchId}/score</code> for the lowest-latency read of one match. Both are on the FREE plan. Scores carry sets, games, points and the server; <code>/events</code> and <code>/points</code> give the same match as a stream of changes rather than a snapshot, so a client can catch up without re-reading state.</p>
<p class="meta">11 endpoints on this page. Base URL
Expand Down
4 changes: 2 additions & 2 deletions docs/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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": [
Expand Down
Loading
Loading