HYROX race data client – retrieve full race results via Python
Project description
pyrox-client
Unofficial Python client for HYROX race results.
Install
uv pip install pyrox-client
or
pip install pyrox-client
DuckDB-backed reporting helpers are optional. The extra installs the DuckDB Python library, but it does not bundle a database file:
pip install "pyrox-client[reporting]"
Quickstart
import pyrox
client = pyrox.PyroxClient()
# Discover races
races = client.list_races()
seasons = client.list_seasons()
locations = client.list_locations(season=8)
years = client.list_years(season=8, location="london")
# Fetch one race
london = client.get_race(season=7, location="london")
# Optional filters
london_male_open = client.get_race(
season=7,
location="london",
gender="male",
division="open",
)
# Total time filter in minutes
sub60 = client.get_race(season=7, location="london", total_time=60)
range_50_60 = client.get_race(season=7, location="london", total_time=(50, 60))
# Athlete lookup in a race
athlete = client.get_athlete_in_race(
season=7,
location="london",
athlete_name="surname, name",
)
Core API
list_races(season: int | None = None, force_refresh: bool = False) -> pd.DataFramelist_seasons(force_refresh: bool = False) -> list[int]list_locations(season: int | None = None, force_refresh: bool = False) -> list[str]list_years(season: int | None = None, location: str | None = None, force_refresh: bool = False) -> list[int]get_race(season, location, year=None, gender=None, division=None, total_time=None, use_cache=True) -> pd.DataFrameget_season(season, locations=None, gender=None, division=None, max_workers=8, use_cache=True) -> pd.DataFrameget_athlete_in_race(season, location, athlete_name, year=None, gender=None, division=None, use_cache=True) -> pd.DataFrameclear_cache(pattern="*") -> Nonecache_info() -> dict
Mistake Recovery
RaceNotFound includes manifest-backed suggestions when a race cannot be found:
from pyrox.errors import RaceNotFound
try:
client.get_race(season=8, location="londn")
except RaceNotFound as exc:
print(exc)
print(exc.suggestions)
Reporting Helpers
The base install keeps the public client lightweight. ReportingClient requires
pyrox-client[reporting] and a local DuckDB database path; the package does not
ship the generated database artifact.
from pyrox.reporting import ReportingClient
reporting = ReportingClient(database="/path/to/pyrox_duckdb")
MCP Server
The hosted reporting service exposes a read-only MCP server over streamable HTTP at
https://pyrox-api.fly.dev/mcp/. It lets Claude answer natural-language questions
against the HYROX dataset through a small set of intent-shaped tools:
list_filters, find_athlete, get_distribution, get_rankings,
get_race_report, get_deepdive, and get_athlete_profile.
Add it to Claude Code with the claude mcp add command:
claude mcp add --transport http pyrox https://pyrox-api.fly.dev/mcp/
Then verify the connection:
claude mcp list
By default this registers the server at the local (project) scope. Use
--scope user to make it available across all your projects:
claude mcp add --transport http --scope user pyrox https://pyrox-api.fly.dev/mcp/
To remove it:
claude mcp remove pyrox
Claude web and Desktop
Pyrox also works as a custom connector in the Claude web app and Claude Desktop
(paid plans). Go to Settings -> Connectors -> Add custom connector, set the
name to Pyrox and the URL to https://pyrox-api.fly.dev/mcp/, and click
Add. The server is open and read-only, so it connects without a sign-in step.
For example prompts, tool semantics, and caveats, see docs/mcp.md.
Documentation
- Live docs: https://vmatei2.github.io/pyrox-client/
- Client API:
docs/api.md - MCP guide:
docs/mcp.md - Error model:
docs/errors.md - Filters and usage notes:
docs/filters.md
Repository Scope
The PyPI package is the pyrox client library.
This repository also contains a reporting service and UI (pyrox_api_service/, ui/) used for project workflows. Those are not part of the published pyrox-client wheel.
Reporting-service contract note:
- Athlete profile endpoints (
/api/athletes/profileand/api/athletes/{athlete_id}/profile) may include optionalpersonal_bests[*].percentilevalues in[0, 1]. average_times[*].percentilemay also be present with the same semantics.- Missing percentile data is non-fatal and returned by omitting the
percentilekey for that segment. - Profile percentile cohorts are computed against historical results in the same division and gender.
Maintainer-only operational docs:
docs/maintainers/README.mddocs/maintainers/release.mddocs/maintainers/reporting-service.md
License
Released under the MIT License — free to use, modify, and distribute. Copyright (c) 2026 Vlad Matei.
Disclaimer
Pyrox is an independent project and is not affiliated with, endorsed, or sponsored by HYROX. HYROX and related marks are trademarks of their respective owners and are used only for descriptive purposes.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyrox_client-0.2.5.tar.gz.
File metadata
- Download URL: pyrox_client-0.2.5.tar.gz
- Upload date:
- Size: 19.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
04dc0cd1786b11d79a37f2240b919e139aecdf113ccb9377f4db0e4df920b3f3
|
|
| MD5 |
f712b83cf2ee6832b278d40a798eae76
|
|
| BLAKE2b-256 |
53800dfcd3956a1a237b177dc37a1b6cb30478ba06e4df70736c82de7c2bda4a
|
Provenance
The following attestation bundles were made for pyrox_client-0.2.5.tar.gz:
Publisher:
release.yml on vmatei2/pyrox-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyrox_client-0.2.5.tar.gz -
Subject digest:
04dc0cd1786b11d79a37f2240b919e139aecdf113ccb9377f4db0e4df920b3f3 - Sigstore transparency entry: 2194448702
- Sigstore integration time:
-
Permalink:
vmatei2/pyrox-client@7d5ccd9e0687355a37e4d44f2d10f0b00ecc4431 -
Branch / Tag:
refs/tags/v0.2.5 - Owner: https://github.com/vmatei2
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@7d5ccd9e0687355a37e4d44f2d10f0b00ecc4431 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pyrox_client-0.2.5-py3-none-any.whl.
File metadata
- Download URL: pyrox_client-0.2.5-py3-none-any.whl
- Upload date:
- Size: 21.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d4b5dbe50ae6fb61f13e60ac96f909c14792fadf4061f280261fd46add46cb17
|
|
| MD5 |
571f760b8aadd19b64903713b7e2dbcf
|
|
| BLAKE2b-256 |
d9fc8a0ef6b805c1e6ed3c1324aed73fdef0d6aa47d0636cfada982c7dbec151
|
Provenance
The following attestation bundles were made for pyrox_client-0.2.5-py3-none-any.whl:
Publisher:
release.yml on vmatei2/pyrox-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyrox_client-0.2.5-py3-none-any.whl -
Subject digest:
d4b5dbe50ae6fb61f13e60ac96f909c14792fadf4061f280261fd46add46cb17 - Sigstore transparency entry: 2194448718
- Sigstore integration time:
-
Permalink:
vmatei2/pyrox-client@7d5ccd9e0687355a37e4d44f2d10f0b00ecc4431 -
Branch / Tag:
refs/tags/v0.2.5 - Owner: https://github.com/vmatei2
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@7d5ccd9e0687355a37e4d44f2d10f0b00ecc4431 -
Trigger Event:
push
-
Statement type: