# UFCStats Fighter Profile & Fight History Scraper (`parseforge/ufcstats-scraper`) Actor

Extract UFC/MMA fighter profiles, career records, striking and grappling stats, and full fight history from UFCStats.com. Filter by stance, wins, losses or search by name.

- **URL**: https://apify.com/parseforge/ufcstats-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** News, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $18.75 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

![ParseForge Banner](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)

## 🥊 UFCStats Fighter Profiles & Fight History Scraper

> 🚀 **Pull UFC fighter profiles, career records, striking and grappling statistics, and full per-fight history in seconds.** Filter by stance, minimum wins, search by name, or target specific fighter URLs. No API key, no registration, no manual CSV wrangling.

> 🕒 **Last updated:** 2026-05-15 · **📊 29 fields** per record · **4,400+ fighters indexed** · **Career striking & grappling metrics** · **Full per-fight history with strike, takedown, and submission breakdowns**

UFCStats.com is the official statistical archive maintained by the Ultimate Fighting Championship. It is the canonical source for **every UFC, Strikeforce, WEC, Pride, and PFL veteran ever signed to the promotion**, with structured records for career striking accuracy, takedown defense, submission attempts, and a fight-by-fight breakdown of every bout. The data is public, but the site is built around an alphabetical jump-table and per-fighter HTML pages with no API, no JSON endpoints, and no bulk export. Stitching together a usable dataset means walking 26 letter pages, opening each fighter, parsing free-form rows, and reconciling missing values.

This Actor scrapes **the same fighter pages a regular UFCStats visitor sees** and returns each record as flat, well-typed JSON ready to drop into a sports model, a betting dashboard, or a fantasy MMA app. Each record covers the fighter name, nickname, official record (W-L-D and No Contests), physical attributes (height, weight, reach, stance, date of birth), the full **eight career metrics** UFCStats publishes (significant strikes landed and absorbed per minute, striking accuracy and defense, takedown average, takedown accuracy and defense, submission average), and the complete fight history with opponent, event, date, method, round, time, knockdowns, significant strikes, takedowns, and submissions per round. Target a single fighter by URL, run a name search like "mcgregor" or "silva", restrict to one letter of the alphabet, or pull the entire roster.

| Target audience | Primary use cases |
|----------------|------------------|
| Sports betting analysts and quants | MMA betting odds modeling and edge detection |
| Fantasy MMA platform developers | Fighter rating engines and lineup optimization |
| MMA media and content creators | Pre-fight breakdowns, weekly stat columns, podcast research |
| Fight prediction model builders | Feature engineering on striking and grappling stats |
| Coaches and gym analysts | Opponent scouting reports and game-plan prep |
| Researchers and data journalists | Empirical studies of striking trends and weight-class evolution |

---

### 📋 What the UFCStats Scraper does

- 🔍 **Name search.** Free-text query across first name, last name, and nickname using the live UFCStats search endpoint.
- 🔗 **URL targeting.** Drop in any list of fighter-details URLs and pull only those profiles.
- 🔤 **Alphabet walk.** Restrict to one or more starting letters of the last name, or leave empty to walk A through Z.
- 🥋 **Stance filter.** Keep only Orthodox, Southpaw, Switch, Open Stance, or Sideways fighters.
- 📊 **Record thresholds.** Set minimum career wins or minimum career losses to focus on tenured roster members.
- 📜 **Optional fight history.** Toggle the per-fight history table on or off to keep records compact for bulk pulls.

Every record includes the UFCStats fighter ID, canonical profile URL, full name split into first and last, nickname, official W-L-D record with No Contests, height in feet and inches plus a parsed inch value, weight in pounds, reach in inches, stance, date of birth in ISO format and a computed age, the eight career striking and grappling metrics, the total fight count, and a nested array of every recorded fight with opponent, event, date, method, round, time, and per-round stat splits.

> 💡 **Why it matters:** UFCStats is the most authoritative MMA dataset and the only public source for these per-minute and per-15-minute career metrics. Pulling it directly gives you fresher numbers than any aggregator and no per-seat license.

---

### 🎬 Full Demo

🚧 Coming soon: a 3-minute walkthrough of the input form, the dataset view, and a worked example of building a fighter rating spreadsheet.

---

### ⚙️ Input

