Krok Odds

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

Query parameters
NameTypeRequiredDefaultDescription
sport_keystringYes–400 'sport_key parameter required' if missing.
slugstringNo–Single-player lookup via doc id `${sportKey}_${slug}` (bypasses limit).
limitintegerNo100Tier-capped: free=200, api=1000.
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/reference/headshots?sport_key=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",
      "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).

Query parameters
NameTypeRequiredDefaultDescription
sportstringNo–Exact-match sport filter.
limitintegerNo100Tier-capped: free=50, api=200.
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/reference/metadata?apikey / api_key=value"
Example response
{
  "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`).

Query parameters
NameTypeRequiredDefaultDescription
namestringNo–Exact-match player name filter.
sportstringNo–Exact-match sport filter.
limitintegerNo100Tier-capped: free=50, api=200.
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/reference/players?apikey / api_key=value"
Example response
{
  "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.

Query parameters
NameTypeRequiredDefaultDescription
sport_keystringYes–400 'sport_key parameter required' if missing.
limitintegerNo100Tier-capped: free=200, api=1000.
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/reference/team-logos?sport_key=aussierules_afl&apikey / api_key=value"
Example response
{
  "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`).

Query parameters
NameTypeRequiredDefaultDescription
namestringNo–Exact-match venue name filter.
sportstringNo–Exact-match sport filter.
limitintegerNo100Tier-capped: free=50, api=200.
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/reference/venues?apikey / api_key=value"
Example response
{
  "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.

Query parameters
NameTypeRequiredDefaultDescription
X-API-KeystringYes–API key.
sport_keystringYes–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`.
sportstringNo–Alias for `sport_key`; only read when `sport_key` is absent.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/teams?X-API-Key=value&sport_key=aussierules_afl"
Example response
{
  "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).

Query parameters
NameTypeRequiredDefaultDescription
team_idnumberNo–SofaScore team ID (e.g. 4452 for Fremantle).
teamstringNo–Team name filter (partial match, case-insensitive).
sportstringNo–Sport_key filter (e.g. "aussierules_afl").
limitnumberNo100Max rows, clamped 1-500 (MAX_LIMIT).
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/roster?team_id=abc123"
Example response
{
  "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

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.

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.