Krok Odds

Odds Feed API endpoints

Raw per-bookmaker prices as scraped, before any analysis layer. `/scraped-odds/*` paths are aliases of the equivalent `/odds-feed/*` route.

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

GET/api/v1/odds-feed/bookmakersFree tier

Catalogue of bookmakers KrokOdds sources directly (pure registry read, no DB hit).

Zero-cost registry read — no database hit. Cache 300s. `feeds[].status` is 'pending' when the sync is written/merged but the scheduled sync has not run yet — surfaced rather than hidden. `aliases` = white-label brands accepted by `?bookmaker=` on other endpoints, served from the parent book's pricing backend. meta.redistributable is @deprecated in favour of meta.direct_scrape (removal 2027-02-01).

Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/odds-feed/bookmakers"
Example response
{
  "success": true,
  "data": [
    {
      "key": "sportsbet",
      "name": "Sportsbet",
      "type": "corporate",
      "feeds": [
        {
          "kind": "sports",
          "status": "live"
        },
        {
          "kind": "racing",
          "status": "live"
        }
      ],
      "racing": true,
      "sports": true,
      "aliases": []
    },
    {
      "key": "betmakers",
      "name": "BetMakers Nimbus",
      "type": "platform",
      "feeds": [
        {
          "kind": "sports",
          "status": "live"
        },
        {
          "kind": "racing",
          "status": "pending"
        }
      ],
      "racing": false,
      "sports": true,
      "aliases": [
        {
          "key": "unibet",
          "name": "Unibet"
        },
        {
          "key": "betright",
          "name": "BetRight"
        }
      ]
    }
  ],
  "meta": {
    "direct_scrape": true,
    "redistributable": true,
    "license": "krokodds-proprietary",
    "note": "All feeds listed here are sourced directly by KrokOdds. Display-permitted in your own product with attribution; not licensed for resale as a standalone feed — see Terms 6.1. Aggregator-licensed odds are never served from /api/v1/odds-feed."
  }
}
GET/api/v1/odds-feed/clvAPI plan

Historical closing-line odds (last snapshot per bookmaker before commence_time) from the CLV archive.

Tier detail: api (paid) — 'closing_lines' is NOT in the free-tier feature set

Backed by `clv_archive` table; primary store first, secondary store on query failure. `bookmaker` filter is applied in-memory AFTER the cache read so all sport/date combos share one cache entry. Cache 60s. `from` is clamped via clampHistoricalFrom to the caller's plan window. 400 on malformed from/to (must be YYYY-MM-DD).

Query parameters
NameTypeRequiredDefaultDescription
sportstringNo–Filter by sport key, e.g. 'basketball_nba', 'aussierules_afl'.
bookmakerstringNo–Filter by bookmaker key, e.g. 'sportsbet', 'tab'.
fromstring (YYYY-MM-DD)No–Start of commence_time date range. Clamped to the caller's historicalDays window.
tostring (YYYY-MM-DD)No–End of commence_time date range.
limitintegerNo50 (free) / 500 (api)Max results; capped per tier.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/odds-feed/clv?sport=aussierules_afl"
Example response
{
  "success": true,
  "data": [
    {
      "event_id": "nrl-panthers-storm-20260903",
      "sport": "rugbyleague_nrl",
      "sport_title": "NRL",
      "home_team": "Penrith Panthers",
      "away_team": "Melbourne Storm",
      "commence_time": "2026-09-03T09:30:00Z",
      "archived_at": "2026-09-03T09:29:10Z",
      "bookmakers": [
        {
          "key": "sportsbet",
          "markets": [
            {
              "key": "h2h",
              "outcomes": [
                {
                  "name": "Penrith Panthers",
                  "bet_link": "https://www.sportsbet.com.au/..."
                },
                {
                  "name": "Melbourne Storm",
                  "bet_link": "https://www.sportsbet.com.au/..."
                }
              ]
            }
          ]
        }
      ]
    }
  ],
  "meta": {
    "sport": "rugbyleague_nrl",
    "bookmaker": null,
    "date_from": "2026-08-27",
    "date_to": null,
    "limit": 50,
    "requested_limit": 50,
    "total_matched": 1,
    "truncated": false,
    "direct_scrape": true,
    "redistributable": true,
    "license": "krokodds-proprietary"
  }
}
GET/api/v1/odds-feed/prediction-marketsFree tier

Prediction-market odds from Polymarket and Kalshi with de-vigged probabilities and CLOB order-book enrichment.

Reads the prediction-market store (the primary store), synced every 30 min by the prediction-market sync scheduled sync. Cache 300s — matches the sync interval, fresher would be wasted reads. 400 on invalid source/type enum values.

Query parameters
NameTypeRequiredDefaultDescription
sourcestring enumNoboth'polymarket' or 'kalshi'.
sportstringNo–KrokOdds sport key, e.g. 'basketball_nba'.
typestring enumNo–'game' or 'futures'.
limitintegerNo200Max 1000.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/odds-feed/prediction-markets?source=both"
Example response
{
  "success": true,
  "data": [
    {
      "id": "pm_0x8f21a",
      "source": "polymarket",
      "type": "game",
      "marketTitle": "Will the Sydney Kings win vs Melbourne United?",
      "sportKey": "basketball_nbl",
      "eventKey": "nbl-kings-united-20260903",
      "matchConfidence": 0.94,
      "impliedProbs": {
        "yes": 0.57,
        "no": 0.43
      },
      "rawPrices": {
        "yes": 0.57,
        "no": 0.43
      },
      "volume": 18450.25,
      "liquidity": 6200.5,
      "bestBid": 0.56,
      "bestAsk": 0.58,
      "spread": 0.02,
      "lastTradePrice": 0.57,
      "oneDayPriceChange": 0.03,
      "updatedAt": "2026-09-03T08:15:00Z"
    }
  ],
  "meta": {
    "direct_scrape": true,
    "redistributable": true,
    "license": "krokodds-proprietary",
    "sources": [
      "polymarket"
    ],
    "filter": {
      "source": null,
      "sport": "basketball_nbl",
      "type": null
    },
    "note": "Prediction-market contract prices de-vigged and enriched with CLOB order-book data. Synced every 30 minutes."
  }
}
GET/api/v1/odds-feed/racingFree tier

Racing meetings -> races -> runners -> per-book fixed/tote odds, normalised across all proprietary racing feeds.

Gated on 'racing' not 'scraped_odds' by design — both are free today; kept separate so racing can move to paid independently. Per-collection scan cap is 600 (the race-card feed alone runs ~420 meetings on a busy day). the race-card feed stores thoroughbred as 'R' internally; API normalises to 'T' in both query and output. date before the caller's historicalDays window returns 403. Cache 60s.

Query parameters
NameTypeRequiredDefaultDescription
datestring (YYYY-MM-DD)Notoday (Australia/Melbourne)Meeting date, AU-local.
bookmakerstringNo–Canonical key or white-label alias (e.g. 'swiftbet' resolves to bluebet).
venuestringNo–Substring match on venue slug.
race_typestring enumNo–T/R (thoroughbred), H (harness), G (greyhound).
limitintegerNo10 (free) / 500 (api)Capped per tier.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/odds-feed/racing?date=today%20(Australia%2FMelbourne)"
Example response
{
  "success": true,
  "data": [
    {
      "bookmaker_key": "tab",
      "venue_slug": "flemington",
      "race_type": "T",
      "races": [
        {
          "race_number": 4,
          "runners": [
            {
              "number": 7,
              "name": "Golden Streak",
              "win": 4.2,
              "place": 1.65,
              "bet_link": "https://tab.com.au/..."
            }
          ]
        }
      ]
    }
  ],
  "meta": {
    "date": "2026-09-03",
    "bookmaker": "tab",
    "brand": null,
    "limit": 10,
    "requested_limit": 10,
    "total_matched": 1,
    "truncated": false,
    "scan_capped_bookmakers": [],
    "direct_scrape": true,
    "redistributable": true,
    "license": "krokodds-proprietary"
  }
}
GET/api/v1/odds-feed/racing/historyAPI plan

Historical per-book, per-runner racing odds snapshots (~5-min granularity) from the cold archive — the backtest feed.

Tier detail: api (paid)

PAID-ONLY endpoint: gated on `bulk_export`, which is NOT in the free-tier feature set — requires the api (paid) plan. `from` is REQUIRED (400 if missing/malformed); unbounded scans are rejected. Max 31-day window (400 if exceeded). Cursor-based pagination — supports `?fields=` projection via parseFields/projectRows. 503 (not 500) if the cold-archive table doesn't exist yet (mirror/flatten not live). the race-card feed's 'R' race_type is normalised to 'T' in output; both 'T' and 'R' accepted as query aliases.

Query parameters
NameTypeRequiredDefaultDescription
fromstring (YYYY-MM-DD)Yes–Required. Start of date window; clamped to the caller's historicalDays.
tostring (YYYY-MM-DD)Nosame as fromEnd of date window. Must be >= from. Window capped at 31 days total.
bookmakerstring enumNo–One of tab, betfair, sportsbet, ladbrokes, neds, pointsbet, bluebet, palmerbet.
venuestringNo–Substring match on venue_slug.
race_typestring enumNo–T/R (thoroughbred), H (harness), G (greyhound). T and R both map to stored 'T'.
limitintegerNo5000Capped at 5000 for both free and api internal tiers.
cursorstring (base64url)No–Opaque pagination cursor returned as meta.next_cursor from the previous page.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/odds-feed/racing/history?from=2026-09-01"
Example response
{
  "success": true,
  "data": [
    {
      "date": "2026-09-03",
      "snapshot_ts": "2026-09-03T05:05:00.000Z",
      "snapshot_ms": 1772773500000,
      "venue_slug": "flemington",
      "race_no": 4,
      "race_id": "flemington-20260903-r4",
      "meeting_id": "flemington-20260903",
      "race_type": "T",
      "runner_no": 7,
      "runner_name": "Golden Streak",
      "scratched": false,
      "book_key": "sportsbet",
      "bet_link": "https://www.sportsbet.com.au/...",
      "win": 4.2,
      "place": 1.65,
      "tote_win": 4.4,
      "tote_place": 1.7,
      "lay": 4.4
    }
  ],
  "meta": {
    "from": "2026-08-20",
    "to": "2026-09-03",
    "partition_days": 15,
    "bookmaker": "sportsbet",
    "venue": null,
    "race_type": "T",
    "limit": 5000,
    "requested_limit": 5000,
    "next_cursor": "eyJtcyI6MTc3Mjc3MzUwMDAwMCwicmFjZSI6ImZsZW1pbmd0b24tMjAyNjA5MDMtcjQiLCJydW5uZXIiOjcsImJvb2siOiJzcG9ydHNiZXQifQ",
    "direct_scrape": true,
    "redistributable": true,
    "license": "krokodds-proprietary"
  }
}
GET/api/v1/odds-feed/racing/movementsFree tier

Cross-bookmaker price movements (opening vs current) for today's/tomorrow's races, per runner.

Reads a single precomputed doc `the pre-aggregated opportunity doc/the book-movement doc` (primary store first, secondary fallback). Cache 60s. Returns empty array (not error) when the doc has no movements yet. Same tier gate as /api/v1/odds-feed/racing ('racing'), independent of 'scraped_odds'.

Query parameters
NameTypeRequiredDefaultDescription
venuestringNo–Substring match on venue name (case-insensitive).
race_typestring enumNo–T/R (thoroughbred), H (harness), G (greyhound).
bookmakerstringNo–Filter each runner's bookMovements down to one book.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/odds-feed/racing/movements?venue=Randwick"
Example response
{
  "success": true,
  "data": [
    {
      "raceId": "flemington-20260903-r4",
      "raceName": "Race 4",
      "venue": "Flemington",
      "raceNumber": 4,
      "raceType": "T",
      "jumpTime": "2026-09-03T05:10:00Z",
      "runners": [
        {
          "number": 7,
          "name": "Golden Streak",
          "bestMovementPct": -12.5,
          "bookMovements": [
            {
              "book": "sportsbet",
              "opening": 4.8,
              "current": 4.2,
              "pct": -12.5,
              "bet_link": "https://www.sportsbet.com.au/..."
            },
            {
              "book": "tab",
              "opening": 5,
              "current": 4.4,
              "pct": -12,
              "bet_link": "https://tab.com.au/..."
            }
          ]
        }
      ]
    }
  ],
  "meta": {
    "updatedAt": "2026-09-03T05:00:12Z"
  }
}
GET/api/v1/odds-feed/resultsFree tier

Settled race results (winner + full finishing order) from Krok Odds result feeds.

Backed by the fused results store (one doc per race, single jsonb-path equality filter on date, paged by id). date before the caller's historicalDays window returns 403. Cache 120s, scan cap 1000 rows/day.

