Public API
Free public F1 API.
Twenty-five years of Formula 1 data. JSON. CORS-enabled. No key required. Standings, race results, qualifying, pit stops, circuits — 2001 to present.
Quick start
Hit the health endpoint to verify it is up and get the full endpoint list:
curl https://sarmalinux.com/api/v1/f1/health
{
"ok": true,
"build": "2026-05-03",
"source": "sarmalinux.com/f1",
"version": "v1",
"coverage": "2001–current",
"endpoints": [
"GET /api/v1/f1/health",
"GET /api/v1/f1/next-race",
"GET /api/v1/f1/season/{year}/standings",
"...11 more"
]
}Response envelope
Every response wraps its payload in a consistent envelope:
{
"data": { ... }, // the actual payload
"meta": {
"generated_at": "2026-05-03T12:00:00.000Z",
"season": "2026", // present on season-scoped endpoints
"source": "sarmalinux.com/f1",
"version": "v1"
}
}Errors return { "error": "...", "meta": { ... } } with an appropriate HTTP status code (400, 404, or 502).
Code examples
curl
curl https://sarmalinux.com/api/v1/f1/season/current/standings
JavaScript (browser or Node)
const res = await fetch('https://sarmalinux.com/api/v1/f1/season/current/standings')
const { data, meta } = await res.json()
data.forEach(driver => {
console.log(`${driver.position}. ${driver.name} — ${driver.points} pts`)
})
// meta.generated_at, meta.season, meta.sourcePython (requests)
import requests
r = requests.get('https://sarmalinux.com/api/v1/f1/season/current/standings')
payload = r.json()
for driver in payload['data']:
print(f"{driver['position']}. {driver['name']} — {driver['points']} pts")Endpoint reference
/api/v1/f1/healthAPI status, version, coverage, and full endpoint list.
Example
curl https://sarmalinux.com/api/v1/f1/health
Sample response — truncated, see live endpoint for full shape
{
"ok": true,
"build": "2026-05-03",
"source": "sarmalinux.com/f1",
"version": "v1",
"coverage": "2001–current",
"endpoints": ["GET /api/v1/f1/health", "..."]
}/api/v1/f1/next-raceNext scheduled race with countdown in milliseconds and race-day weather forecast.
Example
curl https://sarmalinux.com/api/v1/f1/next-race
Sample response — truncated, see live endpoint for full shape
{
"data": {
"round": 9,
"name": "Canadian Grand Prix",
"date": "2026-06-14",
"time": "18:00:00Z",
"countdownMs": 3240000,
"circuit": "Circuit Gilles Villeneuve",
"country": "Canada",
"weather": { "tempMaxC": 22, "precipMm": 0.4, "raceTimePrecipPct": 15 }
},
"meta": { "generated_at": "...", "source": "sarmalinux.com/f1", "version": "v1" }
}/api/v1/f1/season/{year}/standingsDriver championship standings for any season from 2001 to current. Use "current" for the live season.
Parameters
yearSeason year (2001–current) or "current"Example
curl https://sarmalinux.com/api/v1/f1/season/current/standings
Sample response — truncated, see live endpoint for full shape
{
"data": [
{ "position": 1, "driverId": "verstappen", "name": "Max Verstappen",
"code": "VER", "nationality": "Dutch", "team": "Red Bull",
"points": 220, "wins": 9 },
...
],
"meta": { "generated_at": "...", "season": "2026", "source": "sarmalinux.com/f1", "version": "v1" }
}/api/v1/f1/season/{year}/constructorsConstructor championship standings for any season.
Parameters
yearSeason year or "current"Example
curl https://sarmalinux.com/api/v1/f1/season/current/constructors
Sample response — truncated, see live endpoint for full shape
{
"data": [
{ "position": 1, "constructorId": "red_bull", "name": "Red Bull",
"nationality": "Austrian", "points": 380, "wins": 11 },
...
],
"meta": { "generated_at": "...", "season": "2026", "source": "sarmalinux.com/f1", "version": "v1" }
}/api/v1/f1/season/{year}/resultsEvery race result summary (winner, pole, fastest lap) for the season. One object per round.
Parameters
yearSeason year or "current"Example
curl https://sarmalinux.com/api/v1/f1/season/2024/results
Sample response — truncated, see live endpoint for full shape
{
"data": [
{ "round": 1, "name": "Bahrain Grand Prix", "date": "2024-03-02",
"circuit": "Bahrain International Circuit", "country": "Bahrain",
"winner": { "driverId": "verstappen", "name": "Max Verstappen", "team": "Red Bull" },
"pole": { ... }, "fastestLap": { ... }, "finishers": 19 },
...
]
}/api/v1/f1/season/{year}/round/{round}Full detail for a single race: results, qualifying times, pit stops per driver. Use "last" for the most recent race.
Parameters
yearSeason year or "current"roundRound number or "last"Example
curl "https://sarmalinux.com/api/v1/f1/season/current/round/last"
Sample response — truncated, see live endpoint for full shape
{
"data": {
"season": "2026", "round": 8, "name": "Monaco Grand Prix",
"circuit": { "name": "Circuit de Monaco", "country": "Monaco" },
"results": [
{ "position": 1, "name": "Charles Leclerc", "team": "Ferrari",
"grid": 1, "laps": 78, "time": "1:48:12.345",
"qualifying": { "position": 1, "q1": "1:10.2", "q2": "1:09.8", "q3": "1:09.1" },
"pitStops": [{ "stop": 1, "lap": 35, "duration": "2.4", "durationMs": 2400 }]
}, ...
],
"hasQualifying": true, "hasPitStops": true
}
}/api/v1/f1/season/{year}/scheduleFull season calendar with circuit coordinates, session times, countdown per round, and upcoming flag.
Parameters
yearSeason year or "current"Example
curl https://sarmalinux.com/api/v1/f1/season/current/schedule
Sample response — truncated, see live endpoint for full shape
{
"data": [
{ "round": 1, "name": "Australian Grand Prix", "date": "2026-03-15",
"circuitId": "albert_park", "country": "Australia",
"lat": -37.8497, "long": 144.9680,
"isUpcoming": false, "countdownMs": 0 },
...
]
}/api/v1/f1/drivers/{driverId}Full career profile for a driver: all-time stats, season-by-season breakdown, win list, championship years.
Parameters
driverIdDriver slug, e.g. hamilton, verstappen, alonsoExample
curl https://sarmalinux.com/api/v1/f1/drivers/hamilton
Sample response — truncated, see live endpoint for full shape
{
"data": {
"driverId": "hamilton", "name": "Lewis Hamilton", "nationality": "British",
"totalRaces": 332, "totalWins": 103, "totalPodiums": 197,
"totalPoints": 4639.5, "totalPoles": 104, "totalFastestLaps": 67,
"championships": 7, "championshipYears": [2008,2014,2015,2017,2018,2019,2020],
"seasonStats": [ { "season": 2007, "races": 17, "wins": 4, ... }, ... ],
"wins": [ ... ]
}
}/api/v1/f1/constructors/{constructorId}Full career profile for a constructor: season stats, championship years, top circuits, all drivers fielded.
Parameters
constructorIdConstructor slug, e.g. ferrari, mercedes, red_bullExample
curl https://sarmalinux.com/api/v1/f1/constructors/ferrari
Sample response — truncated, see live endpoint for full shape
{
"data": {
"constructorId": "ferrari", "name": "Ferrari",
"totalRaces": 1089, "totalWins": 243,
"championships": 16, "championshipYears": [2000,2001,...],
"seasonStats": [ ... ],
"topCircuits": [ { "name": "Italian Grand Prix", "wins": 19 }, ... ]
}
}/api/v1/f1/circuits/{circuitId}25-year historical record for a circuit: race-by-race results, lap record evolution, DNF rate, grid P1 win rate.
Parameters
circuitIdCircuit slug, e.g. silverstone, monza, monacoExample
curl https://sarmalinux.com/api/v1/f1/circuits/silverstone
Sample response — truncated, see live endpoint for full shape
{
"data": {
"circuitId": "silverstone", "totalRaces": 25,
"avgDNFRate": 12, "grid1WinRate": 44,
"topTeams": [ { "team": "Mercedes", "wins": 8 }, ... ],
"lapRecordEvolution": [ { "season": 2019, "poleSec": 82.1, "poleTime": "1:22.134" }, ... ],
"races": [ ... ]
}
}/api/v1/f1/all-time/drivers25-year aggregate leaderboard: championships, race wins, seasons active, total points. All drivers who scored in 2001–2025.
Example
curl https://sarmalinux.com/api/v1/f1/all-time/drivers
Sample response — truncated, see live endpoint for full shape
{
"data": [
{ "driverId": "schumacher", "name": "Michael Schumacher",
"championships": 5, "raceWins": 91, "seasons": 11, "totalPoints": 1566 },
...
],
"meta": { "season": "2001-2025", ... }
}/api/v1/f1/all-time/constructors25-year constructor aggregate plus era breakdown (V10/V8, KERS, Hybrid, Ground effect) showing which team dominated each era.
Example
curl https://sarmalinux.com/api/v1/f1/all-time/constructors
Sample response — truncated, see live endpoint for full shape
{
"data": {
"overall": [ { "constructorId": "ferrari", "championships": 16, ... }, ... ],
"eras": [
{ "era": "hybrid", "label": "Hybrid V6 era", "yearRange": "2014-2021",
"titles": { "Mercedes": 8 } },
...
]
}
}/api/v1/f1/poll/{season}/{round}Aggregated anonymous poll results for a race — winner, pole, safety car, and top-3 DNF predictions. Updates as votes come in.
Parameters
seasonSeason year (e.g. 2026)roundRound number (1–23)Example
curl https://sarmalinux.com/api/v1/f1/poll/2026/8
Sample response — truncated, see live endpoint for full shape
{
"data": {
"season": 2026,
"round": 8,
"total_voters": 143,
"questions": [
{
"question": "winner",
"total": 143,
"breakdown": [
{ "answer": "Max Verstappen", "votes": 61, "pct": 43 },
{ "answer": "Lando Norris", "votes": 38, "pct": 27 },
...
]
},
{ "question": "pole", ... },
{ "question": "safety_car", "total": 143, "breakdown": [{ "answer": "Yes", "votes": 92, "pct": 64 }, ...] },
{ "question": "top3_dnf", "total": 143, "breakdown": [{ "answer": "No", "votes": 88, "pct": 62 }, ...] }
]
},
"meta": { "generated_at": "...", "season": "2026", "round": "8", "source": "sarmalinux.com/f1", "version": "v1" }
}/api/v1/f1/poll/{season}/{round}/insightAI-generated analysis of the poll consensus for a race — circuit history, championship context, and where the crowd is likely right or wrong.
Parameters
seasonSeason yearroundRound numberExample
curl https://sarmalinux.com/api/v1/f1/poll/2026/8/insight
Sample response — truncated, see live endpoint for full shape
{
"data": {
"insight": "Verstappen holds five wins at this circuit since...",
"season": 2026,
"round": 8,
"race": "Monaco Grand Prix",
"total_voters": 143,
"generated_at": "2026-05-22T09:14:00Z"
},
"meta": { "source": "sarmalinux.com/f1", "version": "v1", ... }
}Caching
| Type | Endpoints | Cache-Control |
|---|---|---|
| live | standings, results, schedule, round, next-race | public, s-maxage=1800, stale-while-revalidate=3600 |
| historical | drivers, constructors, circuits, all-time | public, s-maxage=86400, stale-while-revalidate=86400 |
| poll | poll/{season}/{round} | public, s-maxage=60, stale-while-revalidate=300 |
| poll-insight | poll/{season}/{round}/insight | public, s-maxage=1800, stale-while-revalidate=3600 |
Rate limits
There is no hard rate limit enforced by the API. Most responses are cached at the edge, so repeated calls within the cache window are served instantly without hitting upstream. Be reasonable — if you need higher throughput or a dedicated tier for a production product, get in touch.