---
title: "One archive result, with serve statistics where recorded (BASIC)"
method: GET
path: "/history/archive/matches/{archiveId}"
---

# One archive result, with serve statistics where recorded (BASIC)

`GET /history/archive/matches/{archiveId}`

## Request

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

Same entitlement as the archive listing. `stats` is null for the (mostly pre-1991) rows the source never recorded statistics for — never synthesised. A result played 2013–2022 may also have a reconstructed point-by-point tape at `/history/archive/matches/{archiveId}/tape`; the RESULT stays on BASIC either way.

## Path parameters

- `archiveId` integer, required

## Response `200`

The archive record, `stats` included where the era recorded them

- ArchiveMatch: One result of the results archive (1968–2022). Winner/loser-shaped — results data is recorded that way at the source, so the winner is a field, never an inference. Its own id space; `source_id` is the stable corpus key. A result played 2013–2022 may additionally carry a reconstructed point-by-point tape (`ArchiveTape`); results from 1968–2012 have none and never will.
  - `id` integer
  - `source_id` string
  - `tour` 'atp' | 'wta'
  - `level` string, nullable: Source tier code (G/M/A/F/D/C/O, or a futures category code as published).
  - `tournament` string, nullable
  - `surface` string, nullable
  - `draw_size` integer, nullable
  - `event_date` string, date, nullable: Tournament START date — per-match dates do not exist in this era's records, and we do not invent them.
  - `round` string, nullable
  - `best_of` integer, nullable
  - `minutes` integer, nullable
  - `winner` ArchivePlayer: One participant of an archive result, as the corpus records them.
    - `name` string, nullable
    - `hand` string, nullable
    - `country` string, nullable: 3-letter code, same vocabulary as `player.country`.
    - `rank` integer, nullable: The player's rank AT THE TIME of the match, as published.
    - `seed` integer, nullable
    - `player_id` integer, nullable: The corpus person id — joins `/history/archive/players` within the same tour. NOT a roster player id.
    - `height_cm` integer, nullable
    - `age` number, nullable: Age at the time of the match, as the corpus records it.
    - `entry` string, nullable: Draw entry where recorded (WC, Q, LL, PR, SE, ...) — null for direct acceptances.
  - `loser` ArchivePlayer: One participant of an archive result, as the corpus records them.
    - `name` string, nullable
    - `hand` string, nullable
    - `country` string, nullable: 3-letter code, same vocabulary as `player.country`.
    - `rank` integer, nullable: The player's rank AT THE TIME of the match, as published.
    - `seed` integer, nullable
    - `player_id` integer, nullable: The corpus person id — joins `/history/archive/players` within the same tour. NOT a roster player id.
    - `height_cm` integer, nullable
    - `age` number, nullable: Age at the time of the match, as the corpus records it.
    - `entry` string, nullable: Draw entry where recorded (WC, Q, LL, PR, SE, ...) — null for direct acceptances.
  - `score` string, nullable: The final score as published, e.g. "6-4 7-6(5)", "6-3 RET", "W/O".
  - `outcome` 'completed' | 'retired' | 'walkover' | 'default' | 'abandoned' | 'null', nullable: Parsed from the score's own vocabulary; null when unparseable — never guessed.
  - `stats` object, nullable: Detail endpoint only. {"winner":{...}, "loser":{...}} with aces, double_faults, serve_points, first_in, first_won, second_won, serve_games, bp_saved, bp_faced where the source recorded them; null otherwise (most rows before 1991) — never synthesised.

## Other responses

- `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)
