Krok Odds

Historical API endpoints

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

7 of 7 endpoints · all categories · get a free API key

GET/api/v1/historical/aflAPI plan

AFL historical archive — player game logs (2010+) or match results (2018+ via Akareen, pre-2018 via AFL Tables backfill).

Tier detail: api (paid) — 'historical' is NOT in the free-tier feature set

Cache: free=3600s, api=1800s. kind=match with year<2018 silently swaps collection to the historical matches collection (identically shaped). Uses shared the standard v1 route factory wrapper (historical-window clamp on since/from, empty-result credit refund, 200 + `data: []` on empty).

Query parameters
NameTypeRequiredDefaultDescription
kindstringNoplayer'player' or 'match'. 400 if any other value.
yearintegerNo–Season year filter. Values <2018 with kind=match route to the AFL Tables backfill collection instead of Akareen.
roundstringNo–Round filter, only applied when kind=player (post-fetch filter, over-fetches limit*4 rows).
limitintegerNo100Row cap. Tier-capped: free=100, api=500.
apikey / api_keystringYes–API key, alternatively via X-API-Key header.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/historical/afl?apikey / api_key=value"
Example response
{
  "success": true,
  "data": [
    {
      "id": "afl_2026_r22_j_daicos_collingwood",
      "player": "Josh Daicos",
      "team": "Collingwood",
      "year": "2026",
      "round": "22",
      "disposals": 28,
      "goals": 1,
      "kicks": 19,
      "handballs": 9,
      "marks": 6,
      "tackles": 4,
      "fixtureId": 923841
    }
  ],
  "meta": {
    "count": 1,
    "tier": "api",
    "limit": 500,
    "requested_limit": 100,
    "kind": "player",
    "year": 2026,
    "round": "22",
    "timestamp": "2026-09-03T04:12:00.000Z",
    "rate_limit": {
      "limit": 500,
      "remaining": 8421,
      "reset": "2026-10-01"
    }
  }
}
GET/api/v1/historical/nrlAPI plan

NRL historical archive — player/match data from 2010 onwards.

Tier detail: api (paid)

Cache: free=3600s, api=1800s. Three distinct underlying the primary store collections keyed off 'kind', each with its own season field name (competitionYear vs season).

Query parameters
NameTypeRequiredDefaultDescription
kindstringNomodern'player' (2010-2023 archive), 'match' (2010-2023 archive), or 'modern' (2024+ current data). 400 on any other value.
season / yearintegerNo–Season filter; 'season' checked first, falls back to 'year'.
limitintegerNo100Tier-capped: free=100, api=500.
apikey / api_keystringYes–API key, alternatively via X-API-Key header.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/historical/nrl?apikey / api_key=value"
Example response
{
  "success": true,
  "data": [
    {
      "id": "nrl_2026_r24_n_hynes_sharks",
      "player": "Nicho Hynes",
      "team": "Cronulla Sharks",
      "season": "2026",
      "tries": 1,
      "tackles": 22,
      "runMetres": 118,
      "tackleBreaks": 3,
      "fixtureId": 448120
    }
  ],
  "meta": {
    "count": 1,
    "tier": "api",
    "limit": 500,
    "requested_limit": 100,
    "kind": "modern",
    "season": 2026,
    "timestamp": "2026-09-03T04:12:00.000Z",
    "rate_limit": {
      "limit": 500,
      "remaining": 8420,
      "reset": "2026-10-01"
    }
  }
}
GET/api/v1/historical/player-game-logAPI plan

Full accumulated game-by-game history for a player+stat combo (not a fixed recent-form window — depth varies per player).

Tier detail: api (paid)

