Krok Odds

Gameday API endpoints

Per-event head-to-head odds, alternate lines, best prices across books, player props, live state and AI-generated summaries.

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

GET/api/v1/gameday/alt-linesFree tier

Alternate-line (non-standard spread/total) odds for events, best price per line plus the full raw line list.

No the credit cost concept in this route — auth is monthly-usage based (meta.rate_limit), not per-request credits. event_id does a direct the primary store doc lookup instead of a query. No results returns data: [] (HTTP 200), not 404. Response cached via unstable_cache 150s (free) / 60s (api). CORS open (Access-Control-Allow-Origin: *).

Query parameters
NameTypeRequiredDefaultDescription
sport_keystringNo–Filter by sport key (also accepts `sport`), e.g. `basketball_nba`. Lowercased.
sportstringNo–Alias for sport_key.
event_idstringNo–Return alt-lines for a single event only (direct doc lookup).
marketstringNo–Filter lines/best-by-line to a single market key, e.g. `spreads`. Lowercased.
limitnumberNo50Max events returned. Clamped to 50 (free) / 2000 (api).
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/gameday/alt-lines?sport_key=aussierules_afl"
Example response
{
  "success": true,
  "data": [
    {
      "event_id": "basketball_nba_20260903_lal_bos",
      "sport_key": "basketball_nba",
      "sport_title": "NBA",
      "home_team": "Boston Celtics",
      "away_team": "Los Angeles Lakers",
      "commence_time": "2026-09-03T23:10:00Z",
      "best_by_line": [
        {
          "key": "spreads|-4.5",
          "market_key": "spreads",
          "selection": "Boston Celtics -4.5",
          "point": -4.5,
          "bookmaker": "sportsbet",
          "odds": 1.9,
          "bet_link": "https://www.sportsbet.com.au/..."
        }
      ],
      "all_lines": [
        {
          "market_key": "spreads",
          "selection": "Boston Celtics -4.5",
          "point": -4.5,
          "bookmaker": "ladbrokes",
          "odds": 1.87,
          "bet_link": "https://www.ladbrokes.com.au/..."
        }
      ],
      "line_count": 12,
      "updated_at": "2026-09-03T10:05:00Z"
    }
  ],
  "meta": {
    "count": 1,
    "tier": "free",
    "limit": 50,
    "requested_limit": 50,
    "sport_key": "basketball_nba",
    "event_id": null,
    "market": null,
    "timestamp": "2026-09-03T10:06:00Z",
    "rate_limit": {
      "limit": 50,
      "remaining": 940,
      "reset": "2026-10-01T00:00:00Z"
    }
  }
}
GET/api/v1/gameday/best-pricesFree tier

Best available price per market/selection per event, aggregated across bookmakers.

Cache 120s (free) / 60s (api) — tighter than most gameday routes since best prices move fastest. `bookmaker_count` reflects how many books were quoting that exact price, not total books on the market.

Query parameters
NameTypeRequiredDefaultDescription
sport_keystringNo–Filter by sport key (also accepts `sport`).
sportstringNo–Alias for sport_key.
event_idstringNo–Filter to a single event via query (not a direct doc get, unlike alt-lines).
marketstringNo–Filter the prices array to a single market. Lowercased.
limitnumberNo50Max events returned. Clamped to 50 (free) / 2000 (api).
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/gameday/best-prices?sport_key=aussierules_afl"
Example response
{
  "success": true,
  "data": [
    {
      "id": "basketball_nba_20260903_lal_bos",
      "event_id": "basketball_nba_20260903_lal_bos",
      "sport_key": "basketball_nba",
      "home_team": "Boston Celtics",
      "away_team": "Los Angeles Lakers",
      "commence_time": "2026-09-03T23:10:00Z",
      "prices": [
        {
          "market": "h2h",
          "selection": "Boston Celtics",
          "point": null,
          "price": 1.65,
          "bookmaker": "sportsbet",
          "bookmaker_title": "Sportsbet",
          "bookmaker_count": 9,
          "bet_link": "https://www.sportsbet.com.au/..."
        }
      ],
      "updated_at": "2026-09-03T10:04:30Z"
    }
  ],
  "meta": {
    "count": 1,
    "tier": "free",
    "limit": 50,
    "requested_limit": 50,
    "markets_filter": null,
    "timestamp": "2026-09-03T10:06:00Z",
    "rate_limit": {
      "limit": 50,
      "remaining": 940,
      "reset": "2026-10-01T00:00:00Z"
    }
  }
}
GET/api/v1/gameday/event/{id}Free tier

Bundled single-event fetch — pulls summary, h2h, best_prices, alt_lines, odds_history, live and props in one call, selectable via `parts`.

