UFCStats Fight & Round Stats avatar

UFCStats Fight & Round Stats

Pricing

from $0.86 / 1,000 results

Go to Apify Store
UFCStats Fight & Round Stats

UFCStats Fight & Round Stats

Get UFCStats fight and round statistics as flat rows with fighter IDs, event dates and locations. Supply event or fight URLs; export CSV or JSON.

Pricing

from $0.86 / 1,000 results

Rating

0.0

(0)

Developer

Eli J

Eli J

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

UFCStats Fight Round Stats

Turn the public UFCStats fight-details pages you name -- directly, or through the event cards those fights sit on -- into flat typed dataset rows: one row per fight, fighter and round, plus an optional fight-level total row per fighter.

Nothing is required and nothing is assumed. A run with no eventUrls and no fightUrls fetches nothing and writes no rows rather than picking a card for you, so it incurs zero result-row charges; the platform's automatic apify-actor-start event may still be charged for that run, so it is not free.

Input

FieldTypeDefaultWhat it does
eventUrlsarrayNone; one card is prefilled in the ConsoleEvent cards to take every fight from. An event-details URL in either host form, or a bare 16-hex event id. Up to 50 entries.
fightUrlsarrayNoneIndividual fights: a fight-details URL in either host form, or a bare 16-hex fight id. Up to 500 entries. Each one's event card is read once per event to join on the date and location.
includeTotalsbooleantrueAdds one scope: "total" row per fight and fighter carrying that fight's own Totals and Significant Strikes cells. Turn it off to store and pay for per-round rows only.
maxFightsinteger50The ceiling on distinct fights one run reads, applied to the selection order below. Between 1 and 500.
proxyConfigurationobjectApify Proxy offOne proxy URL is resolved once per run and used for every request. If a run is refused, the Apify Proxy datacenter group is the first thing to try.

Copy event URLs from the UFCStats completed-events listing, http://www.ufcstats.com/statistics/events/completed?page=all.

Targets are selected in eventUrls order, each card contributing its fights in the card's own order, then fightUrls in order. The first occurrence of a fight wins, so naming the same fight twice fetches it once, and a page is fetched only when it will be processed.

A malformed input is reported by field name only: the run fails before any request, and its ERRORS record names the field and the rule that failed, never the value you sent, because an input field can carry a credential.

Output

One row per (fight, fighter, round) in the default dataset, recordType fightRoundStats. A value the source does not carry is null; 0 means the page printed a zero.

Totals rows repeat the round rows. With includeTotals on, each fighter also gets one scope: "total" row per fight. If you sum the scope: "round" rows and also keep the scope: "total" rows, you double count. Filter to scope: "round" to add rows up, or read a scope: "total" row on its own.

Raw counts only. Every count is the page's own landed or attempted figure. The percentages the page prints are not emitted: they are yours to compute from these columns.

ColumnTypeUnit / form
recordTypestringLiteral fightRoundStats
rowKeystring<fightId>:<fighterId>:<scope>:<round-or-total>, unique within a fight
fightIdstring16 hex
fightUrlstringThe absolute URL this run fetched
eventIdstring16 hex, read from the fight page's own event anchor
eventNamestringAs printed
eventDatestring | nullYYYY-MM-DD, from the event card
eventLocationstring | nullAs printed, from the event card
fighterIdstring16 hex
fighterNamestringAs printed, trailing space stripped
opponentIdstring16 hex
opponentNamestringAs printed
resultstringThe page's own symbol (W, L), never coerced
weightClassstringAs printed, Bout suffix kept
methodstringAs printed
methodDetailstring | nullThe raw joined Details: text
endRoundinteger | nullThe round the fight ended in
endTimestring | nullM:SS as printed
timeFormatstring | nullAs printed
refereestring | nullAs printed
scopestringround or total
roundinteger | null1-based; null on a total row
knockdownsinteger | nullCount
sigStrikesLandedinteger | nullCount
sigStrikesAttemptedinteger | nullCount
totalStrikesLandedinteger | nullCount
totalStrikesAttemptedinteger | nullCount
takedownsLandedinteger | nullCount
takedownsAttemptedinteger | nullCount
submissionAttemptsinteger | nullCount
reversalsinteger | nullCount
controlTimeSecondsinteger | nullSeconds, converted from the page's M:SS
headLandedinteger | nullCount
headAttemptedinteger | nullCount
bodyLandedinteger | nullCount
bodyAttemptedinteger | nullCount
legLandedinteger | nullCount
legAttemptedinteger | nullCount
distanceLandedinteger | nullCount
distanceAttemptedinteger | nullCount
clinchLandedinteger | nullCount
clinchAttemptedinteger | nullCount
groundLandedinteger | nullCount
groundAttemptedinteger | nullCount
scrapedAtstringISO-8601 UTC, stamped at fetch

Pricing

A run is charged per dataset row plus the platform's automatic apify-actor-start event, once per run. A failure is never a dataset row, so it is never charged as one, and the run's counters report the rows that actually landed. An input that names no event and no fight writes no rows, so it incurs zero result-row charges; the start event may still be charged for that run.

Per-fight row subtotals, before the start event: one fight's rows come to a subtotal such as 4, 8 or 12 dataset rows. Each of those rows is charged at the applicable row rate in the current Pricing section of this Actor's Apify Store listing, and the automatic apify-actor-start event is charged separately, once per run. These subtotals only illustrate how one fight's rows add up; they are not a price for a card or a run.

Requests per run

Every request to the source is counted before it is sent, requests go out one at a time at least 1.5 seconds apart, and nothing is retried.

  • The prefilled card, with nothing failing: 2 + 1 + 14 = 17 requests -- 2 to start the session with the source, 1 for the card and 1 for each of the 14 fights it lists.
  • The logical upper bound at the defaults, when a run mixes both arrays: 2 + 50 + 50 + 50 = 152 requests -- 2 for the session, 50 named cards that contribute no selected fight, 50 further cards for 50 fights named directly whose cards all differ, and those 50 fights at the default maxFights of 50.
  • The hard ceiling, whatever the input: 1,052 requests. A run that reaches it stops normally, and its ERRORS record carries a request-ceiling notice naming the targets it left unfetched.

When a target produces no rows

Failures are never dataset rows. Each one is recorded in the run's ERRORS key-value record as an object with four keys -- target, id, errorClass, message -- and the Actor's key-value store schema lists every class it can carry, including the two run-level notices (charge-limit, request-ceiling) that stop a run normally rather than failing it, and the no-stats note for a fight whose page publishes no statistics tables at all.

Source and terms

Public UFCStats pages, fetched over plain HTTP. This Actor reads no page behind a login, writes nothing back to the source, and emits professional athletes' and officials' competition statistics only.

Every UFCStats page footer links the UFC Terms of Use at https://ufc.com/terms. Those terms say they "apply to all Ultimate Fighting Championship® web sites" and to "all associated sites linked to" www.ufc.com by Zuffa, LLC; that you may not use any "deep-link", "page-scrape", "robot", "spider" or other automatic device to access the site; that commercial reproduction of the site or its information without Zuffa, LLC's prior written permission is not permitted; and that "these files may not be used to construct any kind of database". Whether ufcstats.com is one of those associated sites is an open question, and this Actor does not settle it. Disclosing the conflict does not cure it: you are responsible for your downstream use of the data.