Query parameters
NameTypeRequiredDefaultDescription
datestring (YYYY-MM-DD)Notoday (Australia/Melbourne)AU-local race date.
sportstring enumNo–R (thoroughbred), H (harness), G (greyhound); T accepted as alias for R.
sourcestringNo–Filter by result source.
venuestringNo–Substring match on venue slug.
limitintegerNo20 (free) / 800 (api)Capped per tier.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/odds-feed/results?date=today%20(Australia%2FMelbourne)"
Example response
{
  "success": true,
  "data": [
    {
      "date": "2026-09-03",
      "venue": "Flemington",
      "venueSlug": "flemington",
      "raceNumber": 4,
      "raceType": "R",
      "source": "tab",
      "status": "settled",
      "winner": {
        "number": 7,
        "name": "Golden Streak"
      },
      "placings": [
        {
          "position": 1,
          "number": 7,
          "name": "Golden Streak"
        },
        {
          "position": 2,
          "number": 3,
          "name": "Silver Line"
        }
      ]
    }
  ],
  "meta": {
    "date": "2026-09-03",
    "sport": null,
    "source": null,
    "limit": 20,
    "requested_limit": 20,
    "total_matched": 1,
    "truncated": false,
    "scan_capped": false,
    "direct_scrape": true,
    "redistributable": true,
    "license": "krokodds-proprietary"
  }
}
GET/api/v1/odds-feed/results/{date}Free tier

All settled race results for a specific AU-local date (path-param variant of /odds-feed/results).

Same store, tier gate and shape as /odds-feed/results (query-param version); date comes from the path instead of ?date=. 400 on malformed date; shares the `shared.ts` loader (cache 300s, scan cap 1000).

Path parameters
NameTypeRequiredDefaultDescription
datestring (YYYY-MM-DD)Yes–AU-local race date.
Query parameters
NameTypeRequiredDefaultDescription
sportstring enumNo–R (thoroughbred), H (harness), G (greyhound). T accepted as alias for R.
sourcestringNo–Filter by result source.
venuestringNo–Substring match on venue slug.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/odds-feed/results/2026-09-01?sport=aussierules_afl"
Example response
{
  "success": true,
  "data": [
    {
      "date": "2026-09-03",
      "venue": "Flemington",
      "venueSlug": "flemington",
      "raceNumber": 4,
      "raceType": "R",
      "source": "tab",
      "status": "settled",
      "winner": {
        "number": 7,
        "name": "Golden Streak"
      },
      "placings": [
        {
          "position": 1,
          "number": 7,
          "name": "Golden Streak"
        },
        {
          "position": 2,
          "number": 3,
          "name": "Silver Line"
        }
      ],
      "scratchings": [
        5
      ],
      "resultAt": "2026-09-03T05:14:22Z"
    }
  ],
  "meta": {
    "date": "2026-09-03",
    "sport": "R",
    "source": null,
    "limit": 20,
    "total_matched": 1,
    "truncated": false,
    "scan_capped": false,
    "direct_scrape": true,
    "redistributable": true,
    "license": "krokodds-proprietary"
  }
}
GET/api/v1/odds-feed/sportsFree tier

Sports with live proprietary event coverage, with per-sport live event counts and supplying bookmakers.

Counts come from PostgREST head-only COUNT queries, never a full document scan (deliberate cost guard, see June 2026 cost incident). Cache 300s — sport list moves slowly. If ALL count queries fail, the route throws (500) rather than caching an empty list for 300s. Racing-only books (BlueBet, Palmerbet) return empty sports list — that's real coverage, not an error; surfaced via meta.bookmaker_sports_feed = 'pending'.

Query parameters
NameTypeRequiredDefaultDescription
bookmakerstringNo–Canonical key or white-label alias; filters the (sport, book) counts in-memory over one cache entry.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/odds-feed/sports?bookmaker=sportsbet"
Example response
{
  "success": true,
  "data": [
    {
      "sport": "aussierules_afl",
      "event_count": 9,
      "bookmakers": [
        "betr",
        "ladbrokes",
        "pointsbet",
        "sportsbet",
        "tab"
      ],
      "href": "/api/v1/odds-feed/sports/aussierules_afl"
    },
    {
      "sport": "rugbyleague_nrl",
      "event_count": 8,
      "bookmakers": [
        "ladbrokes",
        "sportsbet",
        "tab"
      ],
      "href": "/api/v1/odds-feed/sports/rugbyleague_nrl"
    }
  ],
  "meta": {
    "bookmaker": null,
    "brand": null,
    "bookmaker_sports_feed": null,
    "direct_scrape": true,
    "redistributable": true,
    "license": "krokodds-proprietary"
  }
}
GET/api/v1/odds-feed/sports/{sport}Free tier

Events + full market/selection odds for one sport, fanned out across every book that scrapes it.