400 error if sport_key is missing while parts includes h2h or live. Each requested part is read via Promise.allSettled: a part whose read THREW is named in `meta.failed_sources` with `degraded: true` (the parts that did read are still served), and when every requested part failed the answer is **503** + `Retry-After: 30` + `Cache-Control: no-store` — never a 200 full of nulls. A part that read fine but has no stored doc is a genuine `null` and is not flagged. `parts` output shapes vary per sub-collection (not normalized to a common schema) — summary/h2h/best_prices/alt_lines/odds_history/live are single objects (or null), props is an array.

Path parameters
NameTypeRequiredDefaultDescription
idstringYes–Gameday event id (path segment), e.g. `basketball_nba_20260903_lal_bos`.
Query parameters
NameTypeRequiredDefaultDescription
sport_keystringNo–Required only if `parts` includes h2h or live (they key off `${sportKey}_${eventId}`); also accepts `sport`.
sportstringNo–Alias for sport_key.
partsstring (comma-separated enum)Noall of: summary,h2h,best_prices,alt_lines,props,odds_history,liveComma-separated subset of parts to fetch; invalid values are silently dropped.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/gameday/event/abc123?sport_key=aussierules_afl"
Example response
{
  "success": true,
  "data": {
    "event_id": "basketball_nba_20260903_lal_bos",
    "sport_key": "basketball_nba",
    "summary": {
      "headline": "Celtics look to cover at home against shorthanded Lakers",
      "summary": "Boston is 8-2 ATS in its last 10 home games...",
      "key_storylines": [
        "Lakers missing starting PG",
        "Celtics on a 5-game win streak"
      ],
      "generated_at": "2026-09-03T08:00:00Z"
    },
    "h2h": {
      "summary": {
        "total_meetings": 12,
        "home_wins": 7,
        "away_wins": 5
      },
      "last_meetings": [
        {
          "date": "2026-02-14",
          "home_team": "Boston Celtics",
          "away_team": "Los Angeles Lakers",
          "home_score": 118,
          "away_score": 109
        }
      ]
    },
    "best_prices": {
      "id": "basketball_nba_20260903_lal_bos",
      "prices": []
    },
    "alt_lines": {
      "bestByLine": {},
      "allLines": []
    },
    "odds_history": null,
    "live": null,
    "props": [
      {
        "id": "prop123",
        "playerName": "Jayson Tatum",
        "marketKey": "player_points",
        "line": 27.5,
        "odds": 1.9,
        "bookmaker": "sportsbet",
        "bet_link": "https://..."
      }
    ]
  },
  "meta": {
    "tier": "free",
    "parts": [
      "summary",
      "h2h",
      "best_prices",
      "alt_lines",
      "props",
      "odds_history",
      "live"
    ],
    "event_id": "basketball_nba_20260903_lal_bos",
    "sport_key": "basketball_nba",
    "timestamp": "2026-09-03T10:06:00Z",
    "rate_limit": {
      "limit": 50,
      "remaining": 940,
      "reset": "2026-10-01T00:00:00Z"
    }
  }
}
GET/api/v1/gameday/h2hFree tier

Head-to-head historical matchup summaries and recent meeting results between the two teams in an event.

`team` filter is applied client-side after fetching up to limit*2 rows from the primary store, then sliced to `limit` — so a narrow team filter combined with a high limit can under-return relative to what actually exists. Draws is always 0 for sports without draws.

Query parameters
NameTypeRequiredDefaultDescription
sport_keystringNo–Filter by sport key (also accepts `sport`).
sportstringNo–Alias for sport_key.
event_idstringNo–Filter to a single event.
teamstringNo–Substring match (case-insensitive) against either home_team or away_team.
limitnumberNo50Max rows returned. Clamped to 50 (free) / 2000 (api).
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/gameday/h2h?sport_key=aussierules_afl"
Example response
{
  "success": true,
  "data": [
    {
      "id": "basketball_nba_20260903_lal_bos",
      "event_id": "basketball_nba_20260903_lal_bos",
      "sport_key": "basketball_nba",
      "sport_title": "NBA",
      "home_team": "Boston Celtics",
      "away_team": "Los Angeles Lakers",
      "commence_time": "2026-09-03T23:10:00Z",
      "summary": {
        "total_meetings": 12,
        "home_wins": 7,
        "away_wins": 5,
        "draws": 0,
        "home_win_pct": 58.3,
        "away_win_pct": 41.7
      },
      "last_meetings": [
        {
          "date": "2026-02-14",
          "home_team": "Boston Celtics",
          "away_team": "Los Angeles Lakers",
          "home_score": 118,
          "away_score": 109,
          "venue": "TD Garden"
        }
      ],
      "updated_at": "2026-09-03T09:00:00Z"
    }
  ],
  "meta": {
    "count": 1,
    "tier": "free",
    "limit": 50,
    "requested_limit": 50,
    "timestamp": "2026-09-03T10:06:00Z",
    "rate_limit": {
      "limit": 50,
      "remaining": 940,
      "reset": "2026-10-01T00:00:00Z"
    }
  }
}
GET/api/v1/gameday/liveFree tier

