Releases: livetennisapi/livetennisapi-js
Release list
v1.8.1 — native divergence frames
Fix: the native LiveScoreStream silently dropped divergence frames (its dispatch had no case for the type, though the server accepts signals: ['divergence']). They now yield as the typed Divergence added in 1.8.0, and StreamFrame includes Divergence in its union.
v1.8.0 — signals on the push feed
PushStream({signals: true}): break_point / break_point_result / divergence frames now ride the push feed's signal:* channels, subscribed from the /ws-token mint's advertised vocabulary and delivered through the existing async-iterator surface. New Divergence type exported. See CHANGELOG.md.
v1.7.0 — the draw split + the coverage table
Draw type + three-valued Match.draw ('singles' | 'doubles' | null — null is unknown or a team tie, never a guess). draw param on listMatches/listCompletedMatches/listTournaments/listFixtures. New getHistoryCoverage() returns the measured completeness rollup (per tour × draw, as-of dated); 503 coverage_unavailable surfaced as the typed error. Tape blocks gain starts_at_love/computed_at where served. See CHANGELOG.
v1.6.0 — the per-point stream
One record per committed point on every SDK surface, keyed by the per-match gapless seq. REST: getMatchPoints / iterateMatchPoints, covers_from_start on the page. Native streamer: point frames now yielded as PointUpdate instead of being dropped. Push streamer: points: true subscribes the point channels from the mint's vocabulary, pointsResume (default on) REST-catches-up every tracked match on each (re)connect, dedups by seq, fills mid-stream gaps before the trigger frame, and bounds the cursor set (404-prune + 2h idle expiry). RankingSystem gains 'elo' + companion params on listRankings. See CHANGELOG for full detail.
v1.5.0 — PushStream
Built-in push-feed streamer (Centrifugo protocol): PushStream with async-iterator ergonomics mirroring LiveScoreStream, recommended for continuous/production streaming (no shared connection ceiling). Auth-class close codes are fatal (no reconnect loops), dead-connection watchdog on both streamers, strict match-id validation. See CHANGELOG.
v1.4.2 — PackageKind accepts 'archive'
Added
PackageKindgains'archive'— the 1968–2022 results archive as yearly bulk packages (bare-year period, same entitlement as the tape packages). The type previously rejected a kind the API accepts.
Changed
- Dev-only: esbuild 0.28.2 (clears a low-severity advisory).
v1.4.1 — the WS score frame is nested; the types now say so
Fixes for the 1.4.0 WebSocket types, verified against the server's frame builders:
ScoreUpdatetyped a frame that never existed. The wire nests the payload:{"type": "score", "match_id": N, "score": {sets, games, points, server, is_tiebreak, timestamp, win_probability_p1, danger}}— model fields insidescore. The stream passes the raw frame through, so flat reads (frame.sets) compiled and returnedundefined.ScoreUpdateis now{type, match_id, score?: Score}, with a regression test replaying the real nested wire shape verbatim.- The CLI's
watchread the flat fields and printed-for every score — fixed to readframe.score. BreakPoint.set/.gameare wire strings ('1-1','3-4'), not numbers — retyped.- The subscribe frame drops the stray
action: 'subscribe'key; it is now exactly the documented{topics, signals?}.
No behavioural change for consumers already reading frame.score; flat-field readers get a compile error pointing at the fix. Full details in CHANGELOG.md.
v1.4.0 — statistics, tape, rally & charting, rankings, packages, push feed
The 2026-08-07 surface, fully typed:
- The per-match tape —
getMatchTape(matchId, { sequence })(BASIC, or any History plan): point-by-point score sequence with per-point model probabilities, working on LIVE matches too.sequence: 'clean'carries the newpoint_winner;tiebreaksholds per-set tiebreak final scores. - In-play statistics —
getMatchStatistics(matchId)(ULTRA): aces, double faults, serve split, hold/break %, break points — two deliberately unmerged families (derived vs measured), each with its own freshness. - Point-in-time rankings —
listRankings()covers both modes of/rankings: the rank-ordered listing of one system (PRO) and per-player as-of records (ULTRA). Rows carryprevious_rank(ATP/WTA). A 403 names the tier by mode. - Shot-by-shot rally construction & charting (ULTRA, Match Charting Project corpus):
listRallyMatches(),getRallyMatch(),getMatchRally()(404not_chartedis distinct from "no such match"),getChartingPlayer(),getChartingMatch(). - Bulk packages —
listHistoryPackages({ kind, year })/getHistoryPackage(period)(PRO+;kind: 'rally' | 'rankings'and?year=need ULTRA). - Push feed —
getWsToken()(ULTRA) mints a token for the Centrifugo high-fan-out endpoint (match:{id}/slate:allchannels). - 429s you can act on — daily 429s surface
.resetsAt;abuse_throttledgets its ownAbuseThrottledclass with.retryAtEpoch(extendsRateLimited). Neither is retried any more; per-minute 429s and 5xx retry exactly as before. - README: current quota grid (FREE 100/day · BASIC 1,000 · PRO 10,000 · ULTRA 500,000), tier table for the whole surface, push-feed section — for ATP, WTA, Challenger, ITF and juniors.
Full details in CHANGELOG.md.
v1.3.0 — results archive (1968–2022), head-to-head, tournaments
Seven new methods with full typings: tournaments (FREE), the results archive 1968–2022 (matches, player bios, career aggregates) and head-to-head (BASIC, or any History plan). New match filters (tour, player, country, from/to, coverage); repeatable params now emitted correctly (?player=1&player=2). Match/Fixture field additions. Zero runtime dependencies, as always. See CHANGELOG.md.
v1.2.0 — break-point signals over the WebSocket feed
Added
- Break-point signals over the WebSocket feed.
LiveScoreStreamaccepts a newsignalsoption; passsignals: ['break_point']and the stream also yields aBreakPointthe instant a break point arises and aBreakPointResultwhen it resolves, alongside the usualScoreUpdate. Narrow onframe.typeto tell frames apart. BreakPoint,BreakPointResultand theStreamFrameunion are exported.
Fixed
src/version.tshad drifted frompackage.json; it is now generated from it.
Notes
- Fully backwards compatible. With no
signals(the default) the stream behaves exactly as 1.1.0 — score frames only. - The break-point feed is ULTRA-only, like the rest of the WebSocket surface.
Full changelog: CHANGELOG.md