OrbTop

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:

  1. Events list — Fetches all completed UFC events (775+ events since UFC 1 in 1993)
  2. Event detail — Extracts event metadata (name, date, location) and enqueues all fight links
  3. 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_b are "--" for early UFC events that didn't track control time
  • weight_class may be empty for historical fights before weight classes were formalized
  • winner is 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 startFromEvent to skip older events.
  • ufcstats.com operates on HTTP (not HTTPS). No proxy is required.
  • The default maxItems: 10 with startFromEvent: 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.