Live/in-progress and recently-finished game states — scores, status (pre/live/final), completion flag.

Shortest cache window of the gameday group: 60s both tiers, reflecting the need for near-real-time scores. Ordered commence_time descending (most recently started first) unlike other gameday routes which order ascending.

Query parameters
NameTypeRequiredDefaultDescription
sport_keystringNo–Filter by sport key (also accepts `sport`).
sportstringNo–Alias for sport_key.
event_idstringNo–Filter to a single event.
statusenum(pre|live|final)No–Filter to a specific game status; other values are ignored (no filter applied).
limitnumberNo50Max rows returned. Clamped to 50 (free) / 2000 (api).
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/gameday/live?sport_key=aussierules_afl"
Example response
{
  "success": true,
  "data": [
    {
      "event_id": "basketball_nba_20260903_lal_bos",
      "sport_key": "basketball_nba",
      "home_team": "Boston Celtics",
      "away_team": "Los Angeles Lakers",
      "commence_time": "2026-09-03T23:10:00Z",
      "home_score": 54,
      "away_score": 49,
      "completed": false,
      "status": "live",
      "last_update": "2026-09-03T23:45:12Z",
      "updated_at": "2026-09-03T23:45:12Z"
    }
  ],
  "meta": {
    "count": 1,
    "tier": "free",
    "limit": 50,
    "requested_limit": 50,
    "sport_key": "basketball_nba",
    "event_id": null,
    "status": "live",
    "timestamp": "2026-09-03T23:45:20Z",
    "rate_limit": {
      "limit": 50,
      "remaining": 940,
      "reset": "2026-10-01T00:00:00Z"
    }
  }
}
GET/api/v1/gameday/propsFree tier

Player prop best-odds, aggregated across bookmakers and grouped by event; underlying storage is one row per (bookmaker, market, outcome) quote.

`limit` counts events, but rows are per-prop-quote, so the route over-fetches up to limit*40 (max 2000) prop rows to try to cover ~limit events after grouping — high-volume slates can still under-return events. Each prop is a best-odds aggregate across books (bet_link points to the best-odds book only, other books in book_count have no exposed URL). Cache floor enforced at >=60s regardless of declared tier value.

Query parameters
NameTypeRequiredDefaultDescription
sport_keystringNo–Filter by sport key (also accepts `sport`).
sportstringNo–Alias for sport_key.
event_idstringNo–Filter to a single event.
marketstringNo–Filter to a single prop market key, e.g. `player_points`. Lowercased.
player_slugstringNo–Filter to a single player by slugified name (lowercase, hyphenated).
limitnumberNo50Max EVENTS returned (not prop rows). Clamped to 50 (free) / 2000 (api).
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/gameday/props?sport_key=aussierules_afl"
Example response
{
  "success": true,
  "data": [
    {
      "event_id": "basketball_nba_20260903_lal_bos",
      "sport_key": "basketball_nba",
      "sport_title": "NBA",
      "home_team": "Boston Celtics",
      "away_team": "Los Angeles Lakers",
      "commence_time": "2026-09-03T23:10:00Z",
      "props": [
        {
          "market_key": "player_points",
          "player_name": "Jayson Tatum",
          "player_slug": "jayson-tatum",
          "line": 27.5,
          "side": "over",
          "best_odds": 1.95,
          "best_bookmaker": "sportsbet",
          "book_count": 6,
          "bet_link": "https://www.sportsbet.com.au/..."
        }
      ],
      "prop_count": 1,
      "updated_at": "2026-09-03T10:00:00Z"
    }
  ],
  "meta": {
    "count": 1,
    "tier": "free",
    "limit": 50,
    "requested_limit": 50,
    "sport_key": "basketball_nba",
    "event_id": null,
    "market": null,
    "player_slug": null,
    "timestamp": "2026-09-03T10:06:00Z",
    "rate_limit": {
      "limit": 50,
      "remaining": 940,
      "reset": "2026-10-01T00:00:00Z"
    }
  }
}
GET/api/v1/gameday/summariesFree tier

AI-generated pre-game summaries/headlines/storylines and best-market snapshot per event.

