# Sherdog MMA Scraper — UFC Fighter Records & Fight Results (`seemuapps/sherdog-mma-scraper`) Actor

Scrape MMA fighter records, fight histories, event fight cards, results and upcoming events from Sherdog — UFC, PFL, Bellator, ONE and more.

- **URL**: https://apify.com/seemuapps/sherdog-mma-scraper.md
- **Developed by:** [Seemu Scraping](https://apify.com/seemuapps) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 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.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Sherdog MMA Scraper — UFC Fighter Records & Fight Results

Pull structured MMA data straight from Sherdog: complete fighter records and fight histories, full event fight cards with results, upcoming-event calendars, promotion event lists (UFC, PFL, Bellator, ONE, KSW and hundreds more), and fighter search — no login, no API key.

### What you get

- **Fighter profiles**: name, nickname, age, birth date, nationality, birthplace, height (cm + imperial), weight (kg + lbs), weight class, camp/association, photo URL
- **Career record**: wins, losses, draws, no contests, plus wins and losses broken down by KO/TKO, submission, decision and other
- **Full pro fight history**: opponent, event, date, method, referee, round and time for every bout — and the next scheduled fight if one is booked
- **Event fight cards**: one row per bout with both fighters, records, result, winner, method, referee, round, time, weight class and bout order — works for past events (results) and upcoming events (announced matchups)
- **Upcoming events calendar** across every promotion, filterable by promotion name, with the main event resolved
- **Organization event lists**: every upcoming and past event for a promotion, newest first, paginated automatically
- **Fighter search** by name or partial name: fighter ID, URL, nickname, height, weight, association
- Numbers are numbers, dates are ISO (`YYYY-MM-DD`), and every URL is absolute — ready for JSON, CSV, Excel or Google Sheets export

### Use cases

- **MMA betting models** — build fighter form, finish-rate and method-of-victory features from complete fight histories
- **Fan sites and apps** — power fighter pages, event previews and result feeds without maintaining your own scraper
- **Fighter comparison tools** — head-to-head record, finish breakdown, reach of common opponents
- **Sports journalism** — fact-check records, pull full cards and results for any event in seconds
- **Fantasy MMA and pick'em** — keep upcoming cards and matchups in sync automatically

### How to use

1. Pick a **Mode**:
   - **Fighter profiles & records** — paste Sherdog fighter URLs or plain fighter names (names are looked up automatically)
   - **Event fight cards & results** — paste Sherdog event URLs; every bout becomes one row
   - **Upcoming events calendar** — no input needed; optionally set a **Promotion filter** such as `UFC` or `PFL`
   - **Organization event list** — paste organization URLs, e.g. `https://www.sherdog.com/organizations/Ultimate-Fighting-Championship-UFC-2`
   - **Search fighters by name** — enter a **Search query** such as `Adesanya`
2. Set **Max items** (default 100; `0` = unlimited)
3. In the calendar and organization modes, leave **Include main event** on to resolve the headline matchup for each event (one extra page load per event), or turn it off for a faster run
4. Run the actor — results appear in the **Dataset** tab

### Output format

#### Fighter mode — one row per fighter

```json
{
  "fighterId": 27944,
  "name": "Jon Jones",
  "nickname": "Bones",
  "url": "https://www.sherdog.com/fighter/Jon-Jones-27944",
  "imageUrl": "https://www.sherdog.com/image_crop/200/300/_images/fighter/20220331052526_Jon_Jones_ff.JPG",
  "birthDate": "1987-07-19",
  "age": 39,
  "nationality": "United States",
  "birthplace": "Rochester, New York",
  "heightCm": 193.04,
  "heightText": "6'4\"",
  "weightKg": 107.95,
  "weightText": "238 lbs",
  "weightClass": "Heavyweight",
  "association": "Jackson-Wink MMA",
  "record": { "wins": 28, "losses": 1, "draws": 0, "noContests": 1 },
  "winsByKo": 11,
  "winsBySubmission": 7,
  "winsByDecision": 10,
  "winsByOther": 0,
  "lossesByKo": 0,
  "lossesBySubmission": 0,
  "lossesByDecision": 0,
  "lossesByOther": 1,
  "fightHistory": [
    {
      "result": "win",
      "opponent": "Stipe Miocic",
      "opponentUrl": "https://www.sherdog.com/fighter/Stipe-Miocic-39537",
      "event": "UFC 309 - Jones vs. Miocic",
      "eventUrl": "https://www.sherdog.com/events/UFC-309-Jones-vs-Miocic-103896",
      "eventDate": "2024-11-16",
      "method": "TKO (Spinning Back Kick and Punches)",
      "referee": "Herb Dean",
      "round": 3,
      "time": "4:29"
    }
  ],
  "upcomingFight": null,
  "scrapedAt": "2026-09-13T02:10:06.836Z"
}
```

`result` is one of `win`, `loss`, `draw` or `nc`. `upcomingFight` has the same shape as a fight-history entry (with `method`, `referee`, `round` and `time` set to `null`) when a bout is booked.

#### Event mode — one row per bout

```json
{
  "eventId": 103896,
  "eventName": "UFC 309 - Jones vs. Miocic",
  "eventUrl": "https://www.sherdog.com/events/UFC-309-Jones-vs-Miocic-103896",
  "eventDate": "2024-11-16",
  "promotion": "Ultimate Fighting Championship (UFC)",
  "location": "Madison Square Garden, New York, New York, United States",
  "boutOrder": 12,
  "isMainEvent": true,
  "weightClass": "Heavyweight",
  "fighter1": { "name": "Jon Jones", "url": "https://www.sherdog.com/fighter/Jon-Jones-27944", "record": "28-1-0", "result": "win" },
  "fighter2": { "name": "Stipe Miocic", "url": "https://www.sherdog.com/fighter/Stipe-Miocic-39537", "record": "20-5-0", "result": "loss" },
  "winner": "Jon Jones",
  "method": "TKO (Spinning Back Kick and Punches)",
  "referee": "Herb Dean",
  "round": 3,
  "time": "4:29",
  "scrapedAt": "2026-09-13T02:11:23.160Z"
}
```

`boutOrder` counts up from the first prelim to the main event. For upcoming cards `result`, `winner`, `method`, `referee`, `round` and `time` are `null` and each fighter's `record` shows their record going into the fight.

#### Upcoming events and organization modes — one row per event

```json
{
  "eventId": 113633,
  "name": "UFC 331 - Van vs. Pantoja 2",
  "url": "https://www.sherdog.com/events/UFC-331-Van-vs-Pantoja-2-113633",
  "date": "2026-09-19",
  "promotion": "Ultimate Fighting Championship (UFC)",
  "location": "Crypto.com Arena, Los Angeles, California, United States",
  "mainEvent": "Joshua Van vs. Alexandre Pantoja",
  "scrapedAt": "2026-09-13T02:11:42.954Z"
}
```

Organization mode lists upcoming events first (soonest first), then past events (newest first). `mainEvent` is `null` when no card has been announced yet or **Include main event** is off.

#### Search mode — one row per matching fighter

```json
{
  "fighterId": 56374,
  "name": "Israel Adesanya",
  "url": "https://www.sherdog.com/fighter/Israel-Adesanya-56374",
  "nickname": "The Last Stylebender",
  "height": "6'4\"",
  "heightCm": 193,
  "weight": "185 lbs",
  "weightKg": 83.91,
  "association": "City Kickboxing",
  "scrapedAt": "2026-09-13T02:13:53.311Z"
}
```

Search matches on both real names and nicknames, so a query like `Adesanya` also returns fighters nicknamed "Adesanya". Feed the `url` of the fighter you want into **Fighter** mode for the full record.

### Pricing

You are billed per row returned: one fighter, one bout, one event or one search result. Use **Max items** to cap spend per run.

### FAQ

**Can I pass fighter names instead of URLs?** Yes. Names are resolved through the fighter search; an exact name match is preferred, otherwise the closest match is used and logged. For fighters with common names, paste the Sherdog URL to be sure.

**Does the event mode work for events that haven't happened yet?** Yes — you get the announced matchups with each fighter's current record; result fields are `null` until the event is over.

**How far back does the organization mode go?** All the way. Past events are paginated 100 per page and the actor keeps going until it hits **Max items** or runs out of events.

**Which promotions are covered?** Every promotion listed on Sherdog — UFC, PFL, Bellator, ONE Championship, KSW, Cage Warriors, Rizin, regional shows and amateur cards.

# Actor input Schema

## `mode` (type: `string`):

What to scrape. Fighter = full profile + fight history per fighter. Event = every bout on a fight card. Upcoming events = the global upcoming-events calendar. Organization = all events (upcoming + past) of a promotion. Search = find fighters by name via the fight finder.

## `fighters` (type: `array`):

Fighter mode only. One per line: a Sherdog fighter URL (https://www.sherdog.com/fighter/Jon-Jones-27944) or a fighter name ('Islam Makhachev'). Names are resolved through the fight finder and the best-matching fighter is used.

## `events` (type: `array`):

Event mode only. Sherdog event page URLs, one per line, e.g. https://www.sherdog.com/events/UFC-309-Jones-vs-Miocic-103896. Every bout on the card becomes one row.

## `organizations` (type: `array`):

Organization mode only. Sherdog organization page URLs, one per line, e.g. https://www.sherdog.com/organizations/Ultimate-Fighting-Championship-UFC-2. Returns the promotion's upcoming events followed by its past events, newest first.

## `query` (type: `string`):

Search mode only. Fighter name or partial name to look up in the fight finder, e.g. 'Adesanya'.

## `promotionFilter` (type: `string`):

Upcoming events mode only. Keep only events whose promotion or name contains this text (case-insensitive), e.g. 'UFC', 'PFL', 'ONE Championship'. Leave empty for all promotions.

## `includeMainEvent` (type: `boolean`):

Upcoming events and organization modes. Opens each event page to fill in the main event ('Fighter A vs. Fighter B') and the full promotion name. Adds one page load per event — turn off for faster runs.

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

Maximum number of rows to return per run across all inputs (fighters, bouts, events or search results depending on the mode). 0 = unlimited.

## Actor input object example

```json
{
  "mode": "fighter",
  "fighters": [
    "https://www.sherdog.com/fighter/Jon-Jones-27944",
    "Islam Makhachev"
  ],
  "events": [
    "https://www.sherdog.com/events/UFC-309-Jones-vs-Miocic-103896"
  ],
  "organizations": [
    "https://www.sherdog.com/organizations/Ultimate-Fighting-Championship-UFC-2"
  ],
  "query": "Adesanya",
  "includeMainEvent": true,
  "maxItems": 100
}
```

# Actor output Schema

## `results` (type: `string`):

Fighter mode: fighterId, name, nickname, record, wins/losses breakdown, bio, fightHistory\[], upcomingFight. Event mode: one row per bout with fighter1, fighter2, winner, method, referee, round, time. Upcoming events / organization modes: eventId, name, url, date, promotion, location, mainEvent. Search mode: fighterId, name, url, nickname, height, weight, association.

# 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 = {
    "fighters": [
        "https://www.sherdog.com/fighter/Jon-Jones-27944",
        "Islam Makhachev"
    ],
    "events": [
        "https://www.sherdog.com/events/UFC-309-Jones-vs-Miocic-103896"
    ],
    "organizations": [
        "https://www.sherdog.com/organizations/Ultimate-Fighting-Championship-UFC-2"
    ],
    "query": "Adesanya",
    "promotionFilter": "",
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("seemuapps/sherdog-mma-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 = {
    "fighters": [
        "https://www.sherdog.com/fighter/Jon-Jones-27944",
        "Islam Makhachev",
    ],
    "events": ["https://www.sherdog.com/events/UFC-309-Jones-vs-Miocic-103896"],
    "organizations": ["https://www.sherdog.com/organizations/Ultimate-Fighting-Championship-UFC-2"],
    "query": "Adesanya",
    "promotionFilter": "",
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("seemuapps/sherdog-mma-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 '{
  "fighters": [
    "https://www.sherdog.com/fighter/Jon-Jones-27944",
    "Islam Makhachev"
  ],
  "events": [
    "https://www.sherdog.com/events/UFC-309-Jones-vs-Miocic-103896"
  ],
  "organizations": [
    "https://www.sherdog.com/organizations/Ultimate-Fighting-Championship-UFC-2"
  ],
  "query": "Adesanya",
  "promotionFilter": "",
  "maxItems": 100
}' |
apify call seemuapps/sherdog-mma-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,seemuapps/sherdog-mma-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/mnAEnL9yLcxWuUwlq/builds/O8Bd632NjRKfWdYiz/openapi.json
