# HYROX Race Results Scraper (`maximedupre/hyrox-race-results`) Actor

Collect published HYROX race results from the official timing portal. Choose seasons, events, divisions, and summary or detailed splits. Get rankings, times, participant details, result status, and official result links when available in a dataset.

- **URL**: https://apify.com/maximedupre/hyrox-race-results.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Sports, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.90 / 1,000 race 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

### 🏁 HYROX race results for focused analysis

Coaches, athletes, sports analysts, and developers can collect the complete published HYROX race results for selected seasons, events, and divisions. Each row keeps participant or team context, ranks, times, result status, and official source links when available, with detailed station and running-leg splits when the source publishes them. Use the rows for performance analysis, ranking tools, and downstream data workflows.

- Review published ranks and times with **[HYROX Results](https://apify.com/maximedupre/hyrox-race-results/examples/hyrox-results)**.
- Choose races and divisions to collect with **[HYROX Events](https://apify.com/maximedupre/hyrox-race-results/examples/hyrox-events)**.
- Collect 2026 race data with **[HYROX Races 2026](https://apify.com/maximedupre/hyrox-race-results/examples/hyrox-races-2026)**.
- Check one city's published results with **[HYROX Phoenix Results](https://apify.com/maximedupre/hyrox-race-results/examples/hyrox-phoenix-results)**.
- Check published entrants and result status with **[HYROX Start List](https://apify.com/maximedupre/hyrox-race-results/examples/hyrox-start-list)**.

#### 🧾 Published HYROX result rows

Each row represents one published participant or team result from the public HYROX timing portal. It can include the event, division, race date, gender, age group, nationality, bib, rank, time, result status, and official result link when available. Detailed runs can also include station and running-leg split arrays. The Actor preserves published station penalties and time bonuses when they are present.

#### ▶️ Choose the race scope and detail level

Run one shared scope at a time. Pick the seasons, event names, and division names shown by the official timing portal. Supported formats include Standard, PRO, Doubles, Relay, Adaptive, and Youngstars. Choose summary for core fields or detailed for station and running-leg splits when the source publishes them. Turn on non-finishers to include published disqualified entrants and entrants with no recorded result.

1. Open the Actor input.
2. Enter one or more seasons, events, and divisions from the official timing portal.
3. Choose `Summary` or `Detailed splits`, then choose whether to include non-finishers.
4. Run the Actor and open the `results` link in the Output tab.

#### ⚙️ Input

Each run uses one set of seasons, events, and divisions. Choose summary results or detailed results with station and running-leg splits when the official source publishes them. Include published disqualified entrants and registered entrants with no recorded result alongside ranked finishers.

**Input fields**

| Field | Type | What it does |
|---|---|---|
| `seasons` | array of strings | Names one or more seasons or years shown by the official HYROX timing portal. |
| `events` | array of strings | Names one or more HYROX events shown by the official timing portal. |
| `divisions` | array of strings | Names one or more competition divisions. Supported formats include Standard, PRO, Doubles, Relay, Adaptive, and Youngstars. |
| `detailLevel` | string | Chooses `summary` for core result fields or `detailed` for station and running-leg splits when published. |
| `includeNonFinishers` | boolean | Adds published disqualified entrants and registered entrants with no recorded result alongside ranked finishers. |

**Example input**

This small input is from a successful current-beta run.

```json
{
  "seasons": [
    "2026"
  ],
  "events": [
    "2026 Amsterdam"
  ],
  "divisions": [
    "Men"
  ],
  "detailLevel": "summary",
  "includeNonFinishers": false
}
```

#### 🧾 Output

Open the `results` output link to read the default dataset. Rows use one public dataset schema. Summary and detailed runs differ in which optional fields are returned by the selected detail level and the source.

**Output link**

| Field | Type | What it does |
|---|---|---|
| `results` | link | Opens the collected HYROX race results in the default dataset view. |

**Summary result rows**

Summary rows contain the core result fields below. A field is omitted when the official source does not publish it. Summary rows do not include `stationSplits` or `runningLegSplits`.

| Field | Type | What it does |
|---|---|---|
| `season` | string | Shows the season published by the official timing portal. |
| `eventName` | string | Shows the HYROX event name. |
| `raceDate` | date string | Shows the published race date when available. |
| `division` | string | Shows the competition division. |
| `gender` | string | Shows the published gender category when available. |
| `ageGroup` | string | Shows the published age-group category when available. |
| `entryName` | string | Shows the published participant or team name. |
| `nationality` | string | Shows the published nationality or country value. |
| `bib` | string | Shows the published bib number or label. |
| `resultStatus` | string | Shows the published status: `finished`, `didNotFinish`, `disqualified`, or `noResult`. |
| `disqualificationReason` | string | Shows the published disqualification reason when available. |
| `overallRank` | integer | Shows the published overall rank when available. |
| `ageGroupRank` | integer | Shows the published age-group rank when available. |
| `finishTime` | string | Shows the published finish time in the source time format when available. |
| `runningTotalTime` | string | Shows the published running-total time when available. |
| `transitionTime` | string | Shows the published transition time when available. |
| `sourceResultUrl` | URL string | Links to the official source result page when available. |

This is a genuine summary row from a successful current-beta run.

```json
{
  "season": "2026",
  "eventName": "2026 Amsterdam",
  "division": "HYROX PRO DOUBLES - Wednesday",
  "entryName": "Chaabane, Leonie (NED) / Serrant, Vannah (NED)",
  "nationality": "NED",
  "bib": "124013",
  "resultStatus": "finished",
  "ageGroup": "35-39",
  "gender": "Mixed",
  "overallRank": 1,
  "ageGroupRank": 1,
  "finishTime": "01:22:50",
  "runningTotalTime": "00:46:17",
  "transitionTime": "00:06:37",
  "sourceResultUrl": "https://results.hyrox.com/season-8/?content=detail&fpid=search&pid=search&idp=LR3MS4JI456FBE&lang=EN_CAP&event=HDP_LR3MS4JI1236&num_results=100&pidp=ranking_nav&ranking=time_finish_netto&search%5Bsex%5D=X&search%5Bage_class%5D=%25&search_event=HDP_LR3MS4JI1236&event_main_group=2026+Amsterdam"
}
```

**Detailed result rows**

Detailed rows use the complete field set below when the source publishes each value. Nested paths show the fields inside each split object.

| Field | Type | What it does |
|---|---|---|
| `season` | string | Shows the season published by the official timing portal. |
| `eventName` | string | Shows the HYROX event name. |
| `raceDate` | date string | Shows the published race date when available. |
| `division` | string | Shows the competition division. |
| `gender` | string | Shows the published gender category when available. |
| `ageGroup` | string | Shows the published age-group category when available. |
| `entryName` | string | Shows the published participant or team name. |
| `nationality` | string | Shows the published nationality or country value. |
| `bib` | string | Shows the published bib number or label. |
| `resultStatus` | string | Shows the published status: `finished`, `didNotFinish`, `disqualified`, or `noResult`. |
| `disqualificationReason` | string | Shows the published disqualification reason when available. |
| `overallRank` | integer | Shows the published overall rank when available. |
| `ageGroupRank` | integer | Shows the published age-group rank when available. |
| `finishTime` | string | Shows the published finish time in the source time format when available. |
| `runningTotalTime` | string | Shows the published running-total time when available. |
| `transitionTime` | string | Shows the published transition time when available. |
| `stationSplits` | array of objects | Lists published station splits in race order. |
| `stationSplits[].stationNumber` | integer | Shows the station's position in the race. |
| `stationSplits[].stationName` | string | Shows the published station name. |
| `stationSplits[].splitTime` | string | Shows the station split time. |
| `stationSplits[].runningTotalTime` | string | Shows the running-total time at the station when available. |
| `stationSplits[].penaltyTime` | string | Shows the published station penalty time when available. |
| `stationSplits[].bonusTime` | string | Shows the published station bonus time when available. |
| `runningLegSplits` | array of objects | Lists published running-leg splits in race order. |
| `runningLegSplits[].legNumber` | integer | Shows the running leg's position in the race. |
| `runningLegSplits[].splitTime` | string | Shows the running-leg split time. |
| `runningLegSplits[].runningTotalTime` | string | Shows the running-total time after the running leg when available. |
| `sourceResultUrl` | URL string | Links to the official source result page when available. |

This is a genuine detailed row from a successful current-beta run.

```json
{
  "season": "2026",
  "eventName": "2026 Amsterdam",
  "division": "HYROX - Sunday",
  "entryName": "Maref, Awin (NED)",
  "nationality": "NED",
  "bib": "120037",
  "resultStatus": "finished",
  "ageGroup": "35-39",
  "gender": "Men",
  "overallRank": 1,
  "ageGroupRank": 1,
  "finishTime": "01:48:58",
  "runningTotalTime": "00:49:56",
  "transitionTime": "00:09:48",
  "stationSplits": [
    {
      "stationNumber": 1,
      "stationName": "1000m SkiErg",
      "splitTime": "00:05:17",
      "runningTotalTime": "00:04:50"
    },
    {
      "stationNumber": 2,
      "stationName": "50m Sled Push",
      "splitTime": "00:03:27",
      "runningTotalTime": "00:10:43"
    },
    {
      "stationNumber": 3,
      "stationName": "50m Sled Pull",
      "splitTime": "00:06:23",
      "runningTotalTime": "00:17:01"
    },
    {
      "stationNumber": 4,
      "stationName": "80m Burpee Broad Jump",
      "splitTime": "00:10:51",
      "runningTotalTime": "00:23:25"
    },
    {
      "stationNumber": 5,
      "stationName": "1000m Row",
      "splitTime": "00:06:01",
      "runningTotalTime": "00:29:58"
    },
    {
      "stationNumber": 6,
      "stationName": "200m Farmers Carry",
      "splitTime": "00:02:14",
      "runningTotalTime": "00:36:27"
    },
    {
      "stationNumber": 7,
      "stationName": "100m Sandbag Lunges",
      "splitTime": "00:05:42",
      "runningTotalTime": "00:42:54"
    },
    {
      "stationNumber": 8,
      "stationName": "Wall Balls",
      "splitTime": "00:09:25",
      "runningTotalTime": "00:50:00"
    }
  ],
  "runningLegSplits": [
    {
      "legNumber": 1,
      "splitTime": "00:04:50",
      "runningTotalTime": "00:04:50"
    },
    {
      "legNumber": 2,
      "splitTime": "00:05:53",
      "runningTotalTime": "00:10:43"
    },
    {
      "legNumber": 3,
      "splitTime": "00:06:18",
      "runningTotalTime": "00:17:01"
    },
    {
      "legNumber": 4,
      "splitTime": "00:06:24",
      "runningTotalTime": "00:23:25"
    },
    {
      "legNumber": 5,
      "splitTime": "00:06:33",
      "runningTotalTime": "00:29:58"
    },
    {
      "legNumber": 6,
      "splitTime": "00:06:29",
      "runningTotalTime": "00:36:27"
    },
    {
      "legNumber": 7,
      "splitTime": "00:06:27",
      "runningTotalTime": "00:42:54"
    },
    {
      "legNumber": 8,
      "splitTime": "00:07:06",
      "runningTotalTime": "00:50:00"
    }
  ],
  "sourceResultUrl": "https://results.hyrox.com/season-8/?content=detail&fpid=search&pid=search&idp=LR3MS4JI456E56&lang=EN_CAP&event=H_LR3MS4JI123A&num_results=100&pidp=ranking_nav&ranking=time_finish_netto&search%5Bsex%5D=M&search%5Bage_class%5D=%25&search_event=H_LR3MS4JI123A&event_main_group=2026+Amsterdam"
}
```

Non-finisher rows use the same fields. Their `resultStatus` can be `disqualified` or `noResult`, and `disqualificationReason`, ranks, and times are present only when the source publishes them.

#### 💳 Pricing

**Billable event**

The Actor charges one event for each published participant or team race result saved to the dataset. The current price is shown in the Actor's pricing panel.

#### 🔌 Integrations

After a run, open the `results` output link to read the default dataset. Use Apify's dataset API or export options to pass the published rows to analysis and other data workflows.

**Video guide**

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### How do I get the latest HYROX race results for 2026?

Enter `2026` and the event and division names currently shown by the official timing portal. Run the Actor with `summary` or `detailed` results, depending on the fields you need.

##### How do I collect results for one event and division?

Enter the season, event name, and division name shown by the official timing portal. The run uses that shared selection for the requested result detail level.

##### What is the difference between summary and detailed results?

Summary rows provide the core participant, rank, and time fields. Detailed rows add station and running-leg split arrays when the official source publishes them.

##### Can I include disqualified entrants and entrants with no recorded result?

Yes. Turn on `includeNonFinishers` to include those published statuses alongside ranked finishers. The Actor does not infer why an entrant has no recorded result.

##### Which HYROX division formats are supported?

The input accepts division names for Standard, PRO, Doubles, Relay, Adaptive, and Youngstars formats when the official portal publishes them.

##### Does the Actor show live race tracking?

No. It collects published results from the public HYROX timing portal and does not provide live tracking, forecasts, or coaching recommendations.

##### Can an incomplete large collection resume?

Yes. The Actor supports resuming incomplete large collections without re-delivering rows already returned.

##### What happens when the source does not publish a field?

That field is omitted or left unavailable in the row. The Actor keeps source-published values and does not guess missing facts.

### 📝 Changelog

**v0.0** (28-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~hyrox-race-results/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Olympedia Olympic Results Scraper](https://apify.com/maximedupre/olympedia) for normalized Olympic placements and medal results.
- [Sofascore Live Events Scraper](https://apify.com/maximedupre/sofascore-live-events-scraper) for live and scheduled sports events, scores, and match context.
- [Bassmaster Tournament Results & Standings Scraper](https://apify.com/maximedupre/bassmaster) for tournament standings, ranks, weights, payouts, and source links.
- [HYROX Race Results Scraper](https://apify.com/jungle_synthesizer/hyrox-race-results-scraper) for HYROX results with source-specific station split coverage.
- [Mikatiming Marathon Results Scraper](https://apify.com/jungle_synthesizer/baa-mikatiming-marathon-results-scraper) for marathon finishers and split times from Mikatiming races.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `seasons` (type: `array`):

Enter one or more season names or years as shown by the official HYROX timing portal, such as `2025`.

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

Enter one or more HYROX event names as shown by the official timing portal, such as `HYROX London`.

## `divisions` (type: `array`):

Enter one or more division names as shown by the official timing portal. Supported formats include Standard, PRO, Doubles, Relay, Adaptive, and Youngstars.

## `detailLevel` (type: `string`):

Choose summary results or detailed results with station and running-leg splits when the source publishes them.

## `includeNonFinishers` (type: `boolean`):

Include published disqualified entrants and registered entrants with no recorded result alongside ranked finishers.

## Actor input object example

```json
{
  "seasons": [
    "2026"
  ],
  "events": [
    "2026 Amsterdam"
  ],
  "divisions": [
    "Men"
  ],
  "detailLevel": "summary"
}
```

# Actor output Schema

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

Open the collected HYROX race results.

# 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 = {
    "seasons": [
        "2026"
    ],
    "events": [
        "2026 Amsterdam"
    ],
    "divisions": [
        "Men"
    ],
    "detailLevel": "summary",
    "includeNonFinishers": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/hyrox-race-results").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 = {
    "seasons": ["2026"],
    "events": ["2026 Amsterdam"],
    "divisions": ["Men"],
    "detailLevel": "summary",
    "includeNonFinishers": False,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/hyrox-race-results").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 '{
  "seasons": [
    "2026"
  ],
  "events": [
    "2026 Amsterdam"
  ],
  "divisions": [
    "Men"
  ],
  "detailLevel": "summary",
  "includeNonFinishers": false
}' |
apify call maximedupre/hyrox-race-results --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/hyrox-race-results"
        }
    }
}
```

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/h6rO9Y744eNYMv0WT/builds/l66NaD5Cjl9Ti7sVW/openapi.json
