UFC Stats MMA Historical Fight Statistics Scraper
SPORTSAI
UFC Stats MMA Historical Fight Statistics Scraper
Scrapes complete historical fight statistics from ufcstats.com — the official UFC stats source. Retrieves per-fighter striking, takedown, and submission data for every recorded UFC bout.
What it does
This actor crawls ufcstats.com across three levels:
- Events list — Fetches all completed UFC events (775+ events since UFC 1 in 1993)
- Event detail — Extracts event metadata (name, date, location) and enqueues all fight links
- Fight detail — Extracts complete bout statistics for each fight
For each fight, the actor outputs a flat record with:
- Fight outcome: fighters, winner, method, round, time, weight class
- Total statistics: knockdowns, significant strikes (landed/attempted + %), total strikes, takedowns (landed/attempted + %), submission attempts, control time
- Significant strike breakdown by target: head, body, leg
- Significant strike breakdown by position: distance, clinch, ground
Input
| Field | Type | Default | Description |
|---|---|---|---|
maxItems |
integer | 10 | Maximum number of fight records to return |
startFromEvent |
integer | 0 | Skip this many events from most recent (0 = start from most recent) |
Example input
{
"maxItems": 100,
"startFromEvent": 0
}
To scrape the full historical dataset (7,000+ fights), set maxItems to a high value and allow the run to complete — expect several hours at the default rate limit.
Output
Each record in the dataset represents one UFC bout:
{
"fight_url": "http://ufcstats.com/fight-details/7e7d7a488ea21f63",
"event_name": "UFC 4: Revenge of the Warriors",
"event_date": "December 16, 1994",
"event_location": "Tulsa, Oklahoma, USA",
"fighter_a": "Steve Jennum",
"fighter_b": "Melton Bowen",
"winner": "Steve Jennum",
"result_a": "W",
"result_b": "L",
"method": "Submission",
"round": 1,
"time": "4:47",
"weight_class": "",
"kd_a": "0",
"kd_b": "0",
"sig_str_a": "13 of 40",
"sig_str_b": "1 of 4",
"sig_str_pct_a": "32%",
"sig_str_pct_b": "25%",
"total_str_a": "29 of 70",
"total_str_b": "48 of 59",
"td_a": "2 of 3",
"td_b": "0 of 0",
"td_pct_a": "66%",
"td_pct_b": "---",
"sub_att_a": 1,
"sub_att_b": 0,
"ctrl_time_a": "--",
"ctrl_time_b": "--",
"head_strikes_a": "13 of 36",
"head_strikes_b": "1 of 4",
"body_strikes_a": "0 of 2",
"body_strikes_b": "0 of 0",
"leg_strikes_a": "0 of 2",
"leg_strikes_b": "0 of 0",
"distance_strikes_a": "0 of 6",
"distance_strikes_b": "0 of 3",
"clinch_strikes_a": "0 of 0",
"clinch_strikes_b": "1 of 1",
"ground_strikes_a": "13 of 34",
"ground_strikes_b": "0 of 0"
}
Field notes
- Strike fields use the format
"X of Y"(landed of attempted) - Percentage fields are strings like
"32%"or"---"when not applicable ctrl_time_a/ctrl_time_bare"--"for early UFC events that didn't track control timeweight_classmay be empty for historical fights before weight classes were formalizedwinneris set to"Draw"or"NC"(no contest) when applicable
Use cases
- MMA analytics — Build fighter performance models, win probability calculators, or style matchup analysis
- Machine learning — Train classifiers for fight outcome prediction using the full historical dataset
- Research — Track evolution of fighting styles, dominant techniques across weight classes, or historical era comparisons
- Fantasy sports — Build scoring models based on verified official statistics
Notes
- The actor crawls in BFS order: all events are enqueued before fights. For a focused recent-events run, use
startFromEventto skip older events. - ufcstats.com operates on HTTP (not HTTPS). No proxy is required.
- The default
maxItems: 10withstartFromEvent: 770(last ~5 events) completes in under 30 seconds. A full historical run (all 7,000+ fights) takes several hours. - Rate is limited to ~5 concurrent requests to respect the source site.