---
name: cyclingapi
description: Cycling results, stage and classification standings, jersey leaders, riders and the race calendar since 1869, from the Cycling Data API (cyclingapi.com). Use when answering questions about professional or amateur cycling races, riders, results or upcoming races across road, track, mountain bike, cyclocross, BMX and gravel.
---

# Cycling Data API

Results, times and gaps for every stage and classification, jersey leaders after each stage, rider careers and the race calendar ahead, from 1869 to today. Road, track, mountain bike, cyclocross, BMX and gravel. Operated by DeveloperData.net.

## When to use it

- Who won a race, a stage or a classification, in any season.
- A rider's results, career span, wins and podiums.
- Who held a jersey after a given stage.
- What is racing today and in the weeks ahead.

Not for: live in-race timing, rider power or heart rate, odds, or predictions. The data is factual only.

## Getting access

- A free key: https://cyclingapi.com/signup (today and yesterday, usage and coverage, 50 calls a day, no card).
- Paid plans for the current season and the full archive: https://cyclingapi.com/pricing
- Send the key on every call: `Authorization: Bearer <key>` or `X-API-Key: <key>`. Never in the address.
- Base URL: `https://api.cyclingapi.com`

## The common calls

What is racing today (free on every key; ids are our own: `rc_` races, `rd_` riders, `cp_` calendar competitions, `tm_` teams):

```
curl "https://api.cyclingapi.com/v1/today/races" -H "Authorization: Bearer $CYCLING_KEY"
{"data":[{"id":"cp_4kx9m2qa","name":"Tour de Langkawi","discipline":"road","start_date":"2026-10-08","end_date":"2026-10-15","country":"MAS","venue":"Kuah"}],"meta":{"count":1}}
```

Results of a stage:

```
curl "https://api.cyclingapi.com/v1/results?race=rc_7qk3m2xa&year=2025&stage=17" -H "Authorization: Bearer $CYCLING_KEY"
{"data":[{"rank":1,"classification":"stage","rider":{"id":"rd_9xk2m4qa","name":"...","nation":"SLO"},"time_s":17402,"gap_s":0}],"meta":{"count":176}}
```

Endpoints:

Free on every key:
- `GET /v1/today/races`, `/v1/today/results`, `/v1/today/jerseys` what is racing now, results posted today, jersey leaders today
- `GET /v1/yesterday/races`, `/v1/results/yesterday` what ran and finished yesterday
- `GET /v1/usage` your plan and calls used (never counted)
- `GET /v1/coverage`, `/v1/coverage/decades`, `/v1/coverage/races?q=` what the archive holds

Paid plans (Live, Archive, Complete):
- Calendar: `/v1/calendar?from=&to=`, `/v1/calendar/upcoming?days=`, `/v1/calendar/countries?year=`
- Races: `/v1/races?year=&q=`, `/v1/races/{id}?year=`, `/v1/races/{id}/history`, `/v1/races/{id}/stages?year=`, `/v1/races/{id}/podium?year=`, `/v1/races/{id}/winners`
- Results: `/v1/results?race=&year=`, `/v1/results/stage?race=&year=&stage=`, `/v1/results/general`, `/v1/results/points`, `/v1/results/mountains`, `/v1/results/youth`, `/v1/results/teams` (each `?race=&year=&stage=`), `/v1/results/non-finishers?race=&year=`
- Jerseys: `/v1/classifications?race=&year=&jersey=`, `/v1/jerseys/winners?year=`
- Riders: `/v1/riders?q=`, `/v1/riders/{id}`, `/v1/riders/{id}/results`, `/v1/riders/{id}/wins`, `/v1/riders/{id}/seasons`, `/v1/riders/{id}/teams`, `/v1/riders/compare?a=&b=`
- Teams: `/v1/teams?year=`, `/v1/teams/{id}?year=`
- Places: `/v1/places?q=`, `/v1/stages/summit-finishes?year=&min_altitude=`
- Nations: `/v1/nations?year=`, `/v1/nations/{code}/history`
- Stats: `/v1/stats/season`, `/v1/stats/leaders?metric=wins|podiums|top_10`, `/v1/stats/teams`, `/v1/stats/closest-finishes`, `/v1/stats/fastest-stages`, `/v1/stats/stage-types`, `/v1/stats/winner-ages` (each `?year=`), `/v1/races/{id}/records`, `/margins`, `/speeds`, `/winner-ages`, `/attrition`, `/v1/riders/{id}/stats`, `/v1/riders/{id}/terrain`
- Weather (every stage start and finish since 1940): `/v1/races/{id}/weather?year=`, `/v1/weather/stage?race=&year=&stage=`, `/v1/weather/extremes?metric=hottest|coldest|wettest|windiest|snowiest`, `/v1/races/{id}/weather-history`, `/v1/riders/{id}/weather`, `/v1/weather/specialists?condition=rain|heat|cold|wind|snow`

The full reference in one file: https://cyclingapi.com/documentation/manual.md

## MCP server

`https://cyclingapi.com/mcp`, with your key as `Authorization: Bearer <key>`. Tools: `find_races`, `race_edition`, `race_results`, `yesterdays_results`, `find_rider`, `rider_profile`, `rider_results`, `race_calendar`, `jersey_leaders`.

## Webhooks

Paid plans can register https endpoints in the account to receive `result.published` when results land, signed with `X-Cycling-Signature`. Guide: https://cyclingapi.com/documentation/webhooks

## Limits

- Free key: 10 calls a minute, 50 a day, yesterday onward.
- Live: this season. Archive: every season up to yesterday. Complete: everything, live results included.
- Lists return 50 rows by default, at most 200: pass `page` or the `next_cursor` from `meta`.
- Times are seconds; timestamps are UTC.

## Errors

`{"error": {"code": "...", "message": "...", "docs": "..."}}`

- 400 `bad_request`, 422 `unknown_parameter`: fix the parameter named in the message.
- 401 `unauthorized`: no key or an unknown key.
- 403 `upgrade_required`: outside the plan's window; the message names the plan.
- 404 `not_found`: no such id.
- 429 `rate_limited` (wait for Retry-After) or `quota_exceeded` (the allowance is used up).

## A typical workflow

1. Find the race with `/v1/races?year=&q=` and take its `id`.
2. Read the stage or the whole edition with `/v1/results?race=&year=` (add `stage=` or `classification=`).
3. For a rider in the answer, use `rider.id` with `/v1/riders/{id}/results`.
4. Say the season and the race name in the answer, and that times are as recorded.