Longest cache window of the gameday group: 300s free / 120s api (summaries change slowly, tied to the engineering notes secondary-store read-cost 600s-window rule for gameday-data.ts). event_id does a direct doc get; otherwise a sport-filtered query ordered by commence_time ascending.

Query parameters
NameTypeRequiredDefaultDescription
sport_keystringNo–Filter by sport key (also accepts `sport`).
sportstringNo–Alias for sport_key.
event_idstringNo–Direct doc lookup for a single event's summary.
limitnumberNo50Max rows returned. Clamped to 50 (free) / 2000 (api).
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/gameday/summaries?sport_key=aussierules_afl"
Example response
{
  "success": true,
  "data": [
    {
      "event_id": "basketball_nba_20260903_lal_bos",
      "sport_key": "basketball_nba",
      "sport_title": "NBA",
      "home_team": "Boston Celtics",
      "away_team": "Los Angeles Lakers",
      "commence_time": "2026-09-03T23:10:00Z",
      "summary": "Boston enters as 4.5-point favorites off a five-game win streak...",
      "headline": "Celtics eye sixth straight win as Lakers battle injuries",
      "key_storylines": [
        "Lakers PG questionable",
        "Celtics 8-2 ATS at home"
      ],
      "best_h2h": {
        "selection": "Boston Celtics",
        "odds": 1.65,
        "bookmaker": "sportsbet"
      },
      "best_spread": {
        "selection": "Boston Celtics -4.5",
        "odds": 1.9,
        "bookmaker": "ladbrokes"
      },
      "best_total": {
        "selection": "Over 224.5",
        "odds": 1.87,
        "bookmaker": "sportsbet"
      },
      "generated_at": "2026-09-03T08:00:00Z",
      "updated_at": "2026-09-03T08:00:00Z"
    }
  ],
  "meta": {
    "count": 1,
    "tier": "free",
    "limit": 50,
    "requested_limit": 50,
    "sport_key": "basketball_nba",
    "event_id": null,
    "timestamp": "2026-09-03T10:06:00Z",
    "rate_limit": {
      "limit": 50,
      "remaining": 940,
      "reset": "2026-10-01T00:00:00Z"
    }
  }
}
GET/api/v1/lineupsFree tier

Named team lineups for upcoming fixtures \u2014 the confirmed squad each club names ahead of game day.

Reads from team lineup tables. Post-filters by date/team/round/confirmed since the primary store read returns all rows. Sorted by date descending. Cached 300s. Degraded-not-empty: a lineup table whose read fails is named in `meta.failed_sources` with `meta.degraded: true` (the healthy tables are still served), and if every requested table fails the route answers 503 + `Retry-After` with `Cache-Control: private, no-store` rather than an empty 200. A degraded read is never written to the response cache, so it cannot outlive the outage.

Query parameters
NameTypeRequiredDefaultDescription
sportstringNo–Filter by sport_key ("aussierules_afl" or "rugbyleague_nrl"). Omit to return both.
datestringNo–Filter by match date (YYYY-MM-DD, exact match).
teamstringNo–Filter by team name (partial match, case-insensitive).
roundnumberNo–Round number (integer).
confirmedstringNo–"true" or "false" to filter by confirmation status.
limitnumberNo100Max results, clamped 1-200 (MAX_LIMIT).
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/lineups?sport=aussierules_afl"
Example response
{
  "success": true,
  "data": [
    {
      "id": "lineup_afl_20260906_abc",
      "gameId": "afl_20260906_abc",
      "date": "2026-09-06",
      "sportKey": "aussierules_afl",
      "homeTeamName": "Collingwood",
      "awayTeamName": "Carlton",
      "home": {
        "players": [
          {
            "playerId": "p001",
            "playerName": "Nick Daicos",
            "position": "Midfielder",
            "order": 1
          }
        ],
        "formation": null
      },
      "away": {
        "players": [
          {
            "playerId": "p002",
            "playerName": "Patrick Cripps",
            "position": "Midfielder",
            "order": 1
          }
        ],
        "formation": null
      },
      "venue": "MCG",
      "venueCity": "Melbourne",
      "roundNumber": 23,
      "confirmed": true,
      "_fetchedAt": "2026-09-05T10:00:00Z"
    }
  ],
  "meta": {
    "count": 1,
    "tier": "free",
    "license": "krokodds-derived",
    "filter": {
      "sport": "aussierules_afl",
      "date": null,
      "team": null,
      "round": null,
      "confirmed": null
    },
    "sport_breakdown": {
      "aussierules_afl": 1
    },
    "note": "Named team lineups for upcoming fixtures."
  }
}

Other categories

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.

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.