---
title: "Consensus odds for one bout"
method: GET
path: "/v1/fights/{id}/odds"
tags: ["Odds"]
---

# Consensus odds for one bout

`GET /v1/fights/{id}/odds`

## Request

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

The UFCalendar consensus line for one bout: `consensus` (the latest point; the closing line once the bout is settled), `opening` (the first point we recorded), `closing` (settled bouts only, `completed` or `no_contest`: the last point at or before the event start; null until then), `movement` (opening → consensus: `delta_points_a` in implied-probability points on corner a, `direction` = the corner the market moved toward, `since`), `points` (stored points) and `updated_at` (when the line last moved). Every point is `a` / `b` (`american`, `decimal`, raw `implied_probability`), `favourite`, `fair_probability_a` (margin removed) and `sources` (how many sportsbooks backed it). Consensus is the mean across the sportsbooks we track, in decimal space; book identities are never exposed. `meta.checked_at` is when we last checked the market, whether or not the line moved; `meta.history` is the movement series (Pro+). A bout nobody priced answers 200 with nulls and `points: 0`; 404 is reserved for an unknown fight.

`props` carries the prop markets (`FightProps`, or null when no sportsbooks price them): `method` (per corner `a` / `b`: `ko`, `sub`, `dec` — each `yes` / `no` prices, `fair_probability` = its share of all six outcomes when all six are priced, `sources`), `total_rounds` (over/under per rounds line, ascending) and `distance` (goes the distance yes / no). Same consensus rule as the moneyline (the sportsbook mean; prediction markets excluded, a book far from the rest dropped, two sportsbooks minimum); prices are recorded until the event starts, so a settled bout carries its closing props (`closing: true`). Books post props in fight week. Information only, not betting advice.

## Path parameters

- `id` integer, required

## Response `200`

Consensus odds

