Krok Odds

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).

Query parameters
NameTypeRequiredDefaultDescription
X-API-KeystringYes–API key.
race_idstringNo–Exact race id; does a direct single-document lookup, ignoring season/since/limit.
seasonintegerNo–Season year, e.g. 2026.
sincestring (ISO date)No–Only races updated on/after this date. Clamped to the key's historical-window entitlement.
limitintegerNo50Max rows. Capped at 50 (free) / 2000 (api).
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/f1/races?X-API-Key=value"
Example response
{
  "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.

Query parameters
NameTypeRequiredDefaultDescription
X-API-KeystringYes–API key.
seasonintegerNo–Season year. Returns 400 if non-numeric.
roundintegerNo–Race round number within the season. Returns 400 if non-numeric. Filtered in-memory after an over-fetch.
limitintegerNo100Max rows. Capped at 100 (free) / 500 (api).
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/f1/results?X-API-Key=value"
Example response
{
  "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.

Query parameters
NameTypeRequiredDefaultDescription
X-API-KeystringYes–API key.
seasonintegerYes–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`.
typestringNoboth typesRestrict 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.
limitintegerNo30Row 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.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/f1/standings-v2?X-API-Key=value&season=10"
Example response
{
  "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.

Query parameters
NameTypeRequiredDefaultDescription
X-API-KeystringYes–API key.
seasonintegerYes–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.
roundintegerNo–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.
driverintegerNo–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`).
typestringNolapsOne 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.
limitintegerNo100Rows 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`.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/f1/telemetry?X-API-Key=value&season=10"
Example response
{
  "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

Gameday8 endpoints

Per-event head-to-head odds, alternate lines, best prices across books, player props, live state and AI-generated summaries.

Opportunities7 endpoints

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.

Racing23 endpoints

The full Australian racing stack — thoroughbred, harness and greyhound. Meetings and runner fields, form, sectionals, ratings, market movers, exchange arbs, tote pools and results.

Odds Feed16 endpoints

Raw per-bookmaker prices as scraped, before any analysis layer. `/scraped-odds/*` paths are aliases of the equivalent `/odds-feed/*` route.

Sports8 endpoints

Sport reference data, team form guides, league standings, injury reports and weather-impact analysis.

Tips & Predictions4 endpoints

AI-generated betting tips with confidence scores and historical accuracy tracking.

Insights1 endpoint

Ranked leaderboards built on top of the stat feeds — per-sport player leaders for a chosen stat, season and view.

Tennis5 endpoints

ATP/WTA rankings, upcoming fixtures, match results, Elo ratings and surface-specific stats.

Historical7 endpoints

Deep archives — player and team game logs, shot charts, AFL/NRL historical data. Paid API plan only.

Reference7 endpoints

Static lookup data for building your own UI — players, venues, headshots, team logos and sport/league metadata.

Infrastructure15 endpoints

Account and billing endpoints, bulk export, SSE streaming, webhook management and API health.

Additional Data19 endpoints

Odds history, steam-move detection, player prop stats/results, injuries, weather and other supporting feeds.

Prediction Markets3 endpoints

Polymarket and Kalshi sentiment plus a universal prediction-market catalogue and resolutions feed.