UFCStats Scraper
Pricing
Pay per event
UFCStats Scraper
Extract UFCStats events, fight results, detailed bout stats, and fighter profiles for MMA analysis from public UFCStats pages.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Extract UFCStats events, fight results, detailed bout statistics, and fighter profile records from public UFCStats pages.
What does UFCStats Scraper do?
UFCStats Scraper turns UFCStats HTML pages into structured Apify datasets. It can start from the completed events index, a single event page, a fight detail page, or a fighter profile page.
Use it to collect event metadata, matchup rows, result methods, round and time values, significant strike totals, takedowns, submissions, and normalized fighter profile statistics.
Who is it for?
- π₯ MMA analysts building historical fight datasets
- π° Sports media teams preparing card previews and post-fight recaps
- π Fantasy and betting modelers who need repeatable UFCStats exports
- π§ͺ Researchers studying fight outcomes, methods, rounds, and athlete profiles
- π§° Data engineers who want UFCStats records in JSON, CSV, Excel, or via API
Why use this UFCStats extractor?
UFCStats pages are public but spread across event, fight, and fighter detail pages. This actor follows links for you and emits normalized records with a recordType field, so you can filter event, fight, and fighter rows after export.
What data can you extract?
| Record type | Example fields |
|---|---|
| Event | eventName, eventDate, eventLocation, eventUrl |
| Fight | redFighter, blueFighter, winner, weightClass, method, round, time, kdRed, kdBlue, sigStrRed, sigStrBlue, tdRed, tdBlue |
| Fighter | fighterName, fighterNickname, fighterRecord, height, weight, reach, stance, slpm, sapm, takedownAverage |
How much does it cost to scrape UFCStats?
This actor uses pay-per-event pricing. You pay a small start charge per run and a per-item charge for each dataset record saved. Keep maxEvents and maxFightsPerEvent low for smoke tests, then increase them for full data refreshes.
Quick start
- Open the actor on Apify.
- Keep the default completed events URL or paste your own UFCStats URL.
- Choose
maxEventsandmaxFightsPerEvent. - Decide whether to include fighter profile pages.
- Run the actor.
- Download results from the Dataset tab.
Input options
startUrlsβ UFCStats completed events, event detail, fight detail, or fighter detail URLs.maxEventsβ maximum event pages to process from the event list.maxFightsPerEventβ maximum fight rows per event.includeFighterProfilesβ whether to crawl linked fighter profile pages.
Example input
{"startUrls": [{ "url": "http://ufcstats.com/statistics/events/completed?page=all" }],"maxEvents": 5,"maxFightsPerEvent": 10,"includeFighterProfiles": true}
Output example
{"recordType": "fight","eventName": "UFC Fight Night: Fiziev vs. Torres","eventDate": "June 27, 2026","redFighter": "Shara Magomedov","blueFighter": "Michel Pereira","winner": "Shara Magomedov","weightClass": "Middleweight","method": "U-DEC","round": 3,"time": "5:00","sourceUrl": "http://ufcstats.com/fight-details/012c307c9d446c4d"}
Record types
Every row includes recordType:
eventrows summarize UFCStats event pages.fightrows summarize one bout.fighterrows summarize one athlete profile.
Tips for reliable runs
- Start with
maxEvents: 1while testing workflows. - Increase
maxFightsPerEventfor complete cards. - Use specific event URLs when you only need one card.
- Disable fighter profiles when you only need fight rows.
- Export CSV for spreadsheet workflows and JSON for model pipelines.
Integrations
Use the output with:
- Google Sheets and Excel for card research
- BigQuery, Snowflake, or Postgres for historical fight databases
- Python notebooks for MMA modeling
- BI dashboards for event/fighter summaries
- Newsroom workflows for fight card previews
API usage with Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/ufcstats-scraper').call({maxEvents: 3,maxFightsPerEvent: 10,includeFighterProfiles: true});console.log(run.defaultDatasetId);
API usage with Python
from apify_client import ApifyClientclient = ApifyClient('MY-APIFY-TOKEN')run = client.actor('automation-lab/ufcstats-scraper').call(run_input={'maxEvents': 3,'maxFightsPerEvent': 10,'includeFighterProfiles': True,})print(run['defaultDatasetId'])
API usage with cURL
curl "https://api.apify.com/v2/acts/automation-lab~ufcstats-scraper/runs?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"maxEvents":3,"maxFightsPerEvent":10,"includeFighterProfiles":true}'
MCP usage
Connect this actor through the Apify MCP server using:
https://mcp.apify.com/?tools=automation-lab/ufcstats-scraper
Claude Code setup:
$claude mcp add apify-ufcstats "https://mcp.apify.com/?tools=automation-lab/ufcstats-scraper"
Claude Desktop JSON config:
{"mcpServers": {"apify-ufcstats": {"url": "https://mcp.apify.com/?tools=automation-lab/ufcstats-scraper"}}}
Example prompts:
- "Run the UFCStats scraper for the last 3 completed events and summarize fight methods."
- "Extract fighter profiles linked from the latest UFCStats card."
- "Create a CSV of fight rows with winner, method, round, and time."
Start URL examples
- Completed events list:
http://ufcstats.com/statistics/events/completed?page=all - Event detail:
http://ufcstats.com/event-details/... - Fight detail:
http://ufcstats.com/fight-details/... - Fighter profile:
http://ufcstats.com/fighter-details/...
Data quality notes
UFCStats can publish upcoming or recently updated event rows. The actor skips future-dated events when crawling the completed events list, but it will process a specific URL if you provide it directly.
Legality
This actor extracts publicly available UFCStats pages. Use the data responsibly, respect the source website, and ensure your downstream usage complies with applicable laws and terms.
FAQ
Why did I get fewer rows than expected?
Check maxEvents, maxFightsPerEvent, and includeFighterProfiles. Disabling profiles greatly reduces output volume.
Can I scrape one card only?
Yes. Paste the event detail URL into startUrls and set maxFightsPerEvent to the number of fights you need.
Does this require a browser?
No. The actor uses HTTP requests and handles the lightweight UFCStats challenge without Playwright.
Related scrapers
Explore other Automation Lab sports and data actors at https://apify.com/automation-lab/.
Changelog
- 0.1 β Initial UFCStats events, fights, and fighter profile extractor.
Support
If you need a field added or see a UFCStats page that is not parsed correctly, open an issue on the Apify actor page with the run URL and input.
Dataset export formats
Apify datasets can be downloaded as JSON, JSONL, CSV, Excel, XML, RSS, or HTML table. For MMA modeling, JSONL and CSV are usually the most convenient formats.
Suggested workflows
- Refresh the latest completed events every week.
- Store fight rows in a warehouse keyed by
fightUrl. - Join fighter rows to fight rows using
fighterUrl. - Track method and round distributions over time.
- Build fighter-level aggregates from repeated profile exports.
Field reference
Event fields include event name, event date, event location, event URL, source URL, and scrape timestamp.
Fight fields include event context, fighter names, fighter URLs, winner, result status, weight class, method, round, time, knockdowns, strikes, takedowns, submissions, and detail metadata when available.
Fighter fields include name, nickname, record, height, weight, reach, stance, date of birth, striking rates, striking accuracy, takedown rates, takedown defense, and submission average.
Performance
The actor is HTTP based and avoids browser overhead. Larger runs mostly scale with the number of event, fight, and fighter pages requested.
Best practices
Keep default runs small, validate the output shape, and then increase limits for scheduled production refreshes.