---
title: "One bout"
method: GET
path: "/v1/fights/{id}"
tags: ["Fights"]
---

# One bout

`GET /v1/fights/{id}`

## Request

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

Bout with corners (`FighterRef` with `country_code`), `sport` (bout override, else the org sport), `weight_class` + `division_slug`, result (raw `method` plus `method_normalized` / `finish_detail` / `round` / `time` / `time_seconds` / referee) and bonus flags, plus a compact `event`. `include=odds` adds `odds`: the current UFCalendar consensus line (`OddsPair`), or `null` when the bout is unpriced — information only, not betting advice; opening, closing and movement are on `/v1/fights/{id}/odds`.

## Path parameters

- `id` integer, required

## Query parameters

- `include` 'odds'

## Response `200`

Fight

- FightResponse
  - `data` FightDetail, required: A bout with its event — `/v1/fights/{id}`, `/v1/fights/search` rows and the division route's `upcoming` / `recent` lists.
    - `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`).
    - `event` object, required
      - `id` integer, required
      - `slug` string, required
      - `title` string, required
      - `org` string, required
      - `starts_at` string, date-time, nullable, required
    - `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.
  - `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.
- `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)
