---
title: "Card-change log"
method: GET
path: "/v1/events/{idOrSlug}/changes"
tags: ["Events"]
---

# Card-change log

`GET /v1/events/{idOrSlug}/changes`

## Request

- Base URL: `https://api.ufcalendar.com`
- URL: `https://api.ufcalendar.com/v1/events/{idOrSlug}/changes`
- Auth: HTTP bearer

The diff log behind "card updated": fight added/removed, opponent swapped, card order or date moved, or a fighter profile merged (`fighter-merged`: two of our fighter ids turned out to be one athlete, so a live bout now carries the surviving id — same humans, new ids). Each entry has `id`, `kind`, `before`, `after`, `observed_at`, newest first. No-op rows and flaps (a bout scratched and reinstated within 48 h, a start time moved and moved back within 72 h) are filtered out — the same rule the website and the `card.changed` webhook apply. `/v1/changes` is the same log across every event.

## Path parameters

- `idOrSlug` string, required

## Response `200`

Change entries

- EventChangesResponse: Newest first, at most 200 entries.
  - `data` EventChange[], required
    - `id` integer, required: Change-log row id (the cursor unit on `/v1/changes`).
    - `kind` 'fight-added' | 'fight-cancelled' | 'fight-reinstated' | 'opponent-changed' | 'time-changed' | 'venue-changed' | 'fighter-merged', required: What a card-change entry describes.
    - `before` object, nullable, required: Payload before the change; shape depends on `kind`. Null for `fight-added`.
    - `after` object, nullable, required: Payload after the change; shape depends on `kind`. Null for `fight-cancelled`.
    - `observed_at` string, date-time, required
  - `meta` EmptyMeta, required: `meta` is always present; `{}` when the endpoint has nothing to add.
    - `ignored_params` string[]: Present only when the request carried query parameters this endpoint does not take — they were ignored. Same list as the `X-UFCalendar-Ignored-Params` header. Sorted, unique.

## Other responses

- `304`: Not Modified — `If-None-Match` matched the current weak `ETag`. Empty body.
- `308`: The slug is a retired alias (the event or fighter was renamed). Follow `Location` to the canonical URL; the numeric-id form never redirects.
- `401`: Missing/invalid API key (`unauthorized`).
- `403`: No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api.
- `404`: Not found (`not_found`; staged-org data 404s until the org is promoted).
- `429`: Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`.
- `500`: Something broke on our side (`internal_error`). It has been logged under the `request_id`.

---

[API](https://skmtc.dev/ufcalendar/apis/ufcalendar-fight-api.md) · [All operations](https://skmtc.dev/ufcalendar/apis/ufcalendar-fight-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ufcalendar/apis/ufcalendar-fight-api/revisions/9623cc8fb70b?raw)
