---
title: "Published data-quality incidents (BASIC)"
method: GET
path: "/history/incidents"
---

# Published data-quality incidents (BASIC)

`GET /history/incidents`

## Request

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

Every data-quality incident we have published, oldest window first. This is the register to reconcile against when a published value changed after you read it: each record states the window it applies to, the rule before and after, what the defect was, which surfaces it touched, how to tell an affected row from a clean one, and whether corrections and a per-match list are available. Nothing here is inferred at read time. The register is part of a release, so a record appears only when we have decided what it says, and it does not change between releases.

## Response `200`

The incident register.

- object
  - `data` Incident[]
    - `id` string: Stable slug, e.g. `deciding-set-level-rule-2026-08-18`.
    - `kind` string: The incident's family. Current values are `pricing_rule`, `version_stamp`, `field_orientation` and `field_repair`. The live list is in `meta.kinds`.
    - `title` string
    - `window_utc` object: When the incident applies. Every instant is UTC, and `basis` says what the window was read from.
      - `start` string, date-time
      - `end` string, date-time, nullable
      - `basis` string
    - `rule_before` string
    - `rule_after` string
    - `defect` string: What was wrong, with the measurement behind it.
    - `affected_surfaces` string[]: The endpoints and fields the incident reached.
    - `how_to_tell` string: How to separate an affected row from a clean one, in your own copy of the data.
    - `corrections` object: Whether the published values were restated. When `available` is false, `detail` says what to do instead.
      - `available` boolean
      - `detail` string
    - `matches` object: Whether a per-match list can be derived exactly. `note` names the rows that cannot, and `url` is the export when `derivable` is true.
      - `derivable` boolean
      - `note` string
      - `url` string
  - `meta` object
    - `count` integer
    - `kinds` string[]
    - `generated_at` string, date-time

## Other responses

- `401`: Missing, unknown, or disabled credentials
- `403`: Your tier doesn't unlock this endpoint
- `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)