Per-collection scan cap 100, independent of the caller's `limit`, so an in-memory bookmaker filter still has a full candidate pool. 60s in-memory per-instance cache layered under the 60s unstable_cache to dedupe burst traffic. bet_link attached AFTER slicing to `limit`, outside the cache, so only served selections pay the link-build cost.

Path parameters
NameTypeRequiredDefaultDescription
sportstringYes–Sport slug, e.g. 'basketball_nba', 'soccer_epl'. Resolved via resolveSportSlug; 400 if unresolvable.
Query parameters
NameTypeRequiredDefaultDescription
bookmakerstringNo–Canonical key or white-label alias.
leaguestringNo–League-specific slug, e.g. 'soccer_epl'; takes precedence over `competition`.
competitionstringNo–Substring match on competition name (used only if `league` not set).
upcomingboolean ('true')NofalseOnly events with start_time in the future.
marketsboolean ('false' to disable)NotrueSet to 'false' to omit markets/selections from the response (event metadata only).
cursorstringNo–Keyset cursor over (captured_at DESC, event_id ASC). Pass the `next` value from a previous response to fetch the following page; pages neither overlap nor skip.
freshboolean ('true')NofalseServe only rows inside their state's freshness budget (30 min pre-match, 2 min in-play; 90 min for racing's slower cadence). A row whose capture time cannot be read is dropped. `max_age_minutes` wins when both are given.
max_age_minutesintegerNo–Serve only rows whose newest capture is inside this many minutes. More specific than `fresh`, so it wins when both are given.
limitintegerNo25 (free) / 1000 (api)Capped per tier.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/odds-feed/sports/aussierules_afl?bookmaker=sportsbet"
Example response
{
  "success": true,
  "data": [
    {
      "bookmaker_key": "sportsbet",
      "sport_slug": "soccer_epl",
      "event": "Arsenal vs Chelsea",
      "start_time": "2026-09-03T19:30:00Z",
      "competition": "English Premier League",
      "league_slug": "soccer_epl",
      "markets": [
        {
          "key": "h2h",
          "selections": [
            {
              "name": "Arsenal",
              "price": 2.1,
              "bet_link": "https://www.sportsbet.com.au/..."
            },
            {
              "name": "Draw",
              "price": 3.4,
              "bet_link": "https://www.sportsbet.com.au/..."
            },
            {
              "name": "Chelsea",
              "price": 3.5,
              "bet_link": "https://www.sportsbet.com.au/..."
            }
          ]
        }
      ]
    }
  ],
  "meta": {
    "sport": "soccer_epl",
    "bookmaker": null,
    "brand": null,
    "limit": 25,
    "requested_limit": 25,
    "total_matched": 1,
    "truncated": false,
    "scan_capped_bookmakers": [],
    "direct_scrape": true,
    "redistributable": true,
    "license": "krokodds-proprietary"
  }
}
GET/api/v1/scraped-odds/bookmakers→ alias of /api/v1/odds-feed/bookmakersFree tier

Alias of /api/v1/odds-feed/bookmakers.

Directly re-exports { GET, OPTIONS } from ../../odds-feed/bookmakers/route — same handler, not a redirect. Historically was a 308 redirect but NextResponse.redirect() built the Location from internal request.url (localhost on Cloud Run/App Hosting), breaking external clients — now serves the handler directly.

Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/scraped-odds/bookmakers"
GET/api/v1/scraped-odds/racing→ alias of /api/v1/odds-feed/racingFree tier

Alias of /api/v1/odds-feed/racing.

Directly re-exports { GET, OPTIONS } from ../../odds-feed/racing/route — same handler, not a redirect.

Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/scraped-odds/racing"
GET/api/v1/scraped-odds/sports→ alias of /api/v1/odds-feed/sportsFree tier

Alias of /api/v1/odds-feed/sports.

Directly re-exports { GET, OPTIONS } from ../../odds-feed/sports/route — same handler, not a redirect.

Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/scraped-odds/sports"
GET/api/v1/scraped-odds/sports/{sport}→ alias of /api/v1/odds-feed/sports/{sport}Free tier

Alias of /api/v1/odds-feed/sports/{sport}.

Directly re-exports { GET, OPTIONS } from ../../../odds-feed/sports/[sport]/route — same handler, not a redirect.

Path parameters
NameTypeRequiredDefaultDescription
sportstringYes–Passes through unchanged to the odds-feed handler.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/scraped-odds/sports/aussierules_afl"
GET/api/v1/dabble-pickemFree tier

