# UFC Scraper (`parsebird/ufc-scraper`) Actor

Scrape UFC.com for fighter profiles, event fight cards, and division rankings. Get records, stats, bios, fight results, and pound-for-pound rankings as structured JSON.

- **URL**: https://apify.com/parsebird/ufc-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:** News, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $24.00 / 1,000 ufc records

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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

### UFC Scraper

Scrape [UFC.com](https://www.ufc.com/) for fighter profiles, event fight cards, and division rankings without touching a browser or an API key. The **UFC Scraper** pulls structured fighter records, striking/grappling stats, full fight-card results, and official UFC rankings — including the pound-for-pound lists — as clean JSON, CSV, or Excel.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Collect UFC fighter records, bios, and career stats; full event fight cards with round-by-round results; or the official weight-division and pound-for-pound rankings — filter by division, gender, fighter status, and country.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
parsebird/ufc-scraper on Apify. Call: ApifyClient("TOKEN").actor("parsebird/ufc-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items for results. Key inputs: dataType (string, "fighters"/"events"/"rankings", default "fighters"), searchTerms (array of fighter or event names, default []), division (string, "flyweight"/"bantamweight"/"featherweight"/"lightweight"/"welterweight"/"middleweight"/"light-heavyweight"/"heavyweight"/"womens-strawweight"/"womens-flyweight"/"womens-bantamweight"/"womens-featherweight"/"pound-for-pound"), gender ("male"/"female"), fighterStatus ("active"/"not-fighting"/"retired"), country (string), eventType ("all"/"upcoming"/"past"), includeDetails (boolean, default true), maxResults (integer, default 100, 0 = as many as possible). Output record shape depends on dataType: fighter records include name, nickname, division, record, wins/losses/draws, bio, and a striking/grappling stats object; event records include title, date, location, and a fights array with corners, method, round, and time; ranking records include division, championName, and a rankings array. Full actor spec: fetch build via GET https://api.apify.com/v2/acts/parsebird~ufc-scraper (Bearer TOKEN). Get token: https://console.apify.com/account/integrations
```

### What does UFC Scraper do?

This UFC data scraper reads directly from [ufc.com](https://www.ufc.com/) — the same source UFC.com's own athlete, event, and rankings pages use — and turns it into structured data you can filter, export, and automate against. One actor, three data types:

- 🥊 **Fighters** — profile, nickname, division, record (W-L-D), status, hometown, physical measurements, and striking/grappling/takedown stats for any UFC athlete, active or historical
- 📅 **Events** — full fight cards for upcoming and past UFC events, including both corners, title-fight flags, Performance/Fight of the Night awards, and the round/time/method for every finished fight
- 🏆 **Rankings** — the official UFC weight-division rankings and both Men's and Women's pound-for-pound lists, with champion, ranked contenders, and rank movement

Search by name, filter fighters by weight division, gender, fighter status, or country of birth, and toggle between a fast listing-level summary or the complete detail page for every result. Runs as a hosted [Apify Actor](https://apify.com/), so you get built-in **scheduling**, **API access**, **webhooks**, integrations with Google Sheets/Zapier/Make, and one-click export to JSON, CSV, Excel, HTML, or XML — no scraping infrastructure to maintain.

### What data can you extract from UFC.com?

| Data type | Key fields |
|-----------|------------|
| Fighter | `name`, `nickname`, `division`, `record`, `wins`/`losses`/`draws`, `status`, `hometown`, `country`, `height`, `weight`, `reach`, `age`, `octagonDebut`, `trainsAt`, `stats` (Sig. Str. Landed, Takedown Defense, Wins by Knockout, and more) |
| Event | `title`, `date`, `location`, `poster`, `fightCount`, `fights` (weight class, red/blue corner, outcome, method, round, time, awards) |
| Ranking | `division`, `gender`, `championName`, `champion`, `rankings` (rank, name, url, rank change) |

### How to scrape UFC.com data

1. Go to the [UFC Scraper](https://apify.com/parsebird/ufc-scraper) page on Apify Store and click **Try for free** — no credit card needed to start.
2. Pick **What to Extract**: Fighters, Events, or Rankings.
3. Optionally add **Search Terms** (fighter names or event names), or leave empty to browse by filter.
4. Narrow Fighters or Rankings with **Division**, **Gender**, **Fighter Status**, or **Country**; narrow Events with **Event Type** (upcoming/past/all).
5. Toggle **Include Full Details** on for complete stats and fight-card results, or off for a fast listing-level summary.
6. Set **Max Results** and click **Start**.
7. When the run finishes, open the **Dataset** tab and export as JSON, CSV, Excel, HTML, or XML — or pull results straight from the [Apify API](https://docs.apify.com/api/v2).

Under the hood, the actor reads UFC.com's own athlete roster, event calendar, and rankings pages the same way a browser would, parses the record and stat markup, and normalizes it into one consistent schema per data type.

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `dataType` | string | `"fighters"` | `fighters`, `events`, or `rankings` |
| `searchTerms` | array | `[]` | Fighter names (Fighters) or event names (Events); merged results. Ignored for Rankings |
| `division` | string | `""` (all) | One weight division, or `pound-for-pound`. Applies to Fighters and Rankings |
| `gender` | string | `""` (all) | `male` or `female`. Applies to Fighters and Rankings |
| `fighterStatus` | string | `""` (any) | `active`, `not-fighting`, or `retired`. Fighters only |
| `country` | string | `""` | Country of birth, e.g. `United States`, `Brazil`. Fighters only |
| `eventType` | string | `"all"` | `upcoming`, `past`, or `all`. Events only |
| `includeDetails` | boolean | `true` | Full stats/fight card vs. a fast listing-level summary |
| `maxResults` | integer | `100` | Total records to collect (0 = as many as possible) |

### Output example

**Fighter** (`dataType: "fighters"`):

```json
{
  "recordType": "fighter",
  "id": "jon-jones",
  "name": "Jon Jones",
  "nickname": "Bones",
  "division": "Heavyweight",
  "status": "Active",
  "record": "28-1-0",
  "wins": 28,
  "losses": 1,
  "draws": 0,
  "hometown": "Rochester, United States",
  "country": "United States",
  "stats": {
    "Sig. Str. Landed Per Min": "4.38",
    "Takedown Defense": "95%",
    "Wins by Knockout": "11"
  },
  "url": "https://www.ufc.com/athlete/jon-jones"
}
```

**Event** (`dataType: "events"`, one fight from the card):

```json
{
  "recordType": "event",
  "id": "ufc-330",
  "title": "UFC 330",
  "date": "2026-08-16T01:00:00+00:00",
  "location": "Xfinity Mobile Arena, Philadelphia, United States",
  "fightCount": 12,
  "fights": [
    {
      "weightClass": "Welterweight Title Bout",
      "isTitleFight": true,
      "redCorner": { "name": "Islam Makhachev", "url": "https://www.ufc.com/athlete/islam-makhachev" },
      "blueCorner": { "name": "Ian Machado Garry", "url": "https://www.ufc.com/athlete/ian-machado-garry" },
      "redOutcome": "Win",
      "winner": "Islam Makhachev",
      "method": "Decision - Unanimous",
      "round": "5",
      "time": "5:00"
    }
  ],
  "url": "https://www.ufc.com/event/ufc-330"
}
```

**Ranking** (`dataType: "rankings"`, division truncated):

```json
{
  "recordType": "ranking",
  "id": "lightweight",
  "division": "Lightweight",
  "gender": "male",
  "championName": "Justin Gaethje",
  "rankings": [
    { "rank": 1, "name": "Ilia Topuria", "url": "https://www.ufc.com/athlete/ilia-topuria", "change": "" },
    { "rank": 2, "name": "Arman Tsarukyan", "url": "https://www.ufc.com/athlete/arman-tsarukyan", "change": "" }
  ],
  "url": "https://www.ufc.com/rankings"
}
```

### Use cases

- **MMA analytics & prediction models** — feed structured fighter stats and fight results into your own model
- **Fantasy MMA & betting research** — pull current form, records, and division rankings before fight week
- **Sports media & content** — auto-generate fighter cards, event previews, or rankings widgets
- **Fan apps & Discord bots** — power a `/ufc` command with live roster, event, and ranking lookups
- **Historical archives** — build a searchable database of UFC fight results and career records over time

### Use with the Apify API

**Python:**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("parsebird/ufc-scraper").call(run_input={
    "dataType": "fighters",
    "division": "heavyweight",
    "fighterStatus": "active",
    "maxResults": 50,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["name"], item["record"], item["status"])
```

**JavaScript:**

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

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('parsebird/ufc-scraper').call({
    dataType: 'rankings',
    division: 'pound-for-pound',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### How much does it cost to scrape UFC.com data?

UFC Scraper uses **Pay-per-event** pricing — you only pay for records actually returned, no separate compute charges. One `record-scraped` event fires per fighter, event, or ranking-division record pushed to the dataset. The price per event scales down with your Apify plan:

| Plan | Price per event | Price per 1,000 |
|------|-----------------|------------------|
| Free | $0.030 | $30.00 |
| Bronze | $0.028 | $28.00 |
| Silver | $0.026 | $26.00 |
| Gold | $0.024 | **$24.00** |

Collecting 100 fighters costs $3.00 on the Free plan (down to $2.40 on Gold); a full rankings sweep (roughly 20 division/pound-for-pound rows) costs under $0.60. Every plan — including [Free](https://apify.com/pricing) — starts with free platform credit, so you can try the actor before paying anything.

### Is it legal to scrape UFC.com?

Scraping publicly available data — the kind visible to any visitor without logging in, such as UFC.com's athlete profiles, event pages, and rankings — is generally considered legal in most jurisdictions. This actor only reads public pages and does not bypass logins, paywalls, or access controls. That said, you're responsible for how you use the collected data and for complying with UFC.com's terms of service and any applicable laws in your jurisdiction. See Apify's overview on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) for more detail.

### Related Actors

- [SofaScore Scraper](https://apify.com/parsebird/sofascore-scraper) — live scores, standings, and stats across football, basketball, tennis, and more
- [MLB Stats Scraper](https://apify.com/parsebird/mlb-stats-scraper) — MLB team, player, and game data
- [Tennis Abstract Player Match Scraper & API](https://apify.com/parsebird/tennis-abstract-match-scraper) — historical tennis match data and player stats

### FAQ

**How fresh is the data?**
Every run reads UFC.com live — there's no cache. Rankings, records, and event cards reflect whatever UFC.com shows at run time.

**Can I look up a specific fighter or event by name?**
Yes. Set `searchTerms` to one or more names — for fighters they match against UFC.com's athlete search; for events they match against the event title and event slug (e.g. `"UFC 330"` or `"McGregor"`).

**Why is `pound-for-pound` a division option for Fighters?**
Pound-for-pound isn't a weight class — it's UFC's cross-division "best fighter, regardless of weight" list. Setting `division: "pound-for-pound"` with `dataType: "fighters"` returns the fighters currently on the Men's and/or Women's pound-for-pound rankings (use `gender` to pick one list).

**Why does Women's Featherweight return no rankings?**
UFC no longer publishes a Women's Featherweight rankings list, so `dataType: "rankings"` with `division: "womens-featherweight"` correctly returns nothing. Fighters in that division are still returned by `dataType: "fighters"`.

**Does the Events data type cover UFC's entire event history?**
No — it mirrors what UFC.com's own events calendar publishes at run time: the current upcoming schedule and the most recent past events. It is not a historical archive.

**Can I schedule recurring runs?**
Yes. Use Apify's built-in [scheduler](https://docs.apify.com/platform/schedules) to run daily or weekly and track ranking or roster changes over time.

**Something looks wrong or missing?**
UFC.com occasionally changes its page markup. Open an issue on the actor's Issues tab in Apify Console and we'll take a look.

# Actor input Schema

## `dataType` (type: `string`):

What to collect: fighters (athlete profiles & records), events (fight cards & results), or rankings (official division & pound-for-pound standings).

## `searchTerms` (type: `array`):

Fighter names (for Fighters) or event names (for Events). Each term is searched separately and results are merged. Leave empty to collect everything of the chosen type. Ignored for Rankings.

## `division` (type: `string`):

Limit to one weight division. Applies to Fighters and Rankings. Women's Featherweight returns Fighters only for now: UFC no longer publishes a Women's Featherweight ranking, so Rankings has no list to return for it.

## `gender` (type: `string`):

Limit to male or female divisions. Applies to Fighters and Rankings.

## `fighterStatus` (type: `string`):

Limit to active, not-fighting, or retired. Applies to Fighters only.

## `country` (type: `string`):

Limit to fighters born in this country, e.g. United States, Brazil, Russia. Applies to Fighters only.

## `eventType` (type: `string`):

Collect upcoming events, past events, or all. Applies to Events only.

## `includeDetails` (type: `boolean`):

Fetch the complete record per result: striking/grappling stats and bio for fighters, or the full fight card with per-fight results for events. Turn off for a faster, lighter listing-level summary. No effect on Rankings.

## `maxResults` (type: `integer`):

How many records to collect in total across all search terms. Set to 0 to collect as many as possible. You'll get at most this many — fewer when the source has fewer (Rankings always returns one row per division regardless of this value). Very large uncapped sweeps are time-budgeted — Fighters roster runs (with or without full details) and Events calendar runs alike. If a run reaches the budget it stops and returns the records gathered so far, with a note in the log — set a specific number, or narrow with a weight division or event type, for a run that finishes cleanly.

## Actor input object example

```json
{
  "dataType": "fighters",
  "searchTerms": [
    "Jon Jones"
  ],
  "division": "",
  "gender": "",
  "fighterStatus": "",
  "country": "",
  "eventType": "all",
  "includeDetails": true,
  "maxResults": 100
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "dataType": "fighters",
    "searchTerms": [
        "Jon Jones"
    ],
    "includeDetails": true,
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/ufc-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 = {
    "dataType": "fighters",
    "searchTerms": ["Jon Jones"],
    "includeDetails": True,
    "maxResults": 100,
}

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

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

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

```

## CLI example

```bash
echo '{
  "dataType": "fighters",
  "searchTerms": [
    "Jon Jones"
  ],
  "includeDetails": true,
  "maxResults": 100
}' |
apify call parsebird/ufc-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/ufc-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/DqpbrEUEhOpp10pDd/builds/xinSKS34qWr0OKixT/openapi.json
