BestFightOdds MMA Odds Scraper avatar

BestFightOdds MMA Odds Scraper

Pricing

from $1.40 / 1,000 results

Go to Apify Store
BestFightOdds MMA Odds Scraper

BestFightOdds MMA Odds Scraper

UFC and MMA betting odds from BestFightOdds: every sportsbook's moneyline and props, consensus opening and closing lines back to 2008, and full timestamped line movement.

Pricing

from $1.40 / 1,000 results

Rating

0.0

(0)

Developer

Artsiom Kunitsyn

Artsiom Kunitsyn

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Scrapes UFC and MMA betting odds from BestFightOdds: every sportsbook's moneyline and prop prices, the consensus opening and closing line for fights back to 2008, and full timestamped line movement, for the UFC, PFL, ONE, Bellator, Rizin, LFA, Cage Warriors, KSW, Oktagon, BKFC and dozens of other promotions. No login required.

Contents

🔑 Key features

  • Every book side by side. FanDuel, DraftKings, BetMGM, Caesars, BetRivers, BetWay, Unibet, plus the Kalshi and Polymarket prediction markets, with the best price and the book offering it.
  • Opening and closing lines. Each row carries the consensus open and close, when the line opened and last moved, its range and how many times it moved: closing-line value and steam analysis without a second source.
  • Line movement, point by point. lineHistory returns every recorded price change, per sportsbook and for the consensus, with a UTC timestamp.
  • Props. Turn on includeProps for method of victory, rounds over/under, goes the distance, round betting, significant strikes and more, often 50+ markets per fight.
  • History back to 2008. Every event since 2007 is listed. Per-book prices exist for recent years (about 2021 on); for older fights the consensus line is still there.
  • Fighter odds histories. fighters returns each fight a fighter had odds for: opening price, closing range and movement for both sides.
  • Incremental runs. Schedule odds and get only the lines that moved since the last run.
  • maxItems defaults to 50: a fast, cheap preview. Clear it (null) for everything in your selection.

📋 Output

The Output tab lists every field.

odds: one row per side of a market per fight:

{
"event": "UFC 334",
"event_date": "2026-11-15",
"promotion": "ufc",
"matchup_id": 43676,
"fighter_1": "Ciryl Gane",
"fighter_2": "Josh Hokit",
"market_type": "moneyline",
"market": "Moneyline",
"selection": "Ciryl Gane",
"odds": { "FanDuel": -265, "Caesars": -275, "BetRivers": -275, "BetWay": -275, "Unibet": -275 },
"best_odds": -265,
"best_odds_decimal": 1.3774,
"best_book": "FanDuel",
"consensus_open": -150,
"consensus_close": -271,
"consensus_opened_at": "2026-06-15T13:20:03Z",
"consensus_last_change_at": "2026-10-22T09:29:20Z",
"consensus_changes": 36,
"change_type": "new"
}

Prop rows have market_type: "prop", the market as the site names it ("Over 2½ rounds",

"Gane wins by TKO/KO"
) and the selection for this side ("Under 2½ rounds", "Any other result").

lineHistory: one row per recorded price: event, fight, market, selection, book (a sportsbook or Consensus), timestamp, odds (American) and odds_decimal.

fighters: one row per fighter with fights: event, date, open, close_low, close_high, movement_pct, and the opponent's open and closing range.

🔧 Input

FieldTypeDefaultDescription
entityTypestringoddsodds, lineHistory or fighters.
promotionsarray["ufc"]Promotions to scrape. Empty = every promotion.
startUrlsarray—Specific event or fighter pages. Replaces the promotion and date selection.
dateFrom / dateTostring—Only events in this window (YYYY-MM-DD).
includePropsbooleanfalseAdd every prop market next to the moneyline.
consensusstringmoneylineodds: add the consensus opening and closing line to moneyline rows, all rows (props too: about 1 to 2 minutes per event) or none.
historyBooksstringalllineHistory: all, consensus or books.
maxItemsinteger50Stop after this many rows. null = everything selected.
modestringautoauto / full / incremental, odds only.
concurrencyinteger6Requests in flight (max 12).
impersonatestringchromeBrowser TLS fingerprint. Change only if requests are blocked.
proxyConfigurationobjectno proxyApify Proxy settings. Not needed in testing.

📥 Input examples

Default preview (upcoming UFC moneylines):

{}

Every UFC moneyline and prop for 2025 (moneylines with opening and closing lines):

{ "promotions": ["ufc"], "dateFrom": "2025-01-01", "dateTo": "2025-12-31", "includeProps": true, "maxItems": null }

Line movement of one card, every sportsbook:

{ "entityType": "lineHistory", "startUrls": ["https://www.bestfightodds.com/events/ufc-edmonton-4403"], "maxItems": null }

Consensus closing lines for every PFL and ONE event since 2015:

{ "promotions": ["pfl", "one"], "dateFrom": "2015-01-01", "maxItems": null }

A fighter's odds history:

{ "entityType": "fighters", "startUrls": ["https://www.bestfightodds.com/fighters/jon-jones-819"] }

🔁 Incremental mode

odds only, and only for a run with maxItems cleared (null): a capped run is a preview and always returns rows. After the first complete run, a scheduled run returns only lines that are new or whose price moved (change_type new or changed). Events older than 30 days are skipped in incremental runs, since their prices no longer move. Runs with startUrls never update the stored state.

❓ FAQ

Why are some odds empty? BestFightOdds shows per-book prices only for the books it lists today. Fights from before about 2021 keep their matchups, props and the consensus line (consensus_open, consensus_close), which is the price history the site still has for them.

What is the consensus line? The average of the books' prices that BestFightOdds charts as its "Mean" line. consensus_close is its latest value: the closing line once the event is over.

Why does Kalshi or Polymarket differ from the sportsbooks after an event? Prediction markets keep trading until the market settles, so their last price can move after the books have closed.

Do you have fight results? No; BestFightOdds is an odds site. For results, methods and records, use the Sherdog MMA Scraper and join on fighter names and event dates.

How do I pick a promotion that's not in the list? Leave promotions empty for every event, or paste the event pages into startUrls.