---
title: "Event with full card"
method: GET
path: "/v1/events/{idOrSlug}"
tags: ["Events"]
---

# Event with full card

`GET /v1/events/{idOrSlug}`

## Request

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

Full fight card (both corners, results when completed), venue and event-scoped broadcast rows. Every event and card entry carries `sport` (e.g. `mma`, `bare-knuckle-boxing`). Renamed events 308-redirect from stale slugs.

**Card order is read over non-cancelled bouts only.** `ordering` runs headliner-first (1 = main event), and `ordering`, `card_section` and `is_main` describe the card as it stands — except on a `status: "cancelled"` entry, which keeps the slot and section it had when it was scratched. The promotion re-lays the card around it afterwards, so a cancelled entry can share an `ordering` with a live bout or sit in a section that no longer matches its neighbours. Filter `status != "cancelled"` before deriving running order or sections.

`include=eta` adds `eta` (ISO timestamp or `null`) to every card entry: the estimated start of that bout, by the same rule the website's event page uses. These are estimates, not a schedule — each card section anchors on its declared start, and every completed bout re-anchors the rest of its section on its real finish. Cancelled bouts get `null`.

`include=odds` adds `odds` to every card entry: the current UFCalendar consensus line (`a`, `b`, `favourite`, `fair_probability_a`, `sources`, `recorded_at`), or `null` when the bout is unpriced. Information only, not betting advice; the opening/closing lines and movement are on `/v1/events/{idOrSlug}/odds`.

## Path parameters

- `idOrSlug` string, required

## Query parameters

- `include` 'eta' | 'odds'

## Response `200`

Event detail

