---
title: "Career aggregates over the results archive, 1968–2022 (BASIC)"
method: GET
path: "/history/archive/career"
---

# Career aggregates over the results archive, 1968–2022 (BASIC)

`GET /history/archive/career`

## Request

- Base URL: `https://api.livetennisapi.com/api/public/v1`
- URL: `https://api.livetennisapi.com/api/public/v1/history/archive/career`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

One player's whole archive career in one response: W-L record (overall, by surface, by level, by year), titles, and the summed serve-stat block with derived ratios. Everything is a sum or a ratio of sums over rows you can fetch individually from `/history/archive/matches` — nothing is modelled. `serve.matches_with_stats` states the coverage honestly: the corpus records per-match serve statistics from 1991 only, so a 1970s career has a full W-L record and an empty serve block. Ambiguous name fragments are refused with candidates, and an exact name selects its person even where a longer name contains it (same rule as `/h2h`); an unknown name is a 404. Requires BASIC, or any Historical Data API plan.

## Query parameters

- `name` string, required

## Response `200`

The career aggregate body

- ArchiveCareer: Career aggregates over the results archive (1968–2022) — sums and ratios of sums only, nothing modelled. Serve stats exist in the corpus from 1991; `serve.matches_with_stats` states the coverage.
  - `player` object
    - `name` string
  - `span` object
    - `first` string, nullable
    - `last` string, nullable
  - `record` object
    - `wins` integer
    - `losses` integer
    - `titles` integer: Finals won (excluding abandoned finals).
    - `by_surface` object
    - `by_level` object
  - `by_year` object[]
    - `year` integer
    - `wins` integer
    - `losses` integer
  - `serve` object: Summed serve statistics + derived ratios; null ratios where the denominator is zero.
    - `matches_with_stats` integer
    - `aces` integer
    - `double_faults` integer
    - `serve_points` integer
    - `first_in` integer
    - `first_won` integer
    - `second_won` integer
    - `serve_games` integer
    - `bp_saved` integer
    - `bp_faced` integer
    - `first_in_pct` number, nullable
    - `first_won_pct` number, nullable
    - `second_won_pct` number, nullable
    - `bp_saved_pct` number, nullable
    - `aces_per_match` number, nullable

## Other responses

- `400`: Bad query parameter
- `401`: Missing, unknown, or disabled credentials
- `403`: Your tier doesn't unlock this endpoint
- `404`: No such resource, or no data yet
- `429`: Rate limit exceeded (Retry-After header present). Three body shapes, told apart by `error` and `scope`: the per-MINUTE limit (`rate_limited`, with `upgrade_url`, `tier` and `price` naming the next tier up); the per-DAY quota (`rate_limited` with `scope: "day"`, `limit_per_day`, and `resets_at` — the absolute ISO instant the daily window resets); and `abuse_throttled` with `retry_at_epoch` — a 24-hour block applied to clients that keep hammering far past their cap, which a well-behaved retry loop never sees. Fix the loop rather than retrying through it.

---

[API](https://skmtc.dev/livetennisapi/apis/live-tennis-api.md) · [All operations](https://skmtc.dev/livetennisapi/apis/live-tennis-api/llms.txt) · [OpenAPI document](https://skmtc.dev/livetennisapi/apis/live-tennis-api/revisions/7881947e8e43?raw)