<table>
<thead>
<tr><th>Field</th><th>Type</th><th>Required</th><th>Description</th></tr>
</thead>
<tbody>
<tr><td><code>maxItems</code></td><td>integer</td><td>No</td><td>Maximum fighters to return. Free plan capped at 10 (preview). Paid plans up to 1,000,000.</td></tr>
<tr><td><code>startUrls</code></td><td>array of URL</td><td>No</td><td>Specific fighter profile URLs to scrape (e.g. <code>https://ufcstats.com/fighter-details/f4c49976c75c5ab2</code>).</td></tr>
<tr><td><code>searchQuery</code></td><td>string</td><td>No</td><td>Free-text query against first name, last name, and nickname.</td></tr>
<tr><td><code>letters</code></td><td>array of enum</td><td>No</td><td>Restrict the alphabet walk to these starting letters of the fighter last name. Leave empty to walk A-Z.</td></tr>
<tr><td><code>stance</code></td><td>enum</td><td>No</td><td>Filter by stance: Orthodox, Southpaw, Switch, Open Stance, Sideways.</td></tr>
<tr><td><code>minWins</code></td><td>integer</td><td>No</td><td>Only include fighters with at least this many career wins.</td></tr>
<tr><td><code>minLosses</code></td><td>integer</td><td>No</td><td>Only include fighters with at least this many career losses.</td></tr>
<tr><td><code>includeFightHistory</code></td><td>boolean</td><td>No</td><td>Include the per-fight history table on each record. Default true.</td></tr>
<tr><td><code>proxyConfiguration</code></td><td>object</td><td>No</td><td>Proxy configuration. Defaults to Apify Residential proxies.</td></tr>
</tbody>
</table>

Example: pull the first 25 Southpaw fighters with at least 10 career wins, full fight history included.

```json
{
    "maxItems": 25,
    "stance": "Southpaw",
    "minWins": 10,
    "includeFightHistory": true
}
````

Example: pull Conor McGregor and Khabib Nurmagomedov by URL with the full history.

```json
{
    "maxItems": 2,
    "startUrls": [
        { "url": "https://ufcstats.com/fighter-details/f4c49976c75c5ab2" },
        { "url": "https://ufcstats.com/fighter-details/c670aa48fe1f3ea7" }
    ],
    "includeFightHistory": true
}
```

> ⚠️ **Good to Know:** UFCStats stance, reach, height, and DOB are entered manually and a meaningful share of older or one-fight roster members have missing fields. The Actor reflects whatever the source has, returning <code>null</code> rather than guessing.

***

### 📊 Output

Each record describes a single fighter as a flat JSON object with a nested fight history array.

#### 🧾 Schema

| Field | Type | Example |
|-------|------|---------|
| 🆔 `fighterId` | string | `f4c49976c75c5ab2` |
| 🔗 `url` | string (URL) | `http://ufcstats.com/fighter-details/f4c49976c75c5ab2` |
| 🏷️ `fullName` | string | `Conor McGregor` |
| 🅰️ `firstName` | string | `Conor` |
| 🅱️ `lastName` | string | `McGregor` |
| 💬 `nickname` | string | `The Notorious` |
| 🏅 `record` | string | `22-6-0` |
| ✅ `wins` | integer | `22` |
| ❌ `losses` | integer | `6` |
| 🤝 `draws` | integer | `0` |
| ⚪ `noContests` | integer | `0` |
| 📏 `height` | string | `5' 9"` |
| 📐 `heightInches` | integer | `69` |
| ⚖️ `weightLbs` | integer | `155` |
| 🤜 `reachInches` | integer | `74` |
| 🥋 `stance` | string | `Southpaw` |
| 🎂 `dateOfBirth` | ISO date | `1988-07-14` |
| 🔢 `age` | integer | `37` |
| 🥊 `significantStrikesLandedPerMinute` | number | `5.32` |
| 🎯 `strikingAccuracyPct` | number | `49` |
| 🛡️ `significantStrikesAbsorbedPerMinute` | number | `4.66` |
| 🪖 `strikingDefensePct` | number | `54` |
| 🤼 `takedownAveragePer15Min` | number | `0.67` |
| 🎯 `takedownAccuracyPct` | number | `55` |
| 🛡️ `takedownDefensePct` | number | `66` |
| 🐍 `submissionAveragePer15Min` | number | `0.1` |
| 📊 `totalFights` | integer | `14` |
| 📜 `fightHistory` | array of object | `[{ result, opponent, event, method, round, time, ... }]` |
| 🕒 `scrapedAt` | ISO date | `2026-05-15T23:49:25.415Z` |

#### 📦 Sample records

<details>
<summary>🟢 Typical: Conor McGregor, fully populated profile with 14 logged fights</summary>

```json
{
    "fighterId": "f4c49976c75c5ab2",
    "url": "http://ufcstats.com/fighter-details/f4c49976c75c5ab2",
    "fullName": "Conor McGregor",
    "firstName": "Conor",
    "lastName": "McGregor",
    "nickname": "The Notorious",
    "record": "22-6-0",
    "wins": 22,
    "losses": 6,
    "draws": 0,
    "noContests": 0,
    "height": "5' 9\"",
    "heightInches": 69,
    "weightLbs": 155,
    "reachInches": 74,
    "stance": "Southpaw",
    "dateOfBirth": "1988-07-14",
    "age": 37,
    "significantStrikesLandedPerMinute": 5.32,
    "strikingAccuracyPct": 49,
    "significantStrikesAbsorbedPerMinute": 4.66,
    "strikingDefensePct": 54,
    "takedownAveragePer15Min": 0.67,
    "takedownAccuracyPct": 55,
    "takedownDefensePct": 66,
    "submissionAveragePer15Min": 0.1,
    "totalFights": 14,
    "fightHistory": [
        {
            "result": "loss",
            "opponent": "Dustin Poirier",
            "opponentUrl": "http://ufcstats.com/fighter-details/029eaff01e6bb8f0",
            "event": "UFC 264: Poirier vs. McGregor 3",
            "eventUrl": "http://ufcstats.com/event-details/8a0be41c0380188d",
            "eventDate": "2021-07-10",
            "method": "KO/TKO",
            "methodDetails": null,
            "round": 1,
            "time": "5:00",
            "knockdowns": "0 / 0",
            "significantStrikes": "27 / 36",
            "takedowns": "0 / 1",
            "submissions": "1 / 0",
            "fightUrl": "http://ufcstats.com/fight-details/7d0ce28ce8a77eb1"
        }
    ],
    "scrapedAt": "2026-05-15T23:49:25.415Z"
}
```

</details>

<details>
<summary>🟡 Edge case: Danny Abbadi, mid-tier fighter with full stats but only 2 UFC bouts logged</summary>

```json
{
    "fighterId": "15df64c02b6b0fde",
    "url": "http://ufcstats.com/fighter-details/15df64c02b6b0fde",
    "fullName": "Danny Abbadi",
    "firstName": "Danny",
    "lastName": "Abbadi",
    "nickname": "The Assassin",
    "record": "4-6-0",
    "wins": 4,
    "losses": 6,
    "draws": 0,
    "noContests": 0,
    "height": "5' 11\"",
    "heightInches": 71,
    "weightLbs": 155,
    "reachInches": null,
    "stance": "Orthodox",
    "dateOfBirth": "1983-07-03",
    "age": 42,
    "significantStrikesLandedPerMinute": 3.29,
    "strikingAccuracyPct": 38,
    "significantStrikesAbsorbedPerMinute": 4.41,
    "strikingDefensePct": 57,
    "takedownAveragePer15Min": 0,
    "takedownAccuracyPct": 0,
    "takedownDefensePct": 77,
    "submissionAveragePer15Min": 0,
    "totalFights": 2,
    "fightHistory": [
        {
            "result": "loss",
            "opponent": "Jorge Gurgel",
            "opponentUrl": "http://ufcstats.com/fighter-details/04d5718ed2661e8c",
            "event": "UFC 63: Hughes vs Penn",
            "eventUrl": "http://ufcstats.com/event-details/13e62d766b709aa6",
            "eventDate": "2006-09-23",
            "method": "S-DEC",
            "methodDetails": null,
            "round": 3,
            "time": "5:00",
            "knockdowns": "0 / 0",
            "significantStrikes": "56 / 58",
            "takedowns": "0 / 1",
            "submissions": "0 / 1",
            "fightUrl": "http://ufcstats.com/fight-details/38231925d72d1309"
        }
    ],
    "scrapedAt": "2026-05-15T23:49:25.415Z"
}
```

</details>

<details>
<summary>🔴 Sparse: Tom Aaron, regional veteran with missing physicals and zero career-stat data</summary>

```json
{
    "fighterId": "93fe7332d16c6ad9",
    "url": "http://ufcstats.com/fighter-details/93fe7332d16c6ad9",
    "fullName": "Tom Aaron",
    "firstName": "Tom",
    "lastName": "Aaron",
    "nickname": null,
    "record": "5-3-0",
    "wins": 5,
    "losses": 3,
    "draws": 0,
    "noContests": 0,
    "height": null,
    "heightInches": null,
    "weightLbs": 155,
    "reachInches": null,
    "stance": null,
    "dateOfBirth": "1978-07-13",
    "age": 47,
    "significantStrikesLandedPerMinute": 0,
    "strikingAccuracyPct": 0,
    "significantStrikesAbsorbedPerMinute": 0,
    "strikingDefensePct": 0,
    "takedownAveragePer15Min": 0,
    "takedownAccuracyPct": 0,
    "takedownDefensePct": 0,
    "submissionAveragePer15Min": 0,
    "totalFights": 2,
    "fightHistory": [],
    "scrapedAt": "2026-05-15T23:49:25.415Z"
}
```

</details>

***

### ✨ Why choose this Actor

| 🎯 | Capability |
|----|-----------|
| 🔄 | **Real-time data.** Every run hits the live UFCStats pages. No nightly snapshots, no stale CSV exports. |
| 📊 | **Full career-metric coverage.** All eight UFCStats career stats parsed into typed numbers, percents stripped of the trailing sign. |
| 📜 | **Per-fight history with stat splits.** Every logged bout returns knockdowns, significant strikes, takedowns, and submissions as fighter / opponent splits. |
| 📏 | **Physicals normalized.** Height returned both as the display string (<code>5' 9"</code>) and parsed inches, weight in pounds, reach in inches, DOB in ISO format, plus a computed age. |
| 🥋 | **Stance and record filters.** Server-side pages have no filters; the Actor applies stance, minWins, and minLosses after parsing each profile. |
| 🔗 | **Three targeting modes.** Search by name, paste in fighter URLs, or walk the alphabet listing. |
| 🛠️ | **No API key, no registration.** UFCStats publishes no API; this Actor reads the same public HTML the website serves and returns clean JSON. |

> 📊 At launch the UFCStats roster covers **4,400+ fighters across the entire UFC and acquired-promotion history**, with **per-fight stat splits on every modern bout** and the eight career rate-and-percentage metrics computed by the promotion itself.

***

### 📈 How it compares to alternatives

| Approach | Cost | Coverage | Refresh | Filters | Setup |
|----------|------|----------|---------|---------|-------|
| Paid sports-data APIs | $$$$ per seat | Multi-league | Live | Rich UI | Account + license |
| Community CSV dumps on data hubs | Free | Partial, dated | Quarterly or stale | None | Manual download |
| Official site (manual browsing) | Free | Full | Live | Letter pages only | Hours of clicking |
| Legacy MMA stats aggregators | Free or freemium | Mixed | Weekly | Limited | Account |
| **⭐ UFCStats Fighter Profiles & Fight History Scraper** *(this Actor)* | Pay-per-use | Full UFC roster | Live | Typed filters | One JSON input |

This Actor sits in the gap between the four-figure sports-data licenses and the stale community dumps: same data the league publishes, no key, no per-seat fee.

***

### 🚀 How to use

1. 🔐 **Create an Apify account.** [Sign up here](https://console.apify.com/sign-up?fpr=vmoqkp) if you do not have one yet.
2. 🎯 **Open the Actor page.** Click the green **Try for free** button.
3. ✏️ **Fill in your filters.** Pick a search query, paste fighter URLs, set minimum wins, or restrict to one letter. All fields are optional.
4. ▶️ **Run the Actor.** Hit **Start** and watch progress in the log panel as each fighter is parsed.
5. 💾 **Export the dataset.** Download as JSON, CSV, or Excel, or push directly to a webhook, Google Sheet, or your own pipeline.

> ⏱️ **Total time:** under 60 seconds for the first 25 fighters. Larger pulls scale linearly with the per-page fetch budget.

***

### 💼 Business use cases

<table>
<tr>
<td width="50%">

#### 🎯 Sports betting analysts

- Build per-fight win-probability models from career stats
- Detect closing-line value with up-to-the-moment fighter metrics
- Backtest betting strategies against historical fight outcomes
- Track late-camp stat updates before each card

</td>
<td width="50%">

#### 🕹️ Fantasy MMA developers

- Power lineup optimizers with stance and weight-class splits
- Score salary-cap leagues with strikes-landed projections
- Surface dark-horse fighters using takedown and submission rates
- Refresh fighter cards automatically before each event

</td>
</tr>
<tr>
<td width="50%">

#### 📰 MMA media and content

- Pre-fight breakdowns with side-by-side striking stats
- Weekly stat columns on emerging contenders
- Podcast research with verified records and dates
- Infographics built from fresh, structured numbers

</td>
<td width="50%">

#### 🏟️ Coaches and gym analysts

- Opponent scouting reports with strike, takedown, and sub splits
- Track an opponent's last five fights for game-plan prep
- Compare a fighter's metrics against weight-class averages
- Build internal databases of regional and main-roster prospects

</td>
</tr>
</table>

***

### 🌟 Beyond business use cases

Data like this powers more than commercial workflows. The same structured records support research, education, civic projects, and personal initiatives.

<table>
<tr>
<td width="50%">

#### 🎓 Research and academia

- Empirical datasets for papers, thesis work, and coursework
- Longitudinal studies tracking changes across snapshots
- Reproducible research with cited, versioned data pulls
- Classroom exercises on data analysis and ethical scraping

</td>
<td width="50%">

#### 🎨 Personal and creative

- Side projects, portfolio demos, and indie app launches
- Data visualizations, dashboards, and infographics
- Content research for bloggers, YouTubers, and podcasters
- Hobbyist collections and personal trackers

</td>
</tr>
<tr>
<td width="50%">

#### 🤝 Non-profit and civic

- Transparency reporting and accountability projects
- Advocacy campaigns backed by public-interest data
- Community-run databases for local issues
- Investigative journalism on public records

</td>
<td width="50%">

#### 🧪 Experimentation

- Prototype AI and machine-learning pipelines with real data
- Validate product-market hypotheses before engineering spend
- Train small domain-specific models on niche corpora
- Test dashboard concepts with live input

</td>
</tr>
</table>

***

### 🔌 Automating UFCStats Scraper

Run on a schedule, trigger from your own apps, or integrate with a workflow tool.

- [**Node.js client**](https://docs.apify.com/api/client/js) for triggering runs and reading dataset items from JavaScript and TypeScript
- [**Python client**](https://docs.apify.com/api/client/python) for the same in Python
- [**REST API docs**](https://docs.apify.com/api/v2) for direct HTTP integration

Schedules let you run this Actor every morning, every Monday, or every fight-week Thursday. Pair a weekly run with a webhook into your model or a Google Sheet to keep your fighter cards fresh without lifting a finger.

***

### ❓ Frequently Asked Questions

<details>
<summary>🤔 <strong>What exactly does this Actor scrape from UFCStats?</strong></summary>

It scrapes the public fighter-details pages and the alphabetical fighter listings on ufcstats.com, the same pages anyone can browse without an account. Each record covers the fighter name, nickname, record, physical attributes, the eight career striking and grappling metrics, and the per-fight history table with opponent, event, date, method, round, time, and stat splits.

</details>

<details>
<summary>🔑 <strong>Do I need a UFCStats API key or account?</strong></summary>

No. UFCStats publishes no API and does not require any account to view the data. The Actor reads the same public HTML the site serves to logged-out visitors.

</details>

<details>
<summary>📦 <strong>How fresh is the data?</strong></summary>

Every run hits the live UFCStats pages. Records reflect whatever the site has at the moment of the run. UFCStats typically updates fighter stats within a day of each event.

</details>

<details>
<summary>🔍 <strong>Can I filter by stance, wins, or weight class?</strong></summary>

Stance, minimum wins, and minimum losses are filterable directly through the input form. Weight class is not a server-side filter on UFCStats; you can pull all fighters and group by the <code>weightLbs</code> field after the run.

</details>

<details>
<summary>📈 <strong>How many records can I pull per run?</strong></summary>

Free plan runs are capped at 10 items as a preview. Paid plans scale up to 1,000,000 items. The full UFCStats roster sits around 4,400 fighters, so a single paid run can retrieve the entire database.

</details>

<details>
<summary>💼 <strong>Can I use this data for commercial purposes?</strong></summary>

The records come from public UFC statistical pages. You remain responsible for compliance with your own use case and the UFCStats terms. Verify your application against the site's terms and any guidance from your legal counsel before commercial deployment.

</details>

<details>
<summary>💳 <strong>Do I need a paid Apify plan to run this?</strong></summary>

No. Free plan users can preview up to 10 records per run. Paid plans unlock larger pulls, faster runs, and higher concurrency. See the [Apify pricing page](https://apify.com/pricing) for current tiers.

</details>

<details>
<summary>⚠️ <strong>What happens if a run fails?</strong></summary>

The Actor retries each request up to four times with exponential backoff. If a request still fails, the error is logged and the Actor continues with the next fighter. You only pay for items that returned data.

</details>

<details>
<summary>⚖️ <strong>Is scraping UFCStats legal?</strong></summary>

The Actor reads only public, logged-out endpoints serving data the league already publishes. It respects rate limits, uses residential proxies by default, and adds no authentication bypass. As always with web scraping, your specific use case may have additional considerations; consult counsel for novel commercial applications.

</details>

<details>
<summary>📜 <strong>Can I get the full fight history for each fighter?</strong></summary>

Yes. Set <code>includeFightHistory</code> to true (the default) and each record includes a nested array of every logged fight with opponent name and URL, event name and URL, date, method, method details, round, time, and per-fight stat splits (knockdowns, significant strikes, takedowns, submissions).

</details>

<details>
<summary>🏷️ <strong>Why are some fighters missing height, reach, or stance?</strong></summary>

UFCStats relies on manually entered profile data and a meaningful share of older fighters, one-fight roster members, and pre-modern-era veterans have incomplete fields. The Actor returns <code>null</code> for missing values rather than fabricating data; check the <code>height</code>, <code>reachInches</code>, and <code>stance</code> fields before relying on them in a model.

</details>

<details>
<summary>🎯 <strong>Can I target a single fighter by URL?</strong></summary>

Yes. Paste any number of fighter-details URLs into <code>startUrls</code> and the Actor will scrape only those profiles, subject to the <code>maxItems</code> cap. URLs look like <code>https://ufcstats.com/fighter-details/\<hex-id></code> and can be copied straight from the official site.

</details>

***

### 🔌 Integrate with any app

- [**Zapier**](https://apify.com/integrations) - push results to thousands of business apps
- [**Make**](https://www.make.com/en/integrations/apify) - visual workflow automation
- [**n8n**](https://n8n.io/integrations/apify/) - self-hostable workflow automation
- [**Airbyte**](https://airbyte.com/connectors/apify) - sync results into your data warehouse
- [**Google Sheets**](https://apify.com/apify/google-sheets) - dump runs straight into a spreadsheet
- [**Slack**](https://apify.com/apify/slack-message) - post notifications when fresh fighter data arrives

***

### 🔗 Recommended Actors

- [**🎰 DraftKings Scraper**](https://apify.com/parseforge/draftkings-scraper) - live sportsbook lines for MMA, NFL, NBA, and more
- [**📈 FanDuel Sportsbook Odds Scraper**](https://apify.com/parseforge/fanduel-scraper) - real-time FanDuel betting markets and odds movement
- [**📹 YouTube Scraper**](https://apify.com/parseforge/youtube-scraper) - mine fight breakdowns, training footage, and post-fight interviews
- [**💬 Reddit Posts Scraper**](https://apify.com/parseforge/reddit-posts-scraper) - pull r/MMA discussion, fight reactions, and prospect chatter
- [**📊 TikTok Hashtag Analytics Scraper**](https://apify.com/parseforge/tiktok-hashtag-analytics-scraper) - track #UFC and fighter hashtag reach and engagement

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for more sports, social, and business data scrapers.

***

**🆘 Need Help?**

Question, request, or stuck on a filter? [**Open our contact form**](https://tally.so/r/BzdKgA) and we will respond within one business day.

***

> ⚖️ **Disclaimer:** This Actor scrapes only public, logged-out UFCStats pages. UFCStats.com is operated by the UFC and the data it publishes is public statistical information. You are responsible for ensuring your use complies with applicable law and the UFCStats terms of use. We are not affiliated with the Ultimate Fighting Championship, Zuffa, TKO Group Holdings, or any related entity.

# Actor input Schema

## `maxItems` (type: `integer`):

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## `startUrls` (type: `array`):

Optional list of specific fighter profile URLs to scrape (e.g. https://ufcstats.com/fighter-details/f4c49976c75c5ab2). When set, only these fighters are scraped (subject to maxItems).

## `searchQuery` (type: `string`):

Free-text search across first name, last name, and nickname (e.g. 'mcgregor', 'silva', 'spider').

## `letters` (type: `array`):

Restrict the alphabet walk to these starting letters of the fighter last name. Leave empty to walk A through Z.

## `stance` (type: `string`):

Only return fighters with this stance. Leave empty for all stances.

## `minWins` (type: `integer`):

Only include fighters with at least this many career wins.

## `minLosses` (type: `integer`):

Only include fighters with at least this many career losses.

## `includeFightHistory` (type: `boolean`):

Include the full per-fight history table (opponent, event, method, round, time, KDs, strikes, takedowns, submissions) on each fighter record.

## `proxyConfiguration` (type: `object`):

Proxy configuration for requests. Defaults to Apify Residential proxies.

## Actor input object example

```json
{
  "maxItems": 10,
  "stance": "",
  "includeFightHistory": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/ufcstats-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/ufcstats-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call parseforge/ufcstats-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=parseforge/ufcstats-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "UFCStats Fighter Profile & Fight History Scraper",
        "description": "Extract UFC/MMA fighter profiles, career records, striking and grappling stats, and full fight history from UFCStats.com. Filter by stance, wins, losses or search by name.",
        "version": "0.1",
        "x-build-id": "FAi7JPPIglgok2kcf"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~ufcstats-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-ufcstats-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/parseforge~ufcstats-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-ufcstats-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/parseforge~ufcstats-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-ufcstats-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000"
                    },
                    "startUrls": {
                        "title": "Fighter URLs",
                        "type": "array",
                        "description": "Optional list of specific fighter profile URLs to scrape (e.g. https://ufcstats.com/fighter-details/f4c49976c75c5ab2). When set, only these fighters are scraped (subject to maxItems).",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Free-text search across first name, last name, and nickname (e.g. 'mcgregor', 'silva', 'spider')."
                    },
                    "letters": {
                        "title": "Last-name letters",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Restrict the alphabet walk to these starting letters of the fighter last name. Leave empty to walk A through Z.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "a",
                                "b",
                                "c",
                                "d",
                                "e",
                                "f",
                                "g",
                                "h",
                                "i",
                                "j",
                                "k",
                                "l",
                                "m",
                                "n",
                                "o",
                                "p",
                                "q",
                                "r",
                                "s",
                                "t",
                                "u",
                                "v",
                                "w",
                                "x",
                                "y",
                                "z"
                            ],
                            "enumTitles": [
                                "A",
                                "B",
                                "C",
                                "D",
                                "E",
                                "F",
                                "G",
                                "H",
                                "I",
                                "J",
                                "K",
                                "L",
                                "M",
                                "N",
                                "O",
                                "P",
                                "Q",
                                "R",
                                "S",
                                "T",
                                "U",
                                "V",
                                "W",
                                "X",
                                "Y",
                                "Z"
                            ]
                        }
                    },
                    "stance": {
                        "title": "Stance",
                        "enum": [
                            "",
                            "Orthodox",
                            "Southpaw",
                            "Switch",
                            "Open Stance",
                            "Sideways"
                        ],
                        "type": "string",
                        "description": "Only return fighters with this stance. Leave empty for all stances.",
                        "default": ""
                    },
                    "minWins": {
                        "title": "Minimum wins",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include fighters with at least this many career wins."
                    },
                    "minLosses": {
                        "title": "Minimum losses",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include fighters with at least this many career losses."
                    },
                    "includeFightHistory": {
                        "title": "Include fight history",
                        "type": "boolean",
                        "description": "Include the full per-fight history table (opponent, event, method, round, time, KDs, strikes, takedowns, submissions) on each fighter record.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy configuration for requests. Defaults to Apify Residential proxies.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
