Skip to content

Releases: livetennisapi/livetennisapi-js

v1.8.1 — native divergence frames

Choose a tag to compare

@bensynapse bensynapse released this 18 Aug 03:14

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

Choose a tag to compare

@bensynapse bensynapse released this 18 Aug 03:10

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

Choose a tag to compare

@bensynapse bensynapse released this 17 Aug 21:06

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

Choose a tag to compare

@bensynapse bensynapse released this 17 Aug 18:04

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

Choose a tag to compare

@bensynapse bensynapse released this 16 Aug 19:15

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'

Choose a tag to compare

@bensynapse bensynapse released this 16 Aug 06:56

Added

  • PackageKind gains '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

Choose a tag to compare

@bensynapse bensynapse released this 07 Aug 01:43

Fixes for the 1.4.0 WebSocket types, verified against the server's frame builders:

  • ScoreUpdate typed 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 inside score. The stream passes the raw frame through, so flat reads (frame.sets) compiled and returned undefined. ScoreUpdate is now {type, match_id, score?: Score}, with a regression test replaying the real nested wire shape verbatim.
  • The CLI's watch read the flat fields and printed - for every score — fixed to read frame.score.
  • BreakPoint.set / .game are 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

Choose a tag to compare

@bensynapse bensynapse released this 07 Aug 00:53

The 2026-08-07 surface, fully typed:

  • The per-match tapegetMatchTape(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 new point_winner; tiebreaks holds per-set tiebreak final scores.
  • In-play statisticsgetMatchStatistics(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 rankingslistRankings() covers both modes of /rankings: the rank-ordered listing of one system (PRO) and per-player as-of records (ULTRA). Rows carry previous_rank (ATP/WTA). A 403 names the tier by mode.
  • Shot-by-shot rally construction & charting (ULTRA, Match Charting Project corpus): listRallyMatches(), getRallyMatch(), getMatchRally() (404 not_charted is distinct from "no such match"), getChartingPlayer(), getChartingMatch().
  • Bulk packageslistHistoryPackages({ kind, year }) / getHistoryPackage(period) (PRO+; kind: 'rally' | 'rankings' and ?year= need ULTRA).
  • Push feedgetWsToken() (ULTRA) mints a token for the Centrifugo high-fan-out endpoint (match:{id} / slate:all channels).
  • 429s you can act on — daily 429s surface .resetsAt; abuse_throttled gets its own AbuseThrottled class with .retryAtEpoch (extends RateLimited). 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

Choose a tag to compare

@bensynapse bensynapse released this 03 Aug 11:41

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

Choose a tag to compare

@bensynapse bensynapse released this 02 Aug 02:17

Added

  • Break-point signals over the WebSocket feed. LiveScoreStream accepts a new signals option; pass signals: ['break_point'] and the stream also yields a BreakPoint the instant a break point arises and a BreakPointResult when it resolves, alongside the usual ScoreUpdate. Narrow on frame.type to tell frames apart.
  • BreakPoint, BreakPointResult and the StreamFrame union are exported.

Fixed

  • src/version.ts had drifted from package.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