Ufc Stats Scraper avatar

Ufc Stats Scraper

Pricing

from $10.50 / 1,000 results

Go to Apify Store
Ufc Stats Scraper

Ufc Stats Scraper

Get official UFC fighter records, event cards and full round by round fight breakdowns, strikes, takedowns and control time included. No login. Built for bettors backtesting models, fantasy MMA players, analysts and content creators who need accurate fight stats fast.

Pricing

from $10.50 / 1,000 results

Rating

0.0

(0)

Developer

Norm Data

Norm Data

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

10 days ago

Last modified

Categories

Share

Norm Data

🥊 UFC Stats Scraper

Extract official UFC fight statistics (fighter profiles, event cards, and full fight-by-fight strike and grappling breakdowns) as clean, structured records. Career averages, complete fight history, and per-fight totals (knockdowns, significant strikes, takedowns, control time), with an optional round-by-round split. No login, no account, no manual copying.

🎯 Who uses it?

🎮 Fantasy MMA players

Compare fighter stats to set weekly DraftKings / FanDuel lineups.

🎲 Bettors & model builders

Backtest betting angles and build predictive models from career-long striking and grappling data, down to the individual round.

📊 Analysts & researchers

Track career trajectories, finishing rates, and stylistic matchups across a fighter's entire UFC record.

✍️ Content creators

Pull accurate fight records and stats for pre-fight previews, graphics, and recaps.

✨ What it does

  • Fighter profiles: bio (height, weight, reach, stance, date of birth), career averages (significant strikes landed/absorbed per minute, strike accuracy & defense, takedown average, accuracy & defense, submission average), and full fight history.
  • Events: every completed or upcoming UFC event: date, location, and the full fight card.
  • Fight breakdowns: knockdowns, significant strikes (landed/attempted/accuracy), total strikes, takedowns, submission attempts, reversals, and control time, for the whole fight, or split out round by round.
  • Find fighters by name, paste fighter profile links directly, or browse an entire A–Z directory letter.
  • Filter by stance and minimum career wins/losses so only relevant fighters land in your dataset.
  • CRM-ready layout: keep fight history nested inside each fighter row, or flatten it to one row per past fight.
  • Heights/weights/reach are normalized to metric (cm / kg) alongside the raw record.

🏆 Why this scraper

  • Find fighters by name. The other UFC scrapers on Apify only search a single word at a time. This one takes a full name like "Israel Adesanya".
  • Round-by-round breakdowns. Strikes, takedowns, control time and more, split per round, not just fight totals.
  • Three entities in one actor: fighter profiles with full history, event cards, and fight-level breakdowns.
  • Filters that narrow the dataset: stance, minimum career wins or losses, and a whole A-Z directory letter at a time.
  • CRM-ready output: nested fight history, or flattened to one row per past fight.
  • No login, no API key, no proxy.

⚖️ How it compares

CapabilityThis actorOther UFC scrapers on Apify
Fighter profiles, events, fight breakdownsyessome
Search by full fighter nameyessingle word only
Round-by-round strike / takedown / control splitsyesrare
Filter by stance, minimum wins / lossesyesno
Nested or flattened fight historyyesno
Metric heights / weights / reach alongside the raw recordyesno
Declared dataset schema + free-plan previewyesno

📦 What data you get

EntityUseful fields
FighterName, record (W-L-D), height, weight, reach, stance, date of birth, significant-strike & takedown career averages, and full fight history.
EventName, date, location, and the fight card (both fighters, weight class, method, round, time, per fight).
FightBoth fighters, winner, weight class, method, round, time, referee, finish details, and full strike/takedown totals, optionally per round.

Every record includes scraped_at (UTC) and source. Download your dataset from Apify as CSV, JSON, Excel, or XML.

💡 Use cases

🎮 Build a fantasy lineup from career stats

{
"mode": "fighters",
"fighterNames": ["Islam Makhachev", "Ilia Topuria", "Alex Pereira"],
"includeFightHistory": false
}

🎲 Backtest a betting model on full round-by-round data

{
"mode": "fights",
"fighterNames": ["Jon Jones"],
"maxFightsPerFighter": 0,
"includeRoundByRound": true
}

📅 Get every event this year

{
"mode": "events",
"eventStatus": "completed",
"eventStartDate": "2026-01-01"
}

🗂️ Spreadsheet-ready fight history

{
"mode": "fighters",
"fighterNames": ["Alexander Volkanovski"],
"includeFightHistory": true,
"flattenHistory": true
}

📖 Browse the fighter directory, filtered

Directory letters group fighters by last name, not weight class or division. The official record doesn't expose a weight-class filter, so narrow the pool with stance and career win/loss minimums instead:

{
"mode": "fighters",
"letters": ["a", "b", "c"],
"stance": "Southpaw",
"minWins": 10,
"includeFightHistory": false,
"maxItems": 500
}

Every row this Actor returns includes a fighter_url. Save those links from an earlier run and paste them back in later to re-scrape exactly those fighters, skipping the name search:

{
"mode": "fighters",
"fighterUrls": ["<a fighter_url from a previous run>"],
"includeFightHistory": true
}

⚙️ How the input is organised

The input form is split into four numbered sections:

SectionWhat it's for
1 · What do you want to scrape?Pick one type of data: Fighter profiles, Events, or Fight breakdowns.
2 · Who or what to getFill in only the field that matches your choice: fighter names, fighter links (Fighter profiles / Fight breakdowns), a directory letter + optional stance / min wins / min losses filters (Fighter profiles), or event status + date range (Events).
3 · How much to collectMaximum rows for the whole run, and fights per fighter for Fight breakdowns (0 = their entire UFC record).
4 · What to includeFull fight history (and whether to flatten it to one row per fight), and a round-by-round breakdown for Fight breakdowns.

Apify Free plan: every run is limited to a fixed 10-row sample. Upgrade your Apify plan to run your own settings.

💰 Pricing

Pay-per-event: a one-time 0.03 when the run starts, plus a price per result saved to your dataset. The price depends on your Apify plan tier:

Your Apify planPrice per result
Free0.015
Bronze0.0135
Silver0.012
Gold / Platinum / Diamond0.0105

Approximate total cost (includes the 0.03 start fee):

Results collectedFreeBronzeSilverGold+
100$1.53$1.38$1.23$1.08
1,000$15.03$13.53$12.03$10.53
10,000$150.03$135.03$120.03$105.03

New Apify accounts start with $5 in free credit.

🚀 Run it

  1. Create a free Apify account with $5 in credit.
  2. Open the Ufc Stats Scraper.
  3. Fill in the input (or keep the prefilled example), set the maximum number of results, then click Start.
  4. Export the results as CSV, Excel, JSON, or XML from the Dataset tab.

Run it programmatically through the Apify API (run-sync-get-dataset-items) or the ApifyClient for JavaScript and Python, and schedule it with Apify's built-in Scheduler.

🤖 Use with AI agents (MCP)

Give an AI agent live access to the Ufc Stats Scraper through the Model Context Protocol:

claude mcp add --transport http apify "https://mcp.apify.com?tools=normdata/ufc-stats-scraper"

Then prompt it in plain language to run the scraper and read back the results.

🔧 Troubleshooting

A fighter, event or fight was skipped. Its page couldn't be loaded; the run log names it and the rest continues.

A fighter wasn't found by name. Use the full name as on UFC Stats, or paste the fighter's profile link.

I want one row per fight, not nested. Turn on "One row per past fight".

❓ FAQ

QuestionAnswer
Is this official data?Yes, official UFC fight statistics.
Does it include round-by-round stats?Yes, in Fight breakdowns with the round-by-round option on.
Can I list every fighter?Yes, browse the directory letter by letter.
Do I need an API key?No.

🛡️ Limits & responsible use

This Actor collects only publicly available, official UFC fight statistics. It never signs in and never accesses anything gated behind an account.

If a fighter, event, or fight page can't be loaded, that row is skipped with a warning in the run log. The rest of the run continues.

📧 Contact

Need a scraper for a different site, or found something wrong with this one? norm.data.scrapers@gmail.com

🧪 Local development

bun install
bun run typecheck
bun test
bun run start

Test with a sample storage/key_value_stores/default/INPUT.json, e.g.:

{ "mode": "fighters", "fighterNames": ["Jon Jones"], "maxItems": 5 }