Other Sports — F1 & motorsport
The f1 & motorsport half of the Other Sports reference — every route with its parameters, credit cost and a worked example.
4 of 22 endpoints · all categories · get a free API key
GET/api/v1/f1/racesFree tier
Formula 1 race schedule/status (the motorsport feed) — season, circuit, weather, fastest lap.
Code comment flags a past bug fix: this was previously gated on 'racing' (AU racing tier) which wrongly locked F1 out; now correctly gated on 'multisport'. Distinct dataset from /api/v1/f1/results (this is the motorsport schedule, not a public F1 results feed/a public F1 results feed results).
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| X-API-Key | string | Yes | – | API key. |
| race_id | string | No | – | Exact race id; does a direct single-document lookup, ignoring season/since/limit. |
| season | integer | No | – | Season year, e.g. 2026. |
| since | string (ISO date) | No | – | Only races updated on/after this date. Clamped to the key's historical-window entitlement. |
| limit | integer | No | 50 | Max rows. Capped at 50 (free) / 2000 (api). |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/f1/races?X-API-Key=value"{
"success": true,
"data": [
{
"race_id": "f1-2026-r16-monza",
"season": 2026,
"competition": "Formula 1",
"circuit": "Autodromo Nazionale Monza",
"date": "2026-09-06T13:00:00.000Z",
"type": "Race",
"status": "Scheduled",
"laps": 53,
"distance": "306.72km",
"timezone": "Europe/Rome",
"weather": "Sunny, 26C",
"fastest_lap": null,
"updated_at": "2026-09-03T01:20:00.000Z"
}
],
"meta": {
"count": 1,
"tier": "free",
"limit": 50,
"requested_limit": 50,
"race_id": null,
"season": 2026,
"since": null,
"timestamp": "2026-09-03T04:00:00.000Z",
"rate_limit": {
"limit": 50,
"remaining": 940,
"reset": "2026-10-01T00:00:00.000Z"
}
}
}GET/api/v1/f1/resultsFree tier
Formula 1 driver race results per season/round (a public F1 results feed/a public F1 results feed feed).
Separate source/collection from /api/v1/f1/races — do not conflate the two in docs. When 'round' is passed without narrowing further, over-fetches limit*6 rows to filter client-side, so results can undercount near the tail of large seasons.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| X-API-Key | string | Yes | – | API key. |
| season | integer | No | – | Season year. Returns 400 if non-numeric. |
| round | integer | No | – | Race round number within the season. Returns 400 if non-numeric. Filtered in-memory after an over-fetch. |
| limit | integer | No | 100 | Max rows. Capped at 100 (free) / 500 (api). |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/f1/results?X-API-Key=value"{
"success": true,
"data": [
{
"season": "2026",
"round": 16,
"raceName": "Italian Grand Prix",
"driver": "Lando Norris",
"constructor": "McLaren",
"grid": 1,
"position": 1,
"points": 25,
"status": "Finished",
"fastestLapTime": "1:21.046"
}
],
"meta": {
"count": 1,
"tier": "free",
"limit": 100,
"requested_limit": 100,
"season": 2026,
"round": 16,
"timestamp": "2026-09-03T04:00:00.000Z",
"rate_limit": {
"limit": 100,
"remaining": 939,
"reset": "2026-10-01T00:00:00.000Z"
}
}
}GET/api/v1/f1/standings-v2Free tier
F1 drivers' and constructors' championship standings for one season, at the latest round held for each type.
Standings are the latest round held *per type*, and the two types can sit on different rounds (in the example the constructor rows are round 15 and the driver rows round 13) - so `round` is a per-row value and must not be grouped across types. `entity_name` names the entity: on a driver row `constructor_name` is that driver's team, while on a constructor row `constructor_name` is null and `entity_name` holds the team. `data` is the standings object for the row as a JSON **string** (pass-through, not parsed) - the flat columns on the row are the parsed form, so parse `data` before use. An unrecognised `season` is a 200 with `count: 0` rather than a 404, and that empty call is not charged (`x-credits-cost: 0`) whereas a season with rows is charged 1 credit (measured from the header). Unknown query params are ignored (measured: adding `&bogusparam=1` returns a byte-identical body), so a typo in `type` or `limit` fails silently instead of erroring. Cached 3600 s on the free tier and 1800 s on the api tier. The `-v2` suffix is historical: `/api/v1/f1/standings` without the suffix does not exist and returns 404, so there is no earlier version to fall back to. The example below is the live, unmodified response to `?season=2026&limit=3`; it names no data source.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| X-API-Key | string | Yes | – | API key. |
| season | integer | Yes | – | Championship season year, e.g. `2026`. Required: omitting it is a 400 (`season is required`) and a non-numeric value is a 400 (`season must be a number`) - neither is read as 'all seasons'. A season with no stored standings is a 200 with `count: 0`. |
| type | string | No | both types | Restrict to `driver` or `constructor`. Any other value - including an unrecognised one - is not an error: it is read as null and both types are returned. |
| limit | integer | No | 30 | Row cap per tier: 30 on the free tier, 100 on the api tier. It is applied to the position-ordered row set *before* the latest round per type is selected, so a small value can return as little as one row per type (the example's `limit=3` returns 2). `meta.limit` shows the value actually applied. |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/f1/standings-v2?X-API-Key=value&season=10"{
"success": true,
"data": [
{
"id": "constructor_2026_15_mercedes",
"standing_type": "constructor",
"season": 2026,
"round": 15,
"entity_id": "mercedes",
"entity_name": "Mercedes",
"constructor_name": null,
"position": 1,
"position_text": "1",
"points": 538,
"wins": 11,
"data": "{\"position\": \"1\", \"positionText\": \"1\", \"points\": \"538\", \"wins\": \"11\", \"Constructor\": {\"constructorId\": \"mercedes\", \"url\": \"https://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One\", \"name\": \"Mercedes\", \"nationality\": \"German\"}}",
"created_at": "2026-09-25T20:01:47.616218+00:00",
"updated_at": "2026-09-29T20:01:08.583093+00:00"
},
{
"id": "driver_2026_13_antonelli",
"standing_type": "driver",
"season": 2026,
"round": 13,
"entity_id": "antonelli",
"entity_name": "Andrea Kimi Antonelli",
"constructor_name": "Mercedes",
"position": 1,
"position_text": "1",
"points": 267,
"wins": 7,
"data": "{\"position\": \"1\", \"positionText\": \"1\", \"points\": \"267\", \"wins\": \"7\", \"Driver\": {\"driverId\": \"antonelli\", \"permanentNumber\": \"12\", \"code\": \"ANT\", \"url\": \"https://en.wikipedia.org/wiki/Andrea_Kimi_Antonelli\", \"givenName\": \"Andrea Kimi\", \"familyName\": \"Antonelli\", \"dateOfBirth\": \"2006-08-25\", \"nationality\": \"Italian\"}, \"Constructors\": [{\"constructorId\": \"mercedes\", \"url\": \"https://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One\", \"name\": \"Mercedes\", \"nationality\": \"German\"}]}",
"created_at": "2026-09-12T14:34:02.165596+00:00",
"updated_at": "2026-09-12T14:49:39.153791+00:00"
}
],
"meta": {
"count": 2,
"truncated": false,
"tier": "api",
"limit": 3,
"requested_limit": 3,
"season": 2026,
"type": null,
"timestamp": "2026-10-22T06:09:07.894Z"
}
}GET/api/v1/f1/telemetryFree tier
Formula 1 lap-by-lap telemetry — lap times, pit stops or session weather.
`season` and `round` are accepted, validated and echoed in `meta`, but they do **not** narrow the response: `?season=2023`, `2024`, `2025` and `2026` with `limit=5` all return byte-identical rows (sha256 of the `data` payload `d3421a015de49674` for every season). The rows served are simply the first rows held, and their own `data.date_start` is from 2023 — so read the payload as 'the earliest N rows we hold', not 'rows for the season you asked for'. `driver` is the one filter that works. `type=pits` currently returns `count: 0` because no pit-stop rows are held, and an empty result is not charged (`x-credits-cost: 0`) while `laps` and `weather` bill 2. A rejected request still bills: a 400 (`?season=2020`) charges 2 credits and carries **no** `x-credits-cost` header, so watch `/me/usage` totals rather than the error. `data` is a JSON **string**, not an object, and the shape inside it differs per `type` — `weather` rows carry `air_temperature`/`track_temperature`/`rainfall` and a `timestamp`, not `lap_number`, and they sit on different sessions. Responses say `Cache-Control: private, no-store` while `x-cache-age` reports 1800 s, and the credit and rate-limit headers are present on 200s. The example is the live, unmodified response to `?season=2025&limit=1`; it names no data source.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| X-API-Key | string | Yes | – | API key. |
| season | integer | Yes | – | Season year, 2023 or later. Required: omitted or blank is a 400 (`season is required`); non-numeric or below 2023 is a 400 (`season must be 2023 or later`). It is validated and echoed in `meta.season`, but it does **not** filter the rows — see the notes. |
| round | integer | No | – | Race round number. Non-numeric is a 400 (`round must be a number`). Echoed in `meta.round`; like `season`, it does not narrow the result. |
| driver | integer | No | – | Driver number, e.g. `1`. This is the only filter that actually applies — it is matched in memory against each row's `driver_number` and echoed in `meta.driver`. Non-numeric is a 400 (`driver must be a number`). |
| type | string | No | laps | One of `laps`, `pits`, `weather`; anything else is a 400 (`type must be one of: laps, pits, weather`). Each type has its own row shape and they are not interchangeable. |
| limit | integer | No | 100 | Rows returned. Defaults to 100 and is capped at 500 on the `api` tier (50 on `free`); `limit=9999` returns 500 rows with `meta.requested_limit: 9999`. |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/f1/telemetry?X-API-Key=value&season=10"{
"success": true,
"data": [
{
"id": "9106_31_1",
"session_key": 9106,
"meeting_key": 1212,
"driver_number": 31,
"driver_name": null,
"team_name": null,
"lap_number": 1,
"lap_duration": 104.989,
"sector_1_duration": 35.312,
"sector_2_duration": 30.388,
"sector_3_duration": 39.289,
"is_pit_out_lap": true,
"compounds_ternary": null,
"data": "{\"meeting_key\": 1212, \"session_key\": 9106, \"driver_number\": 31, \"lap_number\": 1, \"date_start\": \"2023-06-17T20:00:27.186000+00:00\", \"duration_sector_1\": 35.312, \"duration_sector_2\": 30.388, \"duration_sector_3\": 39.289, \"i1_speed\": 197, \"i2_speed\": 261, \"is_pit_out_lap\": true, \"lap_duration\": 104.989, \"segments_sector_1\": [2064, 2049, 2049, 2049, 2049], \"segments_sector_2\": [2049, 2049, 2049, 2049, 2049, 2049], \"segments_sector_3\": [2049, 2049, 2049, 2049, 2049, 2049], \"st_speed\": 150}",
"created_at": "2026-09-29T20:06:32.771755+00:00"
}
],
"meta": {
"count": 1,
"truncated": true,
"tier": "api",
"limit": 1,
"requested_limit": 1,
"type": "laps",
"season": 2025,
"round": null,
"driver": null,
"timestamp": "2026-10-22T06:50:46.514Z",
"rate_limit": {
"limit": 500,
"remaining": 438832,
"reset": "2026-11-01T00:00:00.000Z"
}
}
}Other categories
Per-event head-to-head odds, alternate lines, best prices across books, player props, live state and AI-generated summaries.
Krok's built-in scanners — arbitrage, positive EV, middles, low-holds, player props and same-game multi (SGM) picks, already devigged against a blended sharp baseline.
The full Australian racing stack — thoroughbred, harness and greyhound. Meetings and runner fields, form, sectionals, ratings, market movers, exchange arbs, tote pools and results.
Raw per-bookmaker prices as scraped, before any analysis layer. `/scraped-odds/*` paths are aliases of the equivalent `/odds-feed/*` route.
Sport reference data, team form guides, league standings, injury reports and weather-impact analysis.
AI-generated betting tips with confidence scores and historical accuracy tracking.
Ranked leaderboards built on top of the stat feeds — per-sport player leaders for a chosen stat, season and view.
ATP/WTA rankings, upcoming fixtures, match results, Elo ratings and surface-specific stats.
Deep archives — player and team game logs, shot charts, AFL/NRL historical data. Paid API plan only.
Static lookup data for building your own UI — players, venues, headshots, team logos and sport/league metadata.
Account and billing endpoints, bulk export, SSE streaming, webhook management and API health.
Odds history, steam-move detection, player prop stats/results, injuries, weather and other supporting feeds.
Polymarket and Kalshi sentiment plus a universal prediction-market catalogue and resolutions feed.