Use the market_ids parameter to specify which market types to include. The three core markets are:
Market
ID
Description
Moneyline
1
Who wins the game
Point Spread
2
Handicap / spread
Total (Over/Under)
3
Combined score
Always include offset=300 to align the date boundary with US Central Time. Without it, games starting late at night may appear under the wrong date. The offset is in minutes (300 = 5 hours).
event ├── score # Live status, clock, and current score └── markets[] # Array of market types (moneyline, spread, total, etc.) ├── market_id # Numeric market identifier ├── name # Human-readable market name └── participants[] # Teams or players in this market ├── id # Unique participant identifier ├── type # "TYPE_TEAM", "TYPE_PLAYER", or "TYPE_RESULT" ├── name # Participant name (team or player) └── lines[] # Available lines for this participant ├── value # Line value (e.g., "-3.5" for spread, empty for moneyline) └── prices{} # Map of affiliate_id → price object ├── price # American odds (e.g., -110, +150) ├── is_main_line # Whether this is the primary line └── updated_at # When this price was last updated
Here is a condensed example response for a single event:
Use score.event_status to identify live games, score.display_clock and score.game_period for the on-screen state, and score.updated_at to judge freshness. Some live score metadata, especially venue_name and venue_location, may be empty strings until the upstream feed provides them.
Use the affiliate_ids parameter to limit results to specific sportsbooks. This reduces payload size and focuses on the books you care about.
# Only DraftKings (19) and FanDuel (23)curl "https://therundown.io/api/v2/sports/4/events/2026-02-12?\key=YOUR_API_KEY&market_ids=1,2,3&affiliate_ids=19,23&offset=300"
By default, the API returns both main lines and alternate lines. Alternate lines are additional spread/total values offered by sportsbooks (e.g., -2.5, -3.0, -3.5, -4.0 for a spread market).To fetch only the primary line for each market, add main_line=true:
When main_line=true is set, each participant will have at most one line object per market, and the is_main_line field on each price will be true. This is recommended for odds screens where you only need the consensus line.
A price value of 0.0001 means the line is off the board — the sportsbook has temporarily removed it. This commonly happens when:
A key injury is being evaluated
The book is recalculating after sharp action
The market is approaching game time suspension
Never display 0.0001 to end users or use it in calculations. Show “Off Board” or “N/A” instead.
def format_price(price_value): """Format a price for display, handling sentinel values.""" if price_value == 0.0001: return "Off Board" if price_value > 0: return f"+{int(price_value)}" return str(int(price_value))# Usagefor event in data["events"]: for market in event.get("markets", []): for participant in market["participants"]: for line in participant["lines"]: for aff_id, price_obj in line["prices"].items(): display = format_price(price_obj["price"]) print(f"{participant['name']}: {display}")