ProCyclingStats APIprocyclingstats.com ↗
Extract race results, startlists, rider profiles, team rosters, and classification standings from ProCyclingStats via 14 structured endpoints.
What is the ProCyclingStats API?
The ProCyclingStats API exposes 14 endpoints covering professional road cycling data including race results, rider profiles, team rosters, and multi-classification standings. The get_race_results endpoint returns a full finisher list with rank, time, UCI points, and post-stage jersey leaders for any stage or one-day race. Other endpoints cover startlist specialties, form scores, stage route profiles, and per-rider results broken down by race tier over a 24-month window.
curl -X GET 'https://api.parse.bot/scraper/cf66e8e3-c65a-4b3e-b418-c826000f01c2/get_race_results?url=race%2Ftour-de-france%2F2024%2Fstage-1' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace procyclingstats-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: ProCyclingStats SDK — bounded, re-runnable; every call capped."""
from parse_apis.ProCyclingStats_API import ProCyclingStats, ParseError
client = ProCyclingStats()
# Get a rider's profile including their numeric ID
profile = client.rider_profiles.get(url="rider/tadej-pogacar")
print(profile.id, profile.rider_name, profile.nationality, profile.current_team, profile.career_victories)
# Get team roster with team numeric ID
roster = client.team_rosters.get(url="team/alpecin-deceuninck-2024")
print(roster.id)
for rider in roster.riders[:3]:
print(rider.rider_name, rider.nationality, rider.pcs_ranking, rider.points)
# Get recent race results for a rider
for result in client.recent_results.list(url="rider/jonathan-milan", limit=3):
print(result.date, result.race_name, result.stage, result.position, result.pcs_points)
# Get GC standings for Tour de France 2024
standings = client.standings_results.get(url="race/tour-de-france/2024/gc")
print(standings.metadata.classification_type)
for entry in standings.standings[:3]:
print(entry.rank, entry.rider_name, entry.time)
# List all professional teams for 2024
for team in client.teams.list(year="2024", limit=3):
print(team.team_name, team.country)
# Typed error handling
try:
bad = client.rider_profiles.get(url="rider/nonexistent-rider-xyz")
print(bad.rider_name)
except ParseError as e:
print(f"error: {e.code}")
print("exercised: rider_profiles.get / team_rosters.get / recent_results.list / standings_results.get / teams.list")
Extract detailed race metadata and results for a specific event (stage or one-day race). Returns race information such as date, distance, departure/arrival cities, stage type, elevation gain, profile/map image URLs, jersey leader classifications after the stage, and a full list of finishing positions with rider names, teams, times, and UCI points. The url parameter is the path portion on ProCyclingStats (e.g. 'race/tour-de-france/2024/stage-1' or 'race/milano-sanremo/2024'). Metadata fields vary by race type; results are ordered by finishing position.
| Param | Type | Description |
|---|---|---|
| urlrequired | string | The race URL path on ProCyclingStats (e.g. 'race/tour-de-france/2024/stage-1' or 'race/milano-sanremo/2024'). |
{
"type": "object",
"fields": {
"results": "array of finishing positions, each with rank, rider_name, rider_url, team_name, uci_points, time, and resolved_time",
"metadata": "object containing race details such as date, distance, departure, arrival, classification, profile_score, avg_speed_winner, race_name, stage_type, elevation, profile_image_url, and route_map_url",
"classifications": "object with gc_leader, points_leader, kom_leader, youth_leader (each with rider_name and rider_url), team_winner (string or null), combative_rider (object with rider_name and rider_url, or null), and best_teammate (object with rider_name and rider_url, or null)"
},
"sample": {
"data": {
"results": [
{
"rank": "1",
"time": "5:07:22",
"rider_url": "https://www.procyclingstats.com/rider/romain-bardet",
"team_name": "Team dsm-firmenich PostNL",
"rider_name": "Bardet Romain",
"uci_points": "210",
"resolved_time": "5:07:22"
},
{
"rank": "2",
"time": ",,",
"rider_url": "https://www.procyclingstats.com/rider/frank-van-den-broek",
"team_name": "Team dsm-firmenich PostNL",
"rider_name": "van den Broek Frank",
"uci_points": "150",
"resolved_time": "5:07:22"
}
],
"metadata": {
"date": "29 June 2024",
"arrival": "Rimini",
"distance": "206 km",
"departure": "Firenze",
"race_name": "2024 » 111thTour de France(2.UWT)",
"start_time": "12:40",
"profile_score": "176",
"classification": "2.UWT",
"avg_speed_winner": "40.213 km/h"
}
},
"status": "success"
}
}About the ProCyclingStats API
Race and Classification Data
get_race_results accepts a url path such as race/tour-de-france/2024/stage-1 and returns a results array (rank, rider_name, rider_url, team_name, time, resolved_time, uci_points) alongside a metadata object with date, distance, departure, arrival, profile_score, avg_speed_winner, and elevation gain. A classifications object delivers the GC, points, KOM, and youth jersey leaders by name and URL after that stage. get_race_standings targets classification pages (e.g. race/tour-de-france/2024/gc) and returns ordered standings with time gaps, team names, and UCI points for GC, points, KOM, and youth competitions.
Startlist and Pre-Race Intelligence
get_race_riders returns the full startlist with rider_name, rider_url, team_name, team_url, nationality, and bib number. get_startlist_specialties merges six PCS specialty tables — GC, Time Trial, Sprint, One Day Races, Climber, Hills — into a single record per rider, with 0 assigned where a rider is unranked in a category. get_startlist_form combines form scores with current PCS ranking positions across all startlist riders, not just the visible top rows. get_top_competitors returns each rider's aggregated PCS score for the specific race. get_race_stages parses the stage profiles path and returns per-stage distance, elevation, profile scores, and time trial flags.
Rider and Team Profiles
get_rider_profile returns a rider's numeric PCS ID, photo URL, nationality, date of birth (ISO YYYY-MM-DD), current team, PCS ranking, and career victories count given a path like rider/tadej-pogacar. get_rider_recent_results returns the last 20 actual race or stage results — excluding GC/points/KOM standings — with date, race name, stage label, finishing position, and distance. get_rider_results_by_tier breaks PCS points and win counts over the trailing 24 months into seven tiers including Grand Tour overall, one-day races, and time trials. get_rider_upcoming_races reads a rider's schedule and detects active stage races to surface remaining stages, each with date, start time, and race category.
get_team_riders accepts a team path such as team/uae-team-emirates-xrg-2026 and returns rider names, profile URLs, nationalities, PCS world rankings, and accumulated PCS points for that season roster. get_all_teams lists all UCI WorldTeam and ProTeam squads for a given year with team name and two-letter country code. get_victory_ranking returns the top 100 riders ranked by all-time career victories with no required input parameters.
The ProCyclingStats API is a managed, monitored endpoint for procyclingstats.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when procyclingstats.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official procyclingstats.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a live Tour de France tracker showing stage results, jersey leaders, and GC standings updated after each stage.
- Aggregate per-rider specialty scores from
get_startlist_specialtiesto generate pre-race power rankings for a given event. - Produce a rider comparison tool using
get_rider_results_by_tierto contrast Grand Tour vs. one-day race performance over 24 months. - Generate team season reports by combining
get_team_ridersroster data with individual rider career victories fromget_rider_profile. - Monitor a rider's upcoming schedule via
get_rider_upcoming_racesto power a race-alert notification service. - Rank the all-time greatest sprinters or climbers by filtering
get_victory_rankingoutput against specialty data from startlist endpoints. - Display startlist bib numbers, nationalities, and team affiliations for race programs using
get_race_riders.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does ProCyclingStats have an official developer API?+
What does `get_race_results` return beyond just the finishing order?+
get_race_results returns three objects: a results array with rank, rider name and URL, team name, time, resolved_time, and UCI points; a metadata object with race date, distance, departure and arrival cities, classification, profile score, and average winner speed; and a classifications object identifying the GC, points, KOM, and youth jersey leaders by name and URL after that stage.Does the API cover historical race data beyond the current season?+
url parameter work with any valid ProCyclingStats path, including past seasons. For example, race/tour-de-france/2019/stage-20 is a valid input to get_race_results. get_all_teams also accepts historical year values.Does the API return rider contract details or transfer information?+
get_rider_profile returns current team, nationality, date of birth, PCS ranking, and career victories, but contract end dates and transfer history are not included. You can fork this API on Parse and revise it to add an endpoint targeting rider contract pages on ProCyclingStats.