UFCStats Fighter Profile & Fight History Scraper
parseforge/ufcstats-scraper
Scrapes UFCStats.com fighter profiles and optional full fight histories. Returns each fighter as a flat row with physical attributes, career totals, and per-bout striking and grappling stats.
- Total users
- 205
- Monthly active
- 20
- Total runs
- 2.1K
- Bookmarked
- 0
- Last modified
- 2 days ago
This scraper was last updated on .
What does the UFCStats Fighter Profile & Fight History Scraper return?
UFCStats Fighter Profile & Fight History Scraper
Scrape UFCStats fighter profiles and complete fight histories, up to a million records per run. Every fighter row includes physical attributes, career stats, and a full bout-by-bout breakdown with strikes, takedowns, and method of victory. Export to CSV, JSON, Excel, or XML.
UFCStats.com holds the deepest public record of UFC fighter data, but browsing it manually means clicking through alphabet pages and individual profiles one by one. This Actor walks the entire fighter directory, or a targeted subset you define, and pulls every stat into a flat, analysis-ready row. No API key, no rate-limit headaches, structured data from the sport's most detailed archive.
| Who uses it | What they scrape UFCStats for |
|---|---|
| Sports analysts | Building predictive models from career-long striking and grappling data. |
| Fantasy MMA players | Comparing fighter stats to set weekly DraftKings lineups. |
| Content creators | Pulling accurate fight records for pre-fight preview graphics. |
| Bettors | Backtesting betting angles against historical fight outcomes. |
What it does
This Actor collects UFC fighter profiles from UFCStats.com, including physical attributes, career totals, and optional full fight history, and returns each fighter as a single flat record.
- ๐ฅ Full fight history: every bout with opponent, event, method, round, time, knockdowns, significant strikes, takedowns, and submission attempts.
- ๐ค Alphabet walk: start from A and crawl every last name, or restrict to specific letters to target a division.
- ๐ Free-text search: filter by first name, last name, or nickname like 'mcgregor' or 'spider' before a single request fires.
- ๐ Physical filters: narrow results to a specific stance (Orthodox, Southpaw, Switch) or minimum career wins and losses.
- ๐ฏ Direct URLs: drop in a list of fighter profile URLs and scrape only those, ignoring the directory walk.
Results export to CSV, JSON, Excel, or XML, or straight from the API.
What you can do with UFCStats data
๐ Build a fighter database.
A data engineer runs the Actor across all 26 letters once a quarter, dumps the results into a warehouse, and powers a Tableau dashboard the coaching staff uses for opponent scouting.
๐ฐ Model betting edges.
A quantitative bettor scrapes every lightweight with 10+ wins, joins the fight history to closing odds, and trains a model on striking differentials that predict underdog upsets.
๐๏ธ Prep a fight-week show.
A podcast producer drops in the two headliner URLs on Monday morning, grabs their full histories, and has the stat pack ready for the hosts by lunch.
๐ Run a fantasy league draft.
A league commissioner scrapes the top 50 fighters by wins, exports a CSV, and lets managers sort by strikes landed per minute to make their picks.
Why choose this scraper
| What you get | |
|---|---|
| Career stat totals | Lifetime wins, losses, draws, and no-contests pulled from the fighter header. |
| Physical profile | Height (text and inches), weight in pounds, reach in inches, stance, date of birth and age for every fighter. |
| Striking breakdown | Significant strikes landed per minute, accuracy, absorbed per minute, and defense percentage. |
| Grappling breakdown | Takedown average, takedown accuracy, takedown defense, and submission average per 15 minutes. |
| Fight-by-fight detail | Optional nested array with opponent, event, date, method, round, time, and the full stat line for each bout, both as the site shows it and split into numbers for and against. |
How it compares
This Actor and the UFC Stats API both pull data from ufcstats.com, but they differ in how you target fighters and what shape the output takes.
| Feature | ParseForge | UFC Stats |
|---|---|---|
| Full fight history per fighter | Yes, optional nested array | Yes |
| Free-text name and nickname search | Yes | Not listed |
| Alphabet walk by last-name letter | Yes | Not listed |
| Post-fetch filters (stance, min wins/losses) | Yes | Not listed |
| Direct fighter URL input | Yes | Not listed |
| Flat row output (CSV, JSON, Excel, XML) | Yes | Not listed |
Configure the run
Drive the Actor from specific fighter URLs, a free-text name search, or an alphabet walk by last-name letter, and apply filters for stance, minimum wins, and minimum losses so only relevant fighters land in your dataset. The three targeting modes are exclusive: give start URLs and you get exactly those fighters, give a search term and you get exactly what it matches, leave both empty and the Actor walks the directory. The Input tab lists every parameter.
A first run with the defaults:
{
"maxItems": 10,
"proxyConfiguration": {
"useApifyProxy": true
}
}
A larger pull:
{
"maxItems": 200,
"proxyConfiguration": {
"useApifyProxy": true
}
}
Free users
Free-plan runs return up to 10 results as a preview. Upgrade your Apify plan to collect up to 1,000,000 results per run.
Run it
- Create a free Apify account with $5 in credit.
- Open the UFCStats Fighter Profile & Fight History Scraper.
- Set your inputs and any filters, then click Start.
- 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.
Use with AI agents (MCP)
Give an AI agent live access to UFCStats through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:
claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/ufcstats-scraper"
Then prompt it in plain language to run the scraper and read back the results.
Troubleshooting
Why am I getting zero results?
Read the run status message: it names the reason. A search that UFCStats cannot match, start URLs that are not fighter profiles, and filters that nothing passes each produce their own message. If you set a minimum wins or losses filter, try lowering it, and confirm the letters array includes the starting letter of the fighters you expect.
The run stopped early with fewer records than maxItems.
The Actor stops when it exhausts the fighters matching your filters. If you set letters to only 'x' and minWins to 20, there may be fewer fighters than your maxItems value. Broaden the letters or lower the win threshold.
Some fighter profiles are missing data fields.
UFCStats occasionally has incomplete profiles, especially for older or recently debuted fighters. Missing fields appear as null or empty strings in the output. This is expected behavior reflecting the source data.
I am getting timeout errors.
UFCStats can be slow during high-traffic periods. The Actor retries failed requests automatically. If timeouts persist, increase the run memory to 2 GB or switch to residential proxies in the proxy configuration.
The fight history array is empty even though the fighter has bouts.
Ensure the includeFightHistory toggle is set to true. If it is and the array is still empty, the fighter's detail page on UFCStats may have a non-standard layout. Try scraping that fighter by direct URL in a separate run.
FAQ
| Question | Answer |
|---|---|
| Does this scrape every fighter on UFCStats? | Yes. If you leave the start URLs and search query empty and set letters to all A through Z, the Actor walks the full directory. Set maxItems to cap the total records returned. |
| Can I get the fight history for each fighter? | Yes. The includeFightHistory toggle is on by default and attaches a nested array with every bout, including opponent, event, method, round, time, and detailed striking and grappling stats. |
| How do I scrape only one weight class? | UFCStats does not expose a weight-class filter on its directory pages. The best approach is to scrape all fighters and filter the resulting dataset by weight class in your own code, or use the stance and min-wins filters to narrow the pool before export. |
| What proxy do I need? | The Actor defaults to Apify datacenter proxies, which work reliably for ufcstats.com. It rotates sessions and falls back to a direct connection if the proxy fails, so you rarely need to change this setting. |
| Can I search by nickname? | Yes. The searchQuery field matches against first name, last name, and nickname. Searching 'spider' returns Anderson Silva, and 'bones' returns Jon Jones. |
| Can I search a full name like 'Jon Jones'? | Yes. UFCStats itself only matches one name at a time and returns nothing for a full name, so the Actor searches each part separately and keeps the fighters that match all of them. |
| What happens if my search matches nothing? | The run ends with zero results and a status message saying so. It never substitutes fighters you did not ask for, and zero results cost you nothing. |
| How fast does it run? | The Actor processes fighters sequentially and retries with backoff when UFCStats or the proxy fails. A full A-Z walk of several thousand fighters typically completes in under an hour on a standard memory allocation. Raise the run timeout in Run options for large walks: the Actor stops and delivers what it has shortly before the timeout rather than being killed. |
| What output formats are supported? | Your dataset can be exported to CSV, JSON, Excel, or XML directly from the Apify run console. |
| Does it include fighter photo URLs? | No. UFCStats does not publish fighter photos, so there is no image field to return. |
| Can I scrape only specific fighters by URL? | Yes. Paste one or more fighter detail URLs into the startUrls field, and the Actor scrapes only those profiles, ignoring the directory walk and search. |
| What happens if a fighter has no fights listed? | The career totals will show zeros, and the fight history array will be empty. The record still appears in your dataset with the fighter's physical attributes populated. |
Related sports data actors
Other ParseForge sports data actors:
- Sherdog Scraper: MMA fighter records, bout-by-bout history and full event cards.
- ESPN MMA UFC Scraper: MMA fight results, UFC news and athlete records from ESPN.
- Tennis Abstract Scraper: every match in a player's history, with surface, round, rank, opponent and score.
- TennisExplorer Match Results Scraper: match results by date and tour, with set scores and odds.
- MLB Stats Scraper: official MLB schedules, rosters, player stats and live game detail.
๐ Need help? Email parseforge@protonmail.com with your run ID, your input, and what you expected.
โ ๏ธ Disclaimer. This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by UFCStats.com. It collects only publicly available data. You are responsible for using the collected data in compliance with the source's terms of service and applicable data-protection laws, including GDPR, CCPA, and PIPL. Do not use it to collect personal data unlawfully.
What input does the UFCStats Fighter Profile & Fight History Scraper accept?
| Field | Type | What it does | Default |
|---|---|---|---|
| maxItems | integer | How many fighter records to collect per run. A targeted run is never padded up to this number: it is a cap, not a target. | 10 |
| startUrls | array | Specific fighter profile URLs to scrape, e.g. https://ufcstats.com/fighter-details/f4c49976c75c5ab2. When set, ONLY these fighters are scraped: the search and the alphabet walk stay off, so the run returns at most as many rows as URLs you give. Event and fight URLs are not fighter profiles and are reported as skipped. | not set |
| searchQuery | string | Search UFCStats by first name, last name or nickname, e.g. 'mcgregor', 'silva', 'spider'. UFCStats matches one name at a time, so a full name such as 'Jon Jones' is searched part by part and only the fighters matching every part are kept. When set, the alphabet walk stays off: a search that matches nothing returns zero rows and says so rather than returning other fighters. | not set |
| letters | array | Restrict the alphabet walk to these starting letters of the fighter last name. Leave empty to walk A through Z. Ignored when start URLs or a search term are given. | not set |
| stance | string (6 options) | Only return fighters with this stance. Leave empty for all stances. Applied from the directory listing where possible, so non-matching fighters are not fetched or charged. | not set |
| minWins | integer | Only include fighters with at least this many career wins. Applied from the directory listing where possible, so non-matching fighters are not fetched or charged. | not set |
| minLosses | integer | Only include fighters with at least this many career losses. Applied from the directory listing where possible, so non-matching fighters are not fetched or charged. | not set |
| includeFightHistory | boolean | Include the full per-fight history table (opponent, event, method, round, time, KDs, strikes, takedowns, submissions) on each fighter record. | true |
| proxyConfiguration | object | Proxy configuration for requests. Defaults to Apify datacenter proxy, which works well for ufcstats.com. The scraper rotates proxy sessions and falls back to a direct connection automatically if the proxy fails. | {"useApifyProxy":true} |
How much does the UFCStats Fighter Profile & Fight History Scraper cost?
from $18.75 per 1,000 results
| Charged for | What it is | Price each |
|---|---|---|
| result | Single fighter profile in the default dataset. | $0.01875 to $0.025 |
| Fight history | The fighter's complete bout record: opponent, result, method, round and time for every fight. Charged once per fighter, and only when the row actually carries the history. | $0.0075 to $0.01 |
| Actor Start | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). | $0.036 to $0.054 |
Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.
How do I call the UFCStats Fighter Profile & Fight History Scraper API?
One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.
curl -X POST "https://api.apify.com/v2/acts/parseforge~ufcstats-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"maxItems": 10,
"includeFightHistory": true,
"proxyConfiguration": {
"useApifyProxy": true
}
}' What example inputs can I use?
Use these inputs to see how a run is configured.
{
"maxItems": 10,
"includeFightHistory": true,
"proxyConfiguration": {
"useApifyProxy": true
}
} What do users say about the UFCStats Fighter Profile & Fight History Scraper?
No reviews yet. Be the first.
How do I report an issue with the UFCStats Fighter Profile & Fight History Scraper?
We build and maintain this scraper, so a problem with it comes to us. Report it on the Apify listing and the thread stays attached to the scraper where the next person can find it: open an issue.
Broken and urgent, or you would rather not post in public? Write to parseforge@protonmail.com and it reaches the people who wrote it.
What related scrapers can I use?
Run UFCStats Fighter Profile & Fight History Scraper on Apify All scrapers
