
Website Content Crawler
scrape.ly/store/querystone/website-content-crawlerAIDeveloper tools
1 monthly user

Scrape UFC fighter profiles from UFCStats: record, height, weight, reach, stance, age, striking and grappling career stats, plus every bout with opponent, method, round, time, strikes and takedowns. Search by name, paste fighter or event links, or walk the A-Z directory. No login needed.
Export UFC fighter profiles from UFCStats.com: professional record, height, weight, reach, stance, age, the eight career striking and grappling statistics, and every bout with opponent, method, round, time, strikes and takedowns. Search by name, paste fighter or event links, or walk the whole A to Z fighter directory. No login, no API key, about $18 per 1,000 fighters.
nextFight.silva, Jon Jones), and/or paste UFCStats links in UFCStats URLs, and/or pick Last-name letters to walk the directory.| Field | What it does |
|---|---|
searchTerms | Names or nicknames, one per line. A full name keeps only fighters that match every word. |
startUrls | Fighter links (/fighter-details/...), event links (every fighter on the card) or fight links (both fighters). |
letters | Walk the fighter directory for these last-name letters. With no names, links or letters, the whole directory is walked. |
maxItems | Most fighters to save in the run (default 10; 0 = no limit). |
stance, weightClasses, minWins, minLosses, maxLosses | Filters. |
includeFightHistory | Add every bout to each fighter (default on, billed per fighter with at least one bout). |
{
"searchTerms": ["silva"],
"startUrls": [{ "url": "http://ufcstats.com/fighter-details/f4c49976c75c5ab2" }],
"maxItems": 10,
"weightClasses": ["lightweight", "welterweight"],
"includeFightHistory": true
}
One row per fighter. The Fighters view shows the profile and career statistics; the Fight history view shows one row per bout.
| Field | Description |
|---|---|
fullName, firstName, lastName, nickname | Names as UFCStats shows them |
record, wins, losses, draws, noContests | Professional record, e.g. 22-7-0 (1 NC) |
height, heightInches, weightLbs, weightClass, reachInches, stance | Physical attributes |
dateOfBirth, age | Date of birth (ISO) and age today |
significantStrikesLandedPerMinute, strikingAccuracyPct, significantStrikesAbsorbedPerMinute, strikingDefensePct | Striking career stats |
takedownAveragePer15Min, takedownAccuracyPct, takedownDefensePct, submissionAveragePer15Min | Grappling career stats |
totalFights | Completed bouts listed on UFCStats |
nextFight | Next scheduled bout (opponent, event, date) when listed |
fightHistory[] | result, opponent, event, eventDate, method, methodDetails, round, time, knockdowns, significantStrikes, takedowns, submissions (each also as …For / …Against numbers), links |
url, fighterId, source, scrapedAt | Profile link, id, the name/letter/link that found the fighter, read time |
Example (from a test run; names and ids are changed, the shape and numbers are real):
{
"fighterId": "0a1b2c3d4e5f6a7b",
"url": "http://ufcstats.com/fighter-details/0a1b2c3d4e5f6a7b",
"fullName": "Marco Reyes",
"firstName": "Marco",
"lastName": "Reyes",
"nickname": "The Hammer",
"record": "22-7-0",
"wins": 22,
"losses": 7,
"draws": 0,
"noContests": 0,
"height": "5' 9\"",
"heightInches": 69,
"weightLbs": 155,
"weightClass": "Lightweight",
"reachInches": 74,
"stance": "Southpaw",
"dateOfBirth": "1988-07-14",
"age": 38,
"significantStrikesLandedPerMinute": 5.27,
"strikingAccuracyPct": 49,
"significantStrikesAbsorbedPerMinute": 4.71,
"strikingDefensePct": 53,
"takedownAveragePer15Min": 0.66,
"takedownAccuracyPct": 55,
"takedownDefensePct": 66,
"submissionAveragePer15Min": 0.1,
"totalFights": 15,
"nextFight": null,
"fightHistory": [
{
"result": "loss",
"opponent": "Sam Ortega",
"opponentUrl": "http://ufcstats.com/fighter-details/7b6a5f4e3d2c1b0a",
"event": "UFC 329",
"eventUrl": "http://ufcstats.com/event-details/1c2d3e4f5a6b7c8d",
"eventDate": "2026-07-11",
"method": "KO/TKO",
"methodDetails": null,
"round": 1,
"time": "1:09",
"knockdowns": "0 / 0",
"knockdownsFor": 0,
"knockdownsAgainst": 0,
"significantStrikes": "0 / 12",
"significantStrikesFor": 0,
"significantStrikesAgainst": 12,
"takedowns": "0 / 0",
"takedownsFor": 0,
"takedownsAgainst": 0,
"submissions": "0 / 0",
"submissionsFor": 0,
"submissionsAgainst": 0,
"fightUrl": "http://ufcstats.com/fight-details/8d7c6b5a4f3e2d1c"
}
],
"source": "search: reyes",
"scrapedAt": "2026-10-21T15:54:56.944Z"
}
Pay per result:
Worked example: 1,000 fighters with fight history ≈ $25.00 + under $0.10 usage. 1,000 profiles without fight history ≈ $18.00.
Set a maximum charge for the run and the scraper stops cleanly when it is reached, so you never pay for more than you allow.
Is it legal to scrape UFCStats? The scraper reads public pages that anyone can open without an account. Check the site's terms and your local rules for how you use the data.
Do I need a login or my own proxy? No. No account is needed, and the default datacenter proxy works well for UFCStats.
How many fighters can I get? Everything UFCStats lists: about 4,600 fighters across A to Z. Leave names, links and letters empty and set Max fighters to 0 for the full directory.
Why are some fields empty?
UFCStats leaves some profiles incomplete, mostly for older or one-fight fighters (no reach, no stance, -- for date of birth, or no per-bout strike numbers for early events). Those fields come back as null. Career statistics show 0 when UFCStats shows 0.00.
How do weight class filters work? UFCStats lists one weight per fighter (the latest). The weight class comes from that weight: 155 lbs is Lightweight, 170 Welterweight, and so on. A fighter who moved divisions is filed under the latest one.
Can I schedule it or use it from code? Yes. Schedule runs in the console, or start them through the API and read the dataset as JSON, CSV or Excel.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
searchTermsarrayOptionalFighter names
Find fighters by first name, last name or nickname, one search per line (e.g. 'silva', 'Jon Jones', 'The Notorious'). A full name keeps only the fighters that match every word. Works together with URLs and letters.
startUrlsarrayOptionalUFCStats URLs
Fighter profile links (http://ufcstats.com/fighter-details/...), event links (every fighter on that card) or fight links (both fighters). A bare 16-character fighter id works too.
lettersarrayOptionalLast-name letters
Walk the fighter directory for these last-name letters. When no names, URLs and letters are given at all, the whole directory (A to Z, about 4,600 fighters) is walked up to the limit.
maxItemsintegerOptionaldefault 10Max fighters
The most fighters to save in this run, across all names, URLs and letters. A cap, not a target. 0 means no limit.
Applied from the directory listing where possible, so fighters that do not match are never charged.
stanceenumOptionalStance
Only fighters with this stance.
weightClassesarrayOptionalWeight classes
Only fighters whose listed weight falls in these classes (e.g. 155 lbs = Lightweight). Fighters with no listed weight are left out when this is set.
minWinsintegerOptionalMinimum wins
Only fighters with at least this many career wins (professional record).
minLossesintegerOptionalMinimum losses
Only fighters with at least this many career losses.
maxLossesintegerOptionalMaximum losses
Only fighters with at most this many career losses (0 = unbeaten).
includeFightHistorybooleanOptionaldefault trueInclude fight history
Add every bout to each fighter: result, opponent, event, date, method, round, time, knockdowns, significant strikes, takedowns and submission attempts, for and against. Billed as an add-on per fighter that has at least one bout.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies work well for UFCStats.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| fighterId | string | null | UFCStats fighter id |
| url | string | null | Fighter profile link |
| fullName | string | null | Full name |
| firstName | string | null | First name |
| lastName | string | null | Last name |
| nickname | string | null | Nickname |
| record | string | null | Professional record as shown, e.g. 22-7-0 (1 NC) |
| wins | number | null | Career wins |
| losses | number | null | Career losses |
| draws | number | null | Career draws |
| noContests | number | null | No contests |
| height | string | null | Height as shown, e.g. 5' 9" |
| heightInches | number | null | Height in inches |
| weightLbs | number | null | Listed weight in pounds |
| weightClass | string | null | Weight class for the listed weight |
| reachInches | number | null | Reach in inches |
| stance | string | null | Stance |
| dateOfBirth | string | null | Date of birth (YYYY-MM-DD) |
| age | number | null | Age today |
| significantStrikesLandedPerMinute | number | null | Significant strikes landed per minute (SLpM) |
| strikingAccuracyPct | number | null | Significant striking accuracy, % |
| significantStrikesAbsorbedPerMinute | number | null | Significant strikes absorbed per minute (SApM) |
| strikingDefensePct | number | null | Significant strike defence, % |
| takedownAveragePer15Min | number | null | Takedowns landed per 15 minutes |
| takedownAccuracyPct | number | null | Takedown accuracy, % |
| takedownDefensePct | number | null | Takedown defence, % |
| submissionAveragePer15Min | number | null | Submissions attempted per 15 minutes |
| totalFights | number | null | Bouts listed on UFCStats (completed) |
| nextFight | object | null | The fighter's next scheduled bout, when UFCStats lists one |
| fightHistory | array | null | Every completed bout, newest first (null when fight history is turned off) |
| source | string | null | The name search, letter or URL that found this fighter |
| scrapedAt | string | null | When the profile was read (UTC) |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Fight history | Add-on per fighter when fight history is on and the fighter has at least one bout: every bout with result, opponent, event, method, round, time and stat line. | $0.007 |
| Fighter | One UFC fighter profile saved: record, physical attributes and career striking and grappling statistics. | $0.018 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('querystone/ufcstats-scraper').call({
"searchTerms": [
"silva"
],
"startUrls": [
{
"url": "http://ufcstats.com/fighter-details/f4c49976c75c5ab2"
}
],
"maxItems": 10,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run querystone/ufcstats-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=querystone/ufcstats-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
All fighters from one event link, with records, career stats and full fight histories.
Walk the UFCStats fighter directory for last names starting with A.
Full-name search for several fighters at once.
Directory walk filtered by stance, weight class and minimum wins.
Fighter profiles and career stats only, without the fight history add-on.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.