Krok Odds

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.

Query parameters
NameTypeRequiredDefaultDescription
sport_keystringNo–Filter by sport key (lowercased), e.g. "aussierules_afl".
teamstringNo–Case-insensitive substring match on team name.
limitintegerNo100Max rows returned. Capped at 100 on free tier, 5000 on api tier.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/injuries?sport_key=aussierules_afl"
Example response
{
  "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.

Query parameters
NameTypeRequiredDefaultDescription
sport_keystringNo–Matched via an OR filter across sport_key / data->>sportKey / data->>sport_key to cover inconsistent writer casing.
sincestring (ISO date)No–Clamped by clampHistoricalFrom(); filters commence_time >= since.
limitintegerNo100Capped at 100 on free tier, 5000 on api tier.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/results?sport_key=aussierules_afl"
Example response
{
  "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.

Query parameters
NameTypeRequiredDefaultDescription
sport_keystringNo–If set, does a direct single-doc lookup instead of a scan.
groupstringNo–Case-insensitive exact match on group, post-filtered in memory.
activebooleanNofalse"true" restricts the scan to active=true rows.
limitintegerNo100Capped at 100 on free tier, 5000 on api tier.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/sport-activity?sport_key=aussierules_afl"
Example response
{
  "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).

Query parameters
NameTypeRequiredDefaultDescription
sport_keystringNo–
slugstringNo–Exact match.
namestringNo–Case-insensitive substring match on fullName, post-filtered in memory.
limitintegerNo100Capped at 100 on free tier, 5000 on api tier.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/teams/canonical?sport_key=aussierules_afl"
Example response
{
  "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.

Query parameters
NameTypeRequiredDefaultDescription
race_typestringNo–Must be T (thoroughbred), H (harness) or G (greyhound); other values ignored.
venuestringNo–Case-insensitive substring match.
statestringNo–Exact match, uppercased, e.g. NSW/VIC/QLD.
datestring (YYYY-MM-DD)No–Exact match; also checked against the key's historicalDays window — 403 if too far in the past.
limitintegerNo50Capped at 50 on free tier, 1000 on api tier.
fieldsstring (comma-separated)No–Field-projection allowlist parsed via parseFields()/projectRows() to trim the response shape.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/weather?race_type=value"
Example response
{
  "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.

Query parameters
NameTypeRequiredDefaultDescription
sportstringNo–Filter by sport_key (e.g. "americanfootball_nfl").
datestringNo–Filter by match date (YYYY-MM-DD, starts-with match).
teamstringNo–Filter by team name (partial match, case-insensitive).
season_yearnumberNo–Filter by season year (integer, e.g. 2026).
weeknumberNo–Filter by week/round number.
completedstringNo–"true" or "false" to filter by completion status.
limitnumberNo100Max results, clamped 1-500 (MAX_LIMIT).
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/match-schedule?sport=aussierules_afl"
Example response
{
  "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.

Query parameters
NameTypeRequiredDefaultDescription
X-API-KeystringYes–API key.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/data/freshness?X-API-Key=value"
Example response
{
  "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

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.

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.

Prediction Markets3 endpoints

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