Does NOT use the standard v1 route factory — hand-rolled handler, no explicit the credit cost field/mechanism (unlike the shared wrapper's credit-cost headers). recentGames written append-only via a server-side array append so a doc holds FULL history, not a 15-game window; history_from/history_to expose real span. Cache: free=300s, api=120s. Over-fetches limit*4 (capped 2000) then filters player/team in memory.

Query parameters
NameTypeRequiredDefaultDescription
sport_key / sportstringYes–e.g. basketball_nba, americanfootball_nfl. 400 if missing.
playerstringNo–Case-insensitive substring match, filtered post-fetch.
teamstringNo–Case-insensitive substring match, filtered post-fetch.
stat_key / statstringNo–Exact-match stat key filter (e.g. 'points', 'disposals').
sincestring (YYYY-MM-DD)No–Filters recentGames[] to dates >= since. Malformed values ignored. Clamped forward by clampHistoricalFrom() to the key's historicalDays window.
limitintegerNo100Tier-capped: free=50, api=2000.
apikey / api_keystringYes–API key, alternatively via X-API-Key header.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/historical/player-game-log?sport_key / sport=aussierules_afl&apikey / api_key=value"
Example response
{
  "success": true,
  "data": [
    {
      "id": "basketball_nba__nikola_jokic__points",
      "sport_key": "basketball_nba",
      "player": "Nikola Jokic",
      "team": "Denver Nuggets",
      "stat_key": "points",
      "games_count": 3,
      "history_to": "2026-04-12",
      "history_from": "2025-10-22",
      "recent_games": [
        {
          "date": "2026-04-12",
          "opponent": "Los Angeles Lakers",
          "is_home": true,
          "stat_value": 31,
          "fixture_id": 501233
        },
        {
          "date": "2026-04-09",
          "opponent": "Phoenix Suns",
          "is_home": false,
          "stat_value": 27,
          "fixture_id": 501198
        },
        {
          "date": "2026-04-06",
          "opponent": "Golden State Warriors",
          "is_home": true,
          "stat_value": 24,
          "fixture_id": 501167
        }
      ],
      "updated_at": "2026-04-13T02:11:04.000Z"
    }
  ],
  "meta": {
    "count": 1,
    "tier": "api",
    "limit": 2000,
    "requested_limit": 100,
    "sport_key": "basketball_nba",
    "stat_key": "points",
    "since": "2025-10-22",
    "timestamp": "2026-09-03T04:12:00.000Z",
    "rate_limit": {
      "limit": 200,
      "remaining": 8419,
      "reset": "2026-10-01"
    }
  }
}
GET/api/v1/historical/player-statsAPI plan

Season averages, splits, and market lines for a player from the historical player-stats archive; single-slug lookup or sport-wide/team-filtered listing.

Tier detail: api (paid)

Cache: free=3600s, api=1800s. Has BOTH the primary-store loader and the cold-archive loader (cold-archive fallback only fires if the cold-archive flag and the primary store throws). Slug lookup bypasses the limit param entirely.

Query parameters
NameTypeRequiredDefaultDescription
sport_key / sportstringYes–400 'sport_key parameter required' if missing.
slugstringNo–Canonical player slug. If present, does a direct id lookup on `${sportKey}__${slug}` (limit ignored, returns 0 or 1 row).
teamstringNo–Case-insensitive exact match on team, filtered post-fetch (only applies when slug absent).
limitintegerNo100Tier-capped: free=100, api=500.
apikey / api_keystringYes–API key, alternatively via X-API-Key header.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/historical/player-stats?sport_key / sport=aussierules_afl&apikey / api_key=value"
Example response
{
  "success": true,
  "data": [
    {
      "id": "basketball_nba__jayson_tatum",
      "name": "Jayson Tatum",
      "slug": "jayson_tatum",
      "sport_key": "basketball_nba",
      "team": "Boston Celtics",
      "position": "SF",
      "active": true,
      "coverage": {
        "seasons": [
          "2023",
          "2024",
          "2025",
          "2026"
        ]
      },
      "season_averages": {
        "points": 26.8,
        "rebounds": 8.1,
        "assists": 4.6
      },
      "splits": {
        "home": {
          "points": 27.9
        },
        "away": {
          "points": 25.7
        }
      },
      "market_lines": {
        "points": 26.5,
        "rebounds": 8
      },
      "updated_at": "2026-09-02T22:04:11.000Z"
    }
  ],
  "meta": {
    "count": 1,
    "tier": "api",
    "limit": 500,
    "requested_limit": 100,
    "sport_key": "basketball_nba",
    "slug": "jayson_tatum",
    "timestamp": "2026-09-03T04:12:00.000Z",
    "rate_limit": {
      "limit": 500,
      "remaining": 8418,
      "reset": "2026-10-01"
    }
  }
}
GET/api/v1/historical/shot-chartAPI plan

NBA shot chart — half-court shot coordinates for a player, optionally filtered to one season.

Tier detail: api (paid)

Cache: free=3600s, api=1800s. One doc per (season, player) in the shot-chart store; data.shots is the shot-point array. NBA-only (Wave 3 feature).

Query parameters
NameTypeRequiredDefaultDescription
slug / playerstringYes–Canonical player slug (spaces normalized to underscores, lowercased). 400 'slug is required' if missing.
seasonstringNo–Exact-match season filter, applied in-memory over an over-fetched (limit*4) window.
limitintegerNo100Tier-capped: free=20, api=60 (much lower cap than other historical routes).
apikey / api_keystringYes–API key, alternatively via X-API-Key header.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/historical/shot-chart?slug / player=lebron-james&apikey / api_key=value"
Example response
{
  "success": true,
  "data": [
    {
      "id": "2026__nikola_jokic",
      "playerSlug": "nikola_jokic",
      "season": "2026",
      "team": "Denver Nuggets",
      "shots": [
        {
          "x": 12.4,
          "y": 8.1,
          "made": true,
          "value": 2,
          "distance_ft": 14,
          "date": "2026-04-12"
        },
        {
          "x": -21,
          "y": 22.6,
          "made": false,
          "value": 3,
          "distance_ft": 27,
          "date": "2026-04-12"
        }
      ],
      "updated_at": "2026-04-13T01:50:00.000Z"
    }
  ],
  "meta": {
    "count": 1,
    "tier": "api",
    "limit": 60,
    "requested_limit": 100,
    "slug": "nikola_jokic",
    "season": "2026",
    "timestamp": "2026-09-03T04:12:00.000Z",
    "rate_limit": {
      "limit": 60,
      "remaining": 8417,
      "reset": "2026-10-01"
    }
  }
}
GET/api/v1/historical/team-game-logAPI plan

Historical team-level game results (scores, periods, status) with date-range filtering.

Tier detail: api (paid)

Does NOT use the standard v1 route factory (hand-rolled handler, mirrors historical/player-game-log structure) — no explicit per-request the credit cost field. Cache: free=300s, api=120s. Ordered DESC by date server-side (unlike most sibling historical routes which have no explicit order).

Query parameters
NameTypeRequiredDefaultDescription
sport_key / sportstringYes–400 if missing.
teamstringNo–Case-insensitive substring match against home OR away team, filtered post-fetch.
sincestring (YYYY-MM-DD)No–Range start. Clamped forward by clampHistoricalFrom() to the key's historicalDays window; malformed values ignored.
untilstring (YYYY-MM-DD)No–Range end, validated YYYY-MM-DD only (not clamped).
limitintegerNo100Tier-capped: free=100, api=5000 (highest cap of all historical routes).
apikey / api_keystringYes–API key, alternatively via X-API-Key header.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/historical/team-game-log?sport_key / sport=aussierules_afl&apikey / api_key=value"
Example response
{
  "success": true,
  "data": [
    {
      "id": "americanfootball_nfl_2026_wk1_kc_bal",
      "sport_key": "americanfootball_nfl",
      "fixture_id": 700421,
      "date": "2026-09-05",
      "home_team": "Baltimore Ravens",
      "away_team": "Kansas City Chiefs",
      "home_score": 24,
      "away_score": 27,
      "periods": {
        "q1": 7,
        "q2": 3,
        "q3": 7,
        "q4": 7
      },
      "league": "NFL",
      "league_id": 1,
      "country": "USA",
      "status": "final",
      "updated_at": "2026-09-06T03:10:00.000Z"
    }
  ],
  "meta": {
    "count": 1,
    "tier": "api",
    "limit": 5000,
    "requested_limit": 100,
    "sport_key": "americanfootball_nfl",
    "since": "2025-09-01",
    "until": null,
    "timestamp": "2026-09-03T04:12:00.000Z",
    "rate_limit": {
      "limit": 500,
      "remaining": 8416,
      "reset": "2026-10-01"
    }
  }
}
GET/api/v1/historical/linesAPI plan

Historical opening and closing lines for one sport — either the market-average/consensus series (open/min/max/close per market, one row per match) or our own per-bookmaker AU archive.

Tier detail: api (paid)

Two series behind one path, selected by `series`, both requiring `sport_key`. `market_consensus` (default) is match-grain with a `markets[]` array carrying the open/close/min/max quartet per market (`h2h`, `line`, `totals`; the handicap and total markets also carry `line_open`/`line_close`/`line_min`/`line_max`), plus `bookmakers_surveyed`; `meta.sport` is a display label (`NRL`) and `meta.current_through` is the coverage edge measured **before** any season/team filter (`2026-10-04` for `rugbyleague_nrl`), so an empty page with a recent edge means the filter matched nothing rather than that nothing is held. `au_books` is our own per-bookmaker archive, match-grain with a nested `books[]` → `markets[]` block (`open`, `close`, `captures`, `open_at`, `close_at`) — note `meta.sport` there is the raw `sport_key`, not a label. `au_books` rows are not all head-to-head fixtures: futures/outright markets appear with empty `home_team`/`away_team` and a `season` ahead of the current year (`rugbyleague_nrl` returns a `2027-05-26` outright), so read `season` as the competition season the market belongs to, not as ‘this was played’. `truncated` here is a real ‘more rows exist’ flag (the loader fetches one row past the limit), not a length test: `limit=1` on a 3,634-row competition is `count: 1, truncated: true`, while the fully-consumed `season=2025` page is `count: 213, truncated: false`. `rows_scanned` tells you how much was read before filtering. An empty result is a **200** with `data: []`, `truncated: false` and `x-credits-cost: 0` — it is refunded rather than billed. A rejected request still bills: a 400 (`?sport_key=nope_bad_key`) moved `/me/usage` by 1 credit and carried **no** `x-credits-cost` header, so watch the usage total rather than the error. A read that fails behind the route answers **503** with `Retry-After: 30` and `meta.failed_sources` instead of an empty page. `Cache-Control: private, no-store` with `X-Cache-Age` 1800 on the `api` tier (3600 on `free`); the credit and rate-limit headers are present on 200s. The example is the live, unmodified response to `?sport_key=rugbyleague_nrl&limit=1`; it names no data source.

Query parameters
NameTypeRequiredDefaultDescription
X-API-KeystringYes–API key.
sport_keystringYes–Sport key, lowercased before matching. Required: missing is a 400 (`sport_key is required`). On the default `market_consensus` series it must be one of seven — `aussierules_afl`, `rugbyleague_nrl`, `americanfootball_nfl`, `basketball_nbl`, `cricket_big_bash`, `soccer_australia_aleague`, `rugbyunion_super_rugby` — and anything else is a 400 that echoes the whole list. The `au_books` series is wider: it only shape-checks the key (`^[a-z0-9_]{3,64}$`), so `soccer_epl` and `basketball_nba` return data and an unknown key returns an empty 200 rather than a 400.
seriesstringNomarket_consensus`market_consensus` (default) or `au_books`. Anything else is a 400 (`series must be one of: market_consensus, au_books`).
seasonstringNo–Four-digit year, filtered in memory after the fetch. Anything else is a 400 (`season must be a four-digit year`). Unlike some routes in the family this filter really does narrow the page: `rugbyleague_nrl` with `limit=500` returns 500 rows (`truncated: true`) unfiltered but 213 (`truncated: false`) for `season=2025`.
teamstringNo–Case-insensitive substring match against the home or away team name. A value that matches nothing is an empty 200, not an error.
limitintegerNo100Rows returned. Defaults to 100, capped per tier (100 on `free`, 500 on `api`); `limit=99999` answers `meta.limit: 500` with `meta.requested_limit: 99999`.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/historical/lines?X-API-Key=value&sport_key=aussierules_afl"
Example response
{
  "success": true,
  "data": [
    {
      "sport_key": "rugbyleague_nrl",
      "season": 2026,
      "match_date": "2026-10-04",
      "home_team": "Sydney Roosters",
      "away_team": "Newcastle Knights",
      "venue": "Accor Stadium",
      "bookmakers_surveyed": 13,
      "markets": [
        {
          "market": "h2h",
          "outcome": "home",
          "open": 1.44,
          "close": 1.42,
          "min": 1.42,
          "max": 1.45
        },
        {
          "market": "h2h",
          "outcome": "away",
          "open": 2.85,
          "close": 3,
          "min": 2.8,
          "max": 3
        },
        {
          "market": "line",
          "outcome": "home",
          "line_open": -7.5,
          "line_close": -7.5,
          "line_min": -7.5,
          "line_max": -7.5,
          "open": 1.9,
          "close": 1.85,
          "min": 1.85,
          "max": 1.85
        },
        {
          "market": "line",
          "outcome": "away",
          "line_open": 7.5,
          "line_close": 7.5,
          "line_min": 7.5,
          "line_max": 7.5,
          "open": 1.9,
          "close": 1.95,
          "min": 1.95,
          "max": 1.95
        },
        {
          "market": "totals",
          "outcome": "over",
          "line_open": 41.5,
          "line_close": 43.5,
          "line_min": 41.5,
          "line_max": 43.5,
          "open": 1.85,
          "close": 1.9,
          "min": 1.85,
          "max": 1.9
        },
        {
          "market": "totals",
          "outcome": "under",
          "line_open": 41.5,
          "line_close": 43.5,
          "line_min": 41.5,
          "line_max": 43.5,
          "open": 2.22,
          "close": 2.15,
          "min": 2.22,
          "max": 2.15
        }
      ]
    }
  ],
  "meta": {
    "count": 1,
    "truncated": true,
    "tier": "api",
    "limit": 1,
    "requested_limit": 1,
    "sport_key": "rugbyleague_nrl",
    "sport": "NRL",
    "series": "market_consensus",
    "series_label": "market average / consensus open and close",
    "season": null,
    "team": null,
    "current_through": "2026-10-04",
    "markets": [
      "h2h",
      "line",
      "totals"
    ],
    "rows_scanned": 3634,
    "timestamp": "2026-10-22T07:32:01.732Z",
    "rate_limit": {
      "limit": 500,
      "remaining": 438687,
      "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.

Reference7 endpoints

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

Other Sports22 endpoints

Cricket, cycling, esports, Formula 1, golf, MMA, boxing, NFL and soccer coverage beyond the AU staples.

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.