Skip to content

v1.4.0 — statistics, tape, rally & charting, rankings, packages, push feed

Choose a tag to compare

@bensynapse bensynapse released this 07 Aug 00:53
· 21 commits to main since this release

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.