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.