- EventDetailResponse
  - `data` EventDetail, required
    - `id` integer, required
    - `slug` string, required: Frozen once published; renamed events keep an alias that 308-redirects.
    - `title` string, required
    - `short_title` string, nullable, required: Short display title (`DWCS 93`); null when the title is already short.
    - `numbering` string, nullable, required: `UFC 320`, `DWCS 93`, … null for un-numbered cards.
    - `org` string, required: Org slug (`ufc`, `pfl`, `oktagon`, `bkfc`, `rizin`).
    - `sport` string, required: Sport slug — `mma`, `bare-knuckle-boxing`. Open: a new sport lands as a new value.
    - `starts_at` string, date-time, required: First bell (UTC).
    - `main_card_at` string, date-time, nullable, required
    - `prelims_at` string, date-time, nullable, required
    - `early_prelims_at` string, date-time, nullable, required
    - `tz` string, nullable, required: IANA zone of the venue.
    - `status` 'announced' | 'scheduled' | 'live' | 'completed' | 'cancelled' | 'postponed', required: Event lifecycle. `postponed` is stored and filterable.
    - `is_ppv` boolean, required
    - `is_title_card` boolean, required
    - `venue` EventVenue, required: Venue as embedded on an event — the same shape as `GET /v1/venues/{id}`.
      - `id` integer, required
      - `slug` string, nullable, required
      - `name` string, required
      - `city` string, nullable, required
      - `region` string, nullable, required: State / province / prefecture.
      - `country` string, nullable, required
      - `country_code` string, nullable, required: ISO-2 derived from `country`.
      - `tz` string, nullable, required
      - `capacity` integer, nullable, required
      - `lat` number, nullable, required
      - `lng` number, nullable, required
    - `card` Fight[], required: Every bout, `ordering` ascending (headliner first). Cancelled bouts stay on the card with `status: cancelled`.
      - `id` integer, required
      - `ordering` integer, nullable, required: 1 = the headliner; ascends down the card.
      - `card_section` 'main' | 'prelims' | 'early_prelims', required: Which part of the card the bout sits on.
      - `sport` string, required: Sport slug — `mma`, `bare-knuckle-boxing`. Open: a new sport lands as a new value.
      - `weight_class` string, nullable, required: Source spelling (`Featherweight`, `Catchweight 150 lbs`).
      - `division_slug` string, nullable, required: Slug twin in the rankings vocabulary (`womens-strawweight`, `catchweight`); null when the text matches no division.
      - `is_title` boolean, required
      - `is_main` boolean, required
      - `scheduled_rounds` integer, nullable, required
      - `status` 'announced' | 'confirmed' | 'cancelled' | 'completed' | 'no_contest', required: Bout lifecycle. `no_contest` is a settled bout with no winner.
      - `fighter_a` FighterRef, required: The one fighter-reference shape every card, fight and search row carries.
        - `id` integer, required
        - `slug` string, required
        - `name` string, required
        - `nickname` string, nullable, required
        - `nationality` string, nullable, required: Country NAME as the source spells it (e.g. `United States`).
        - `country_code` string, nullable, required: ISO 3166-1 alpha-2 derived from `nationality`; null when the name is unknown to our table.
      - `fighter_b` FighterRef, required: The one fighter-reference shape every card, fight and search row carries.
        - `id` integer, required
        - `slug` string, required
        - `name` string, required
        - `nickname` string, nullable, required
        - `nationality` string, nullable, required: Country NAME as the source spells it (e.g. `United States`).
        - `country_code` string, nullable, required: ISO 3166-1 alpha-2 derived from `nationality`; null when the name is unknown to our table.
      - `result` FightResult, required
        - `winner_fighter_id` integer, nullable, required: Null on a draw or no-contest.
        - `method` string, nullable, required: Source spelling (`Decision - Split`, `KO/TKO`, `Submission (Rear-Naked Choke)`).
        - `method_normalized` 'ko_tko' | 'submission' | 'technical_submission' | 'decision_unanimous' | 'decision_split' | 'decision_majority' | 'decision' | 'draw' | 'no_contest' | 'dq' | 'other', required: Closed vocabulary over every source spelling of a result method (`normalize.ts`). `other` = a non-empty method nothing matched.
        - `finish_detail` string, nullable, required: The parenthesised / trailing detail of `method`, cleaned (`Rear-Naked Choke`, `Doctor's Stoppage`).
        - `round` integer, nullable, required
        - `time` string, nullable, required: `m:ss` into the round.
        - `time_seconds` integer, nullable, required: `time` in seconds.
        - `details` string, nullable, required: Free text from the source — judges' totals on a decision, the strike on a KO.
      - `referee` string, nullable, required
      - `bonus` string, nullable, required: Post-fight bonus label when awarded (`Performance of the Night`, `Fight of the Night`).
      - `eta` string, date-time, nullable: Estimated start of this bout (`?include=eta` on the event route only). An estimate, not a schedule; null for a cancelled bout.
      - `odds` OddsPair: One UFCalendar consensus point: the mean, in decimal space, across the sportsbooks we track, converted back to American. Information only, not betting advice.
        - `a` OddsLine, required: One corner's side of a consensus point.
          - `american` integer, required: American moneyline (`-152`, `+131`).
          - `decimal` number, required: Decimal odds, 3 places.
          - `implied_probability` number, required: Raw implied probability (market margin included), 4 places.
        - `b` OddsLine, required: One corner's side of a consensus point.
          - `american` integer, required: American moneyline (`-152`, `+131`).
          - `decimal` number, required: Decimal odds, 3 places.
          - `implied_probability` number, required: Raw implied probability (market margin included), 4 places.
        - `favourite` 'a' | 'b' | 'null', nullable, required: The corner the market prices as more likely; null on an even pair.
        - `fair_probability_a` number, required: Probability of corner a with the market margin removed (pA / (pA + pB)), 4 places.
        - `sources` integer, required: How many sportsbooks backed this consensus point. Book identities are never exposed.
        - `recorded_at` string, date-time, required: When this consensus point was recorded.
    - `broadcasts` EventBroadcast[], required
      - `region` string, required: ISO-2 country code or `WORLD`.
      - `provider` string, required
      - `kind` 'ppv' | 'sub' | 'free' | 'tv' | 'unknown', required: How the provider carries it: pay-per-view, subscription, free-to-air, linear TV, unknown.
      - `url` string, nullable, 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.
- `400`: Invalid input (`invalid_include`).
- `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)
