---
title: "Consensus odds for one card"
method: GET
path: "/v1/events/{idOrSlug}/odds"
tags: ["Odds"]
---

# Consensus odds for one card

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

## Request

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

The UFCalendar consensus line for every non-cancelled bout on one card, in card order: `fights[]`, each with `fight_id`, `status`, both corners (`fighter_a`, `fighter_b`: `id`, `slug`, `name`), `consensus` (the latest point; the closing line once the bout is settled), `opening` (the first point we recorded), `closing` (settled bouts only: the last point at or before the event start), `movement` (opening → consensus in implied-probability points on corner a, with the `direction` the market moved), `points` and `updated_at`. Every point is `a` / `b` (`american`, `decimal`, raw `implied_probability`), `favourite`, `fair_probability_a` (margin removed), `sources` (how many sportsbooks backed it) and `recorded_at`. A bout nobody has priced stays on the list with nulls and `points: 0`; `meta.priced` / `meta.unpriced` count both. `meta.checked_at` is when we last checked the market, whether or not the line moved. Consensus is the mean across the sportsbooks we track, refreshed every 30 minutes in the 48 hours before a card and every 2 hours otherwise; book identities are never exposed. Each bout also carries `props` — method of victory per corner, total rounds over/under per line and goes the distance (`FightProps`, or null), described on `/v1/fights/{id}/odds`. Information only, not betting advice. An unknown event 404s.

## Path parameters

- `idOrSlug` string, required

## Response `200`

Consensus odds for the card

- EventOddsResponse
  - `data` EventOdds, required
    - `event` StorylineEvent, required
      - `id` integer, required
      - `slug` string, required
      - `title` string, required
      - `org` string, required
      - `starts_at` string, date-time, required
      - `status` 'announced' | 'scheduled' | 'live' | 'completed' | 'cancelled' | 'postponed', required: Event lifecycle. `postponed` is stored and filterable.
    - `fights` EventOddsRow[], required: Non-cancelled bouts in card order.
      - `fight_id` integer, required
      - `status` 'announced' | 'confirmed' | 'cancelled' | 'completed' | 'no_contest', required: Bout lifecycle. `no_contest` is a settled bout with no winner.
      - `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.
              - …
            - `sub` PropLine, required: One prop market's consensus price: the mean, in decimal space, across the sportsbooks we track, converted back to American.
              - …
            - `dec` PropLine, required: One prop market's consensus price: the mean, in decimal space, across the sportsbooks we track, converted back to American.
              - …
          - `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.
              - …
            - `sub` PropLine, required: One prop market's consensus price: the mean, in decimal space, across the sportsbooks we track, converted back to American.
              - …
            - `dec` PropLine, required: One prop market's consensus price: the mean, in decimal space, across the sportsbooks we track, converted back to American.
              - …
        - `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.
    - `priced` integer, required: Bouts on the list with a consensus line.
    - `unpriced` integer, required: Bouts on the list without one.
    - `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)