- FightOddsResponse
  - `data` FightOdds, required: The consensus line of one bout: current, opening, closing (settled bouts) and the movement between opening and the current line (the close once settled), plus the prop markets.
    - `fight_id` integer, required
    - `status` 'announced' | 'confirmed' | 'cancelled' | 'completed' | 'no_contest', required: Bout lifecycle. `no_contest` is a settled bout with no winner.
    - `event` object, required
      - `id` integer, required
      - `slug` string, required
      - `title` string, required
      - `org` string, required
      - `starts_at` string, date-time, nullable, required
    - `fighter_a` object, nullable, required
      - `id` integer, required
      - `slug` string, required
      - `name` string, required
    - `fighter_b` object, nullable, required
      - `id` integer, required
      - `slug` string, required
      - `name` string, required
    - `consensus` OddsPair, required: 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.
    - `opening` OddsPair, required: 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.
    - `closing` OddsPair, required: 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.
    - `movement` OddsMovement, required
      - `delta_points_a` number, required: Implied-probability points on corner a, opening → consensus (2 places). Positive = the market moved toward a.
      - `direction` 'a' | 'b' | 'null', nullable, required: Which corner the market moved toward; null when it did not move.
      - `since` string, date-time, required: When the opening point was recorded.
    - `points` integer, required: Stored consensus points (0 = never priced). The full series is `/v1/fights/{id}/odds/history` (Pro+).
    - `updated_at` string, date-time, nullable, required: When the line last moved (= `consensus.recorded_at`).
    - `props` FightProps, required: Prop-market consensus for one bout. Prediction markets and exchanges are excluded and a book far from the rest is dropped; a market needs at least two sportsbooks. Prices are recorded until the event starts. Information only, not betting advice.
      - `method` object, required: Method of victory per corner (oriented to the bout's `fighter_a` / `fighter_b`).
        - `a` PropMethodCorner, required
          - `ko` PropLine, required: One prop market's consensus price: the mean, in decimal space, across the sportsbooks we track, converted back to American.
            - `yes` OddsLine, required: One corner's side of a consensus point.
              - …
            - `no` OddsLine, required: One corner's side of a consensus point.
              - …
            - `fair_probability` number, nullable, required: The "yes" outcome with the market margin removed, 4 places: from the yes/no pair, or for method of victory its share of all six outcomes (both corners × KO/TKO, submission, decision) when all six are priced. Null otherwise.
            - `sources` integer, required: How many sportsbooks backed this price. Book identities are never exposed.
            - `recorded_at` string, date-time, required: When this price was recorded (the last move).
          - `sub` PropLine, required: One prop market's consensus price: the mean, in decimal space, across the sportsbooks we track, converted back to American.
            - `yes` OddsLine, required: One corner's side of a consensus point.
              - …
            - `no` OddsLine, required: One corner's side of a consensus point.
              - …
            - `fair_probability` number, nullable, required: The "yes" outcome with the market margin removed, 4 places: from the yes/no pair, or for method of victory its share of all six outcomes (both corners × KO/TKO, submission, decision) when all six are priced. Null otherwise.
            - `sources` integer, required: How many sportsbooks backed this price. Book identities are never exposed.
            - `recorded_at` string, date-time, required: When this price was recorded (the last move).
          - `dec` PropLine, required: One prop market's consensus price: the mean, in decimal space, across the sportsbooks we track, converted back to American.
            - `yes` OddsLine, required: One corner's side of a consensus point.
              - …
            - `no` OddsLine, required: One corner's side of a consensus point.
              - …
            - `fair_probability` number, nullable, required: The "yes" outcome with the market margin removed, 4 places: from the yes/no pair, or for method of victory its share of all six outcomes (both corners × KO/TKO, submission, decision) when all six are priced. Null otherwise.
            - `sources` integer, required: How many sportsbooks backed this price. Book identities are never exposed.
            - `recorded_at` string, date-time, required: When this price was recorded (the last move).
        - `b` PropMethodCorner, required
          - `ko` PropLine, required: One prop market's consensus price: the mean, in decimal space, across the sportsbooks we track, converted back to American.
            - `yes` OddsLine, required: One corner's side of a consensus point.
              - …
            - `no` OddsLine, required: One corner's side of a consensus point.
              - …
            - `fair_probability` number, nullable, required: The "yes" outcome with the market margin removed, 4 places: from the yes/no pair, or for method of victory its share of all six outcomes (both corners × KO/TKO, submission, decision) when all six are priced. Null otherwise.
            - `sources` integer, required: How many sportsbooks backed this price. Book identities are never exposed.
            - `recorded_at` string, date-time, required: When this price was recorded (the last move).
          - `sub` PropLine, required: One prop market's consensus price: the mean, in decimal space, across the sportsbooks we track, converted back to American.
            - `yes` OddsLine, required: One corner's side of a consensus point.
              - …
            - `no` OddsLine, required: One corner's side of a consensus point.
              - …
            - `fair_probability` number, nullable, required: The "yes" outcome with the market margin removed, 4 places: from the yes/no pair, or for method of victory its share of all six outcomes (both corners × KO/TKO, submission, decision) when all six are priced. Null otherwise.
            - `sources` integer, required: How many sportsbooks backed this price. Book identities are never exposed.
            - `recorded_at` string, date-time, required: When this price was recorded (the last move).
          - `dec` PropLine, required: One prop market's consensus price: the mean, in decimal space, across the sportsbooks we track, converted back to American.
            - `yes` OddsLine, required: One corner's side of a consensus point.
              - …
            - `no` OddsLine, required: One corner's side of a consensus point.
              - …
            - `fair_probability` number, nullable, required: The "yes" outcome with the market margin removed, 4 places: from the yes/no pair, or for method of victory its share of all six outcomes (both corners × KO/TKO, submission, decision) when all six are priced. Null otherwise.
            - `sources` integer, required: How many sportsbooks backed this price. Book identities are never exposed.
            - `recorded_at` string, date-time, required: When this price was recorded (the last move).
      - `total_rounds` PropTotalRounds[], required: Over/under per rounds line, ascending. The line with the most `sources` is the main one.
        - `line` number, required: Rounds line (0.5, 1.5, 2.5, 3.5 or 4.5).
        - `over` 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.
        - `under` 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.
        - `fair_probability_over` number, nullable, required: Over with the market margin removed (from the over/under pair), 4 places; null without an under.
        - `sources` integer, required: How many sportsbooks backed the over.
        - `recorded_at` string, date-time, required
      - `distance` PropLine, required: One prop market's consensus price: the mean, in decimal space, across the sportsbooks we track, converted back to American.
        - `yes` 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.
        - `no` 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.
        - `fair_probability` number, nullable, required: The "yes" outcome with the market margin removed, 4 places: from the yes/no pair, or for method of victory its share of all six outcomes (both corners × KO/TKO, submission, decision) when all six are priced. Null otherwise.
        - `sources` integer, required: How many sportsbooks backed this price. Book identities are never exposed.
        - `recorded_at` string, date-time, required: When this price was recorded (the last move).
      - `closing` boolean, required: True once the bout is settled: every price is the last one before the event start.
      - `updated_at` string, date-time, nullable, required: When any market here last moved.
  - `meta` object, required
    - `note` string, required: Always present: consensus across the sportsbooks we track, information only, not betting advice.
    - `checked_at` string, date-time, nullable, required: When we last checked the market (the last successful odds refresh), whether or not the line moved.
    - `history` string, required: Path of the movement series (Pro+).
    - `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.
- `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)
