Reference API endpoints
Static lookup data for building your own UI — players, venues, headshots, team logos and sport/league metadata.
7 of 7 endpoints · all categories · get a free API key
GET/api/v1/reference/headshotsFree tier
Static player headshot photo URLs by sport, optionally a single player by slug.
Tier detail: free — 'reference' IS in the free-tier feature set
Cache: free=86400s, api=43200s (24h/12h, longest TTLs of any v1 route — static reference data). No explicit the credit cost set in config → defaults to 1 (the standard v1 route factory default).
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| sport_key | string | Yes | – | 400 'sport_key parameter required' if missing. |
| slug | string | No | – | Single-player lookup via doc id `${sportKey}_${slug}` (bypasses limit). |
| limit | integer | No | 100 | Tier-capped: free=200, api=1000. |
| apikey / api_key | string | Yes | – | API key, alternatively via X-API-Key header. |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/reference/headshots?sport_key=aussierules_afl&apikey / api_key=value"{
"success": true,
"data": [
{
"id": "basketball_nba_jayson_tatum",
"name": "Jayson Tatum",
"slug": "jayson_tatum",
"sport_key": "basketball_nba",
"photo_url": "https://a.espncdn.com/i/headshots/nba/players/full/4066261.png"
}
],
"meta": {
"count": 1,
"tier": "free",
"limit": 200,
"requested_limit": 100,
"sport_key": "basketball_nba",
"slug": "jayson_tatum",
"timestamp": "2026-09-03T04:12:00.000Z",
"rate_limit": {
"limit": 200,
"remaining": 998,
"reset": "2026-10-01"
}
}
}GET/api/v1/reference/metadataAPI plan
Team metadata (name, league, venue, etc.) from the team metadata store collection, optionally filtered by sport.
Tier detail: api (paid) — QUIRK: despite living under /reference/, this route gates on the 'historical' feature, NOT 'reference', so it is paid-tier-only unlike its sibling reference/* endpoints
Cache: free=86400s, api=43200s. Results ordered ASC by $.name. Row shape is `r.data ?? r` — raw stored doc data passed through largely unmapped (no field renaming like other routes).
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| sport | string | No | – | Exact-match sport filter. |
| limit | integer | No | 100 | Tier-capped: free=50, api=200. |
| apikey / api_key | string | Yes | – | API key, alternatively via X-API-Key header. |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/reference/metadata?apikey / api_key=value"{
"success": true,
"data": [
{
"name": "Boston Celtics",
"sport": "basketball_nba",
"league": "NBA",
"conference": "Eastern",
"division": "Atlantic",
"venue": "TD Garden",
"city": "Boston",
"country": "USA",
"abbreviation": "BOS"
}
],
"meta": {
"count": 1,
"tier": "api",
"limit": 200,
"requested_limit": 100,
"sport": "basketball_nba",
"timestamp": "2026-09-03T04:12:00.000Z",
"rate_limit": {
"limit": 200,
"remaining": 8415,
"reset": "2026-10-01"
}
}
}GET/api/v1/reference/playersFree tier
Player metadata lookup by name and/or sport from the player metadata store collection.
Cache: free=86400s, api=43200s. Ordered DESC by $.fetchedAt (most recently updated first). Row shape passthrough (`r.data ?? r`).
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| name | string | No | – | Exact-match player name filter. |
| sport | string | No | – | Exact-match sport filter. |
| limit | integer | No | 100 | Tier-capped: free=50, api=200. |
| apikey / api_key | string | Yes | – | API key, alternatively via X-API-Key header. |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/reference/players?apikey / api_key=value"{
"success": true,
"data": [
{
"name": "Jayson Tatum",
"sport": "basketball_nba",
"team": "Boston Celtics",
"position": "SF",
"jersey_number": 0,
"height": "6'8\"",
"weight": "210 lbs",
"birth_date": "1998-03-03",
"fetchedAt": "2026-09-01T10:00:00.000Z"
}
],
"meta": {
"count": 1,
"tier": "free",
"limit": 50,
"requested_limit": 100,
"name": "Jayson Tatum",
"sport": "basketball_nba",
"timestamp": "2026-09-03T04:12:00.000Z",
"rate_limit": {
"limit": 50,
"remaining": 997,
"reset": "2026-10-01"
}
}
}GET/api/v1/reference/team-logosFree tier
Static team logo URLs and name aliases by sport, backfilled from the team metadata store when the primary logo source is sparse.
Cache: free=86400s, api=43200s. When primary team-logo store rows < limit, best-effort fills gaps from the team metadata store (logoUrl/badgeUrl fields), deduping by team name; fallback failures are swallowed silently. No explicit the credit cost → defaults to 1.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| sport_key | string | Yes | – | 400 'sport_key parameter required' if missing. |
| limit | integer | No | 100 | Tier-capped: free=200, api=1000. |
| apikey / api_key | string | Yes | – | API key, alternatively via X-API-Key header. |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/reference/team-logos?sport_key=aussierules_afl&apikey / api_key=value"{
"success": true,
"data": [
{
"id": "basketball_nba_boston-celtics",
"names": [
"Boston Celtics",
"Celtics",
"BOS"
],
"logo": "https://a.espncdn.com/i/teamlogos/nba/500/bos.png",
"sport_key": "basketball_nba",
"external_id": null
},
{
"id": "basketball_nba_golden-state-warriors",
"names": [
"Golden State Warriors"
],
"logo": "https://a.espncdn.com/i/teamlogos/nba/500/gs.png",
"sport_key": "basketball_nba",
"external_id": null,
"source": "team_metadata"
}
],
"meta": {
"count": 2,
"tier": "free",
"limit": 200,
"requested_limit": 100,
"sport_key": "basketball_nba",
"timestamp": "2026-09-03T04:12:00.000Z",
"rate_limit": {
"limit": 200,
"remaining": 996,
"reset": "2026-10-01"
}
}
}GET/api/v1/reference/venuesFree tier
Venue metadata (location, capacity, surface, etc.) lookup by name and/or sport.
Cache: free=86400s, api=43200s. Ordered DESC by $.fetchedAt. Row shape passthrough (`r.data ?? r`).
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| name | string | No | – | Exact-match venue name filter. |
| sport | string | No | – | Exact-match sport filter. |
| limit | integer | No | 100 | Tier-capped: free=50, api=200. |
| apikey / api_key | string | Yes | – | API key, alternatively via X-API-Key header. |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/reference/venues?apikey / api_key=value"{
"success": true,
"data": [
{
"name": "Marvel Stadium",
"sport": "australianfootball_afl",
"city": "Melbourne",
"state": "VIC",
"country": "Australia",
"capacity": 53359,
"surface": "grass",
"roof": "retractable",
"fetchedAt": "2026-08-15T06:00:00.000Z"
}
],
"meta": {
"count": 1,
"tier": "free",
"limit": 50,
"requested_limit": 100,
"name": "Marvel Stadium",
"sport": "australianfootball_afl",
"timestamp": "2026-09-03T04:12:00.000Z",
"rate_limit": {
"limit": 50,
"remaining": 995,
"reset": "2026-10-01"
}
}
}GET/api/v1/teamsFree tier
Teams seen for one sport, with how many matches each has appeared in - a listing, not a squad list.
Rows are sorted by `match_count` descending, so the first rows are the busiest teams in the sport rather than an alphabetical or fixture-ordered list. `team_id` is a string and can be null when neither a roster row nor a match row carried an id (`team_name` is then the only key). `player_count` is 0 on every row returned for `basketball_nba` - it is only populated where squad data exists, so read it as 'players we hold', not 'squad size', and expect 0 across a whole sport. This route takes **no `limit`**: `limit=3` and `limit=5000` both return all 30 rows and neither errors. A sport with no stored teams is a 200 with `count: 0` rather than a 404, and that empty call is not charged (`x-credits-cost: 0`) while a populated one is charged 1 credit. `meta.filter.sport` is the *normalised* key, so compare it against what you sent before assuming your alias was ignored. Cached 3600 s. The example below is the live, unmodified response to `?sport=basketball_nba`; it names no data source.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| X-API-Key | string | Yes | – | API key. |
| sport_key | string | Yes | – | Sport key, e.g. `basketball_nba`. Required: omitting both this and `sport` is a 400 (`sport_key is required`). Common aliases are accepted and normalised, and the normalised key is echoed back in `meta.filter.sport`. |
| sport | string | No | – | Alias for `sport_key`; only read when `sport_key` is absent. |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/teams?X-API-Key=value&sport_key=aussierules_afl"{
"success": true,
"data": [
{
"team_name": "San Antonio Spurs",
"team_id": "24",
"player_count": 0,
"match_count": 106
},
{
"team_name": "New York Knicks",
"team_id": "18",
"player_count": 0,
"match_count": 102
},
{
"team_name": "Cleveland Cavaliers",
"team_id": "5",
"player_count": 0,
"match_count": 100
},
{
"team_name": "Oklahoma City Thunder",
"team_id": "25",
"player_count": 0,
"match_count": 97
},
{
"team_name": "Detroit Pistons",
"team_id": "8",
"player_count": 0,
"match_count": 96
},
{
"team_name": "Minnesota Timberwolves",
"team_id": "16",
"player_count": 0,
"match_count": 95
},
{
"team_name": "Philadelphia 76ers",
"team_id": "20",
"player_count": 0,
"match_count": 93
},
{
"team_name": "Los Angeles Lakers",
"team_id": "13",
"player_count": 0,
"match_count": 92
},
{
"team_name": "Denver Nuggets",
"team_id": "7",
"player_count": 0,
"match_count": 89
},
{
"team_name": "Boston Celtics",
"team_id": "2",
"player_count": 0,
"match_count": 89
},
{
"team_name": "Toronto Raptors",
"team_id": "28",
"player_count": 0,
"match_count": 89
},
{
"team_name": "Orlando Magic",
"team_id": "19",
"player_count": 0,
"match_count": 89
},
{
"team_name": "Atlanta Hawks",
"team_id": "1",
"player_count": 0,
"match_count": 88
},
{
"team_name": "Houston Rockets",
"team_id": "10",
"player_count": 0,
"match_count": 88
},
{
"team_name": "Portland Trail Blazers",
"team_id": "22",
"player_count": 0,
"match_count": 87
},
{
"team_name": "Phoenix Suns",
"team_id": "21",
"player_count": 0,
"match_count": 86
},
{
"team_name": "Miami Heat",
"team_id": "14",
"player_count": 0,
"match_count": 83
},
{
"team_name": "Chicago Bulls",
"team_id": "4",
"player_count": 0,
"match_count": 83
},
{
"team_name": "Dallas Mavericks",
"team_id": "6",
"player_count": 0,
"match_count": 83
},
{
"team_name": "Memphis Grizzlies",
"team_id": "29",
"player_count": 0,
"match_count": 83
},
{
"team_name": "Milwaukee Bucks",
"team_id": "15",
"player_count": 0,
"match_count": 83
},
{
"team_name": "Golden State Warriors",
"team_id": "9",
"player_count": 0,
"match_count": 83
},
{
"team_name": "Brooklyn Nets",
"team_id": "17",
"player_count": 0,
"match_count": 82
},
{
"team_name": "Indiana Pacers",
"team_id": "11",
"player_count": 0,
"match_count": 82
},
{
"team_name": "Charlotte Hornets",
"team_id": "30",
"player_count": 0,
"match_count": 82
},
{
"team_name": "Sacramento Kings",
"team_id": "23",
"player_count": 0,
"match_count": 82
},
{
"team_name": "New Orleans Pelicans",
"team_id": "3",
"player_count": 0,
"match_count": 82
},
{
"team_name": "LA Clippers",
"team_id": "12",
"player_count": 0,
"match_count": 82
},
{
"team_name": "Utah Jazz",
"team_id": "26",
"player_count": 0,
"match_count": 82
},
{
"team_name": "Washington Wizards",
"team_id": "27",
"player_count": 0,
"match_count": 82
}
],
"meta": {
"count": 30,
"tier": "api",
"license": "krokodds-derived",
"filter": {
"sport": "basketball_nba"
},
"timestamp": "2026-10-22T06:13:03.958Z"
}
}GET/api/v1/rosterFree tier
Team roster/squad data from the roster store table. Currently supports AFL teams; extensible to all sports.
Reads from the roster store table (the primary store). team_id and sport are server-side filters; team name is a post-filter. Sorted by jersey number ascending. Cached 86400s (24h).
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| team_id | number | No | – | SofaScore team ID (e.g. 4452 for Fremantle). |
| team | string | No | – | Team name filter (partial match, case-insensitive). |
| sport | string | No | – | Sport_key filter (e.g. "aussierules_afl"). |
| limit | number | No | 100 | Max rows, clamped 1-500 (MAX_LIMIT). |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/roster?team_id=abc123"{
"success": true,
"data": [
{
"sport_key": "aussierules_afl",
"team_id": 4452,
"team_name": "Fremantle",
"season_id": null,
"player_id": "p001",
"player_name": "Andrew Brayshaw",
"position": "Midfielder",
"jersey_number": 8,
"nationality": "AUS",
"age": 25,
"updated_at": "2026-09-01T00:00:00.000Z"
}
],
"meta": {
"count": 1,
"tier": "free",
"license": "krokodds-derived",
"sport": "aussierules_afl"
}
}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.
Cricket, cycling, esports, Formula 1, golf, MMA, boxing, NFL and soccer coverage beyond the AU staples.
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.