Dabble Pick'em player lines (current board) for one fixture.

Fixture-scoped by design: `fixture_id` is required and is the only equality filter, so the read stays on a column index rather than scanning. There is no whole-board mode. `meta.degraded` is set if part of a chunked read fails. Use /api/v1/dabble-pickem/fixtures to find a fixture_id.

Query parameters
NameTypeRequiredDefaultDescription
X-API-KeystringYes–API key.
fixture_idstringYes–Dabble fixture id. The endpoint's single equality filter — this board is fixture-scoped.
limitintegerNo50Max rows. Capped at 50 (free) / 500 (api).
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/dabble-pickem?X-API-Key=value&fixture_id=abc123"
Example response
{
  "success": true,
  "data": [
    {
      "player": "LeBron James",
      "player_id": "p_123",
      "team": "Lakers",
      "market": "Points",
      "market_type": "player_points",
      "line": 24.5,
      "line_type": "over_under",
      "price": 1.87,
      "sport": "Basketball",
      "competition": "NBA",
      "event": "Lakers vs Celtics",
      "start": "2026-10-09T09:00:00.000Z",
      "captured_at": "2026-10-08T01:00:00.000Z"
    }
  ],
  "meta": {
    "fixture_id": "dabble_fixture_01a10436-6a1e-7c2f-9db3-1c4e5f6a7b8c",
    "event": "Lakers vs Celtics",
    "sport": "Basketball",
    "competition": "NBA",
    "start": "2026-10-09T09:00:00.000Z",
    "count": 1,
    "tier": "free",
    "limit": 50
  }
}
GET/api/v1/dabble-pickem/fixturesFree tier

Dabble Pick'em fixtures — find the games that carry player lines, then call /api/v1/dabble-pickem with a fixture_id.

Discovery endpoint for /api/v1/dabble-pickem. At least one of `sport`, `from`, `to` is required — an unfiltered listing is a bulk export and is not available. `sport` is a DISPLAY NAME (`Basketball`, `Ice Hockey`, ...), not a sport key such as `basketball_nba`, and it is an exact, case-sensitive match. At most one equality filter is applied; the advertised-start window rides its own index. Example window query: `GET /api/v1/dabble-pickem/fixtures?from=2026-10-08&to=2026-10-09&limit=100`. Both endpoints bill 1 credit per request and cache for 5 minutes.

Query parameters
NameTypeRequiredDefaultDescription
X-API-KeystringYes–API key.
sportstringNo–Sport **display name**, not a sport key. Matched by exact, case-sensitive equality against the fixture's `sport` label (the value returned in each row's `sport` field), so `Basketball` matches but `basketball` and `basketball_nba` do not. Leading/trailing whitespace is trimmed; casing is not. Display names carried by these fixtures: `Basketball`, `American Football` (also `NFL`), `Baseball` (`MLB`), `Ice Hockey` (`NHL`), `Soccer` (also `Football`), `Cricket`, `Rugby League` (`NRL`), `Rugby Union`, `Tennis`, `Australian Rules` (`AFL`), `MMA` (`UFC`), `Boxing`. To pin the exact label for a competition without guessing, call once with only `from`/`to` and read `sport` back. This is the endpoint's single equality filter.
fromstring (ISO date)No–Earliest advertised start to include, inclusive. ISO 8601 date or timestamp, e.g. `from=2026-10-08` or `from=2026-10-08T00:00:00.000Z`. Compared as a string (gte) against the fixture's `advertisedStart`; omitting it leaves the lower bound open. Indexed range.
tostring (ISO date)No–Latest advertised start to include, inclusive. Same format as `from`, e.g. `to=2026-10-09T00:00:00.000Z` (lte on `advertisedStart`). Indexed range.
limitintegerNo50Max rows. Capped at 50 (free) / 500 (api).
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/dabble-pickem/fixtures?X-API-Key=value"
Example response
{
  "success": true,
  "data": [
    {
      "fixture_id": "dabble_fixture_01a10436-6a1e-7c2f-9db3-1c4e5f6a7b8c",
      "event": "Lakers vs Celtics",
      "home": "Lakers",
      "away": "Celtics",
      "sport": "Basketball",
      "competition": "NBA",
      "start": "2026-10-09T09:00:00.000Z"
    }
  ],
  "meta": {
    "sport": "Basketball",
    "from": null,
    "to": null,
    "returned": 1,
    "count": 1,
    "tier": "free",
    "limit": 50
  }
}

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.

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.