Additional Data API endpoints
Odds history, steam-move detection, player prop stats/results, injuries, weather and other supporting feeds.
7 of 19 endpoints · all categories · get a free API key
GET/api/v1/injuriesFree tier
Latest injury reports across sports/racing, filterable by sport and team. Reads from the injury store.
NOT an alias of /api/v1/sports/injuries. Both read the same injury store table, but sports/injuries adds status severity classification (out/doubtful/questionable/probable), body_part, and a cross-sport the sport breakdown summary in meta — its doc comment explicitly says it 'extends' this racing/general-purpose endpoint with multi-sport coverage. Treat as two distinct, overlapping endpoints, not a redirect/alias pair. Response cached 300s free / 120s api via unstable_cache.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| sport_key | string | No | – | Filter by sport key (lowercased), e.g. "aussierules_afl". |
| team | string | No | – | Case-insensitive substring match on team name. |
| limit | integer | No | 100 | Max rows returned. Capped at 100 on free tier, 5000 on api tier. |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/injuries?sport_key=aussierules_afl"{
"success": true,
"data": [
{
"id": "afl_2026_c-daniel-rioli",
"sport_key": "aussierules_afl",
"player_name": "Daniel Rioli",
"player_slug": "daniel-rioli",
"team": "Richmond",
"status": "Out",
"reason": "Hamstring strain",
"date": "2026-09-01",
"season": 2026,
"source": "official-team-report",
"updated_at": "2026-09-02T21:14:00.000Z"
}
],
"meta": {
"count": 1,
"tier": "free",
"limit": 100,
"requested_limit": 100,
"timestamp": "2026-09-03T04:00:00.000Z",
"rate_limit": {
"limit": 100,
"remaining": 998,
"reset": "2026-10-01T00:00:00.000Z"
}
}
}GET/api/v1/resultsAPI plan
Completed game results (scores, winner) from cold-storage archive.
Archive tier (the credit cost=5, comment: 'archive endpoint (game results / cold storage)'). Empty results are refunded in full via refundApiKeyCredits and logged as HTTP-status 204 in the internal request log (though the actual response status returned is still 200). Rows with an empty resolved sport_key are silently dropped — flagged in-code as an upstream data-quality issue.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| sport_key | string | No | – | Matched via an OR filter across sport_key / data->>sportKey / data->>sport_key to cover inconsistent writer casing. |
| since | string (ISO date) | No | – | Clamped by clampHistoricalFrom(); filters commence_time >= since. |
| limit | integer | No | 100 | Capped at 100 on free tier, 5000 on api tier. |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/results?sport_key=aussierules_afl"{
"success": true,
"data": [
{
"id": "b7c3d9",
"game_id": "b7c3d9",
"sport_key": "basketball_nba",
"home_team": "Boston Celtics",
"away_team": "Denver Nuggets",
"home_score": 112,
"away_score": 104,
"winner": "home",
"commence_time": "2026-09-02T00:10:00Z",
"completed": true,
"completed_at": "2026-09-02T02:45:00Z",
"resolved": true,
"settled_at": "2026-09-02T02:50:00.000Z",
"resolution_source": "krok-odds",
"ingested_at": "2026-09-02T02:46:00.000Z",
"first_published_at": "2026-09-02T02:46:00.000Z",
"status": "final"
}
],
"meta": {
"count": 1,
"tier": "api",
"limit": 100,
"requested_limit": 100,
"since": null,
"timestamp": "2026-09-03T04:00:00.000Z",
"rate_limit": {
"limit": 500,
"remaining": 4995,
"reset": "2026-10-01T00:00:00.000Z"
}
}
}GET/api/v1/sport-activityFree tier
Reference list of active/inactive sport keys and groupings (which sports currently have live coverage).
No tierAllowsFeature() call in this route at all — any valid API key on any tier can hit it, it's not gated behind a a feature flag. Reads the primary store the sport-activity store. Response uses `private, max-age` Cache-Control (not the 'no-store' pattern most other v1 routes use) with an explicit comment warning against ever making this response public/CDN-cached since it's auth-gated per key.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| sport_key | string | No | – | If set, does a direct single-doc lookup instead of a scan. |
| group | string | No | – | Case-insensitive exact match on group, post-filtered in memory. |
| active | boolean | No | false | "true" restricts the scan to active=true rows. |
| limit | integer | No | 100 | Capped at 100 on free tier, 5000 on api tier. |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/sport-activity?sport_key=aussierules_afl"{
"success": true,
"data": [
{
"key": "aussierules_afl",
"group": "Australian Rules",
"title": "AFL",
"description": "Australian Football League",
"active": true,
"has_outrights": true,
"updated_at": "2026-09-03T01:00:00.000Z"
}
],
"meta": {
"count": 1,
"tier": "free",
"limit": 100,
"requested_limit": 100,
"sport_key": null,
"group": null,
"active": null,
"timestamp": "2026-09-03T04:00:00.000Z",
"rate_limit": {
"limit": 100,
"remaining": 999,
"reset": "2026-10-01T00:00:00.000Z"
}
}
}GET/api/v1/teams/canonicalFree tier
Canonical team id/slug/full-name mapping used to join team names across bookmaker feeds.
No tierAllowsFeature() gate in this route — reachable by any valid key/tier. Reads the primary store the canonical team store. the upstream id is only populated when the doc id does NOT contain '__' (ids containing '__' are treated as composite/internal, not an external system id).
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| sport_key | string | No | – | |
| slug | string | No | – | Exact match. |
| name | string | No | – | Case-insensitive substring match on fullName, post-filtered in memory. |
| limit | integer | No | 100 | Capped at 100 on free tier, 5000 on api tier. |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/teams/canonical?sport_key=aussierules_afl"{
"success": true,
"data": [
{
"id": "afl__brisbane-lions",
"sport_key": "aussierules_afl",
"external_id": null,
"participant_id": "afl__brisbane-lions",
"full_name": "Brisbane Lions",
"slug": "brisbane-lions",
"updated_at": "2026-08-20T00:00:00.000Z"
}
],
"meta": {
"count": 1,
"tier": "free",
"limit": 100,
"requested_limit": 100,
"sport_key": null,
"slug": null,
"name_contains": null,
"timestamp": "2026-09-03T04:00:00.000Z",
"rate_limit": {
"limit": 100,
"remaining": 999,
"reset": "2026-10-01T00:00:00.000Z"
}
}
}GET/api/v1/weatherFree tier
Raw observed + forecast weather for upcoming AU/NZ racing meetings.
NOT an alias of /api/v1/sports/weather-impact. This route only returns raw observed/forecast weather embedded on the meetings store/{id} docs (public weather feeds via the weather sync), racing-only, per its own file-header comment. /api/v1/sports/weather-impact is a separate, cross-sport route that additionally reads the forecast store, adds heuristic impact_tags/impact_notes (high_wind, heavy_rain, extreme_heat, cold_conditions, high_humidity, storm_risk), and covers AFL/NRL/NFL/MLB/EPL/NCAAF venues too, not just racing. Also uses the secondary store as a fallback path if the primary store read fails or the primary-store flag is false \u2014 the only one of these 13 routes with a live secondary fallback.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| race_type | string | No | – | Must be T (thoroughbred), H (harness) or G (greyhound); other values ignored. |
| venue | string | No | – | Case-insensitive substring match. |
| state | string | No | – | Exact match, uppercased, e.g. NSW/VIC/QLD. |
| date | string (YYYY-MM-DD) | No | – | Exact match; also checked against the key's historicalDays window — 403 if too far in the past. |
| limit | integer | No | 50 | Capped at 50 on free tier, 1000 on api tier. |
| fields | string (comma-separated) | No | – | Field-projection allowlist parsed via parseFields()/projectRows() to trim the response shape. |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/weather?race_type=value"{
"success": true,
"data": [
{
"id": "randwick-2026-09-06",
"venue": "Royal Randwick",
"state": "NSW",
"race_type": "T",
"date": "2026-09-06",
"track_hint": "Good 4",
"weather_updated_at": "2026-09-03T01:00:00.000Z",
"observed": {
"summary": "Partly cloudy",
"temp_c": 17,
"rain_24h_mm": 0,
"wind_kmh": 14,
"wind_dir": "SE",
"station": "Sydney Airport",
"observed_at": "2026-09-03T00:00:00.000Z"
},
"forecast": {
"date": "2026-09-06",
"min_c": 11,
"max_c": 19,
"precis": "Shower or two",
"rain_chance_pct": 60,
"rain_range_mm": "1-5",
"state": "NSW"
}
}
],
"meta": {
"count": 1,
"tier": "free",
"limit": 50,
"requested_limit": 50,
"timestamp": "2026-09-03T04:00:00.000Z",
"coverage_note": "Racing meetings only (AU/NZ). Stadium/event-level weather not yet ingested.",
"rate_limit": {
"limit": 50,
"remaining": 999,
"reset": "2026-10-01T00:00:00.000Z"
}
}
}GET/api/v1/match-scheduleFree tier
Season schedule / fixture list for all sports backed by the fixture store table.
Reads from the fixture store table (the primary store). Covers all sports. season_year and sport are server-side filters; date/team/week/completed are post-filters. Cached 3600s.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| sport | string | No | – | Filter by sport_key (e.g. "americanfootball_nfl"). |
| date | string | No | – | Filter by match date (YYYY-MM-DD, starts-with match). |
| team | string | No | – | Filter by team name (partial match, case-insensitive). |
| season_year | number | No | – | Filter by season year (integer, e.g. 2026). |
| week | number | No | – | Filter by week/round number. |
| completed | string | No | – | "true" or "false" to filter by completion status. |
| limit | number | No | 100 | Max results, clamped 1-500 (MAX_LIMIT). |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/match-schedule?sport=aussierules_afl"{
"success": true,
"data": [
{
"id": "sched_afl_2026_r23",
"sport_key": "aussierules_afl",
"event_id": "afl_20260906_abc",
"event_name": "Collingwood vs Carlton",
"short_name": "COL vs CAR",
"date": "2026-09-06",
"season_year": 2026,
"week": 23,
"week_text": "Round 23",
"venue": "MCG",
"venue_city": "Melbourne",
"home_team_id": "1",
"home_team_name": "Collingwood",
"home_score": null,
"away_team_id": "2",
"away_team_name": "Carlton",
"away_score": null,
"completed": false,
"status": "scheduled"
}
],
"meta": {
"count": 1,
"tier": "free",
"license": "krokodds-derived",
"filter": {
"sport": "aussierules_afl",
"date": null,
"team": null,
"season_year": null,
"week": null,
"completed": null
},
"sport_breakdown": {
"aussierules_afl": 1
}
}
}GET/api/v1/data/freshnessAPI plan
Freshness of every monitored data table — last write, age in seconds, row count, and a healthy/stale/empty/error verdict scored against that table's own staleness threshold.
Takes no query parameters — one row per monitored table, and the response is never cut. `status` is scored per table against that table's own `staleness_threshold_sec`, in the order `empty` (no rows) then `stale` (age over threshold) then `healthy`; `error` means the freshness probe itself failed for that table, not that the data is wrong. `last_updated` and `last_updated_seconds_ago` are `null` for a table that has never been written. The count behind `row_count` is a capped scan, so on a very large table it can under-report, and that cap can move a `status` without changing the response length. Bills 1 credit and caches for 60 seconds.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| X-API-Key | string | Yes | – | API key. |
curl \
-H "X-API-Key: YOUR_KEY" \
"https://krokodds.com.au/api/v1/data/freshness?X-API-Key=value"{
"success": true,
"data": [
{
"name": "arbs",
"table": "arbs",
"last_updated": "2026-10-22T03:31:40.852Z",
"last_updated_seconds_ago": 316,
"row_count": 798,
"status": "stale",
"staleness_threshold_sec": 300
}
],
"meta": {
"count": 13,
"tier": "api",
"license": "krokodds-derived",
"truncated": false,
"summary": {
"healthy": 3,
"stale": 8,
"empty": 0,
"error": 2,
"total": 13
},
"timestamp": "2026-10-22T03:36:57.310Z",
"rate_limit": {
"limit": 13,
"remaining": 439952,
"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.
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.
Polymarket and Kalshi sentiment plus a universal prediction-market catalogue and resolutions feed.