---
title: "Get current betting odds for an event"
method: GET
path: "/v1/events/{event_id}/odds"
tags: ["events"]
---

# Get current betting odds for an event

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

## Request

- Base URL: `https://lumify.ai`
- URL: `https://lumify.ai/v1/events/{event_id}/odds`
- Auth: HTTP bearer

## Path parameters

- `event_id` integer, required: Lumify event ID

## Query parameters

- `bookmaker` string, nullable: Bookmaker filter. Default: pinnacle. Accepted values: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig, bovada, all, or a comma-separated list (e.g. 'fanduel,betmgm'). One book or all = 1 credit.
- `include_alts` boolean: Include alternate spread/total rungs (is_main=false). Default is mains only.

## Response `200`

Current moneyline, spread, and total lines for the requested bookmaker(s), including in-play quotes while the event is underway. Default is Pinnacle only. Use bookmaker=all or a comma-separated list (e.g. bookmaker=fanduel,draftkings) to fetch multiple books. One book or all is 1 credit. Markets are grouped by type (h2h → moneyline, spreads → spread, totals → totals). Default view is main lines (is_main=true). Pass include_alts=true for alternate spread/total rungs. In-play responses omit books that have not quoted since kickoff. Final events include result (won/lost/push/void) graded from the pre-kickoff close (lumify_closing_odds), not the last in-play line. If no odds have been ingested for this event yet, returns 200 with available=false and is NOT charged (X-Credits-Used: 0). When bookmaker is omitted (default) and Pinnacle hasn't posted a line yet — common for the first/last games of a preseason slate — falls back to the best-covered other book instead of reporting no odds; the response then includes requested_bookmaker='pinnacle' and fallback_bookmaker=<book actually returned>. An explicit bookmaker=pinnacle request never falls back.

- OddsResponse
  - `event_id` integer, nullable
  - `available` boolean
  - `bookmakers` object[]: Per-bookmaker markets. Each outcome has outcome, price, point, is_main (true for the main line). In-play events keep updating and omit books that have not quoted since kickoff. Final events add result (won/lost/push/void) and close (the pre-kickoff graded point); tennis spreads/totals are the one gap — game-count isn't tracked, so only tennis moneyline grades. MLB, tennis, and soccer (MLS + big-five) mains also mirror fair_price and consensus from published assessments when the line still matches the board. Default /odds view is mains only; include_alts=true returns alternate spread/total rungs.
  - `last_updated` string, nullable
  - `requested_bookmaker` string, nullable: Present only when the default (no bookmaker query param) request fell back to a different book because Pinnacle hasn't posted a line for this event yet — always 'pinnacle' when present. An explicit bookmaker=pinnacle request never falls back; it returns available=false instead.
  - `fallback_bookmaker` string, nullable: The book actually returned when requested_bookmaker is present — the book with the most odds rows for this event, excluding Pinnacle.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/lumify/apis/lumify-sports-intelligence-api.md) · [All operations](https://skmtc.dev/lumify/apis/lumify-sports-intelligence-api/llms.txt) · [OpenAPI document](https://skmtc.dev/lumify/apis/lumify-sports-intelligence-api/revisions/f91ea41a2606?raw)
