Krok Odds

Racing — Form, ratings & sectionals

The form, ratings & sectionals half of the Racing reference — every route with its parameters, credit cost and a worked example.

6 of 23 endpoints · all categories · get a free API key

GET/api/v1/racing/field-formFree tier

The full declared field for one race — every runner with jockey, trainer, barrier, weight, best available win price, the per-bookmaker price list, career/venue/distance/prep splits, sectionals, a speed map and the last few form lines.

Scratched runners stay in the field with `scratched: true` — the board serves them too, so filter client-side. `entry_id` (`{race_key_v2}_{tab_number}`) is the stable identity that joins this payload to `/racing/meetings?full=1` and `/racing/results/{date}`. `odds` is the raw per-bookmaker win price list for this runner; `best_win` is the best of it. Form/sectional/profile blocks are best-effort: a runner with no history for a code carries `null` (or empty arrays) for that block rather than being dropped, and greyhound/harness cards carry fewer blocks than thoroughbred. Cached 120s. A win price of exactly 1.01 is a pre-market placeholder (a book quoting its whole card at 1.01), not a price, so it is excluded from `best_win` and `bookmakers_priced`.

Query parameters
NameTypeRequiredDefaultDescription
race_idstringYes–The race to fetch. Both shapes in the wild work: the numeric `racing_meetings.data.races[].id`, and the canonical slug key `{YYYY-MM-DD}_{venue-slug}_{T|H|G}_{raceNo}` (e.g. `2026-10-22_ascot-park_T_3`).
form_limitintegerNo5Form lines returned per runner. Capped at 10.
sport_keystring enumNo–Optional disambiguation for a bare race number: racing_T | racing_H | racing_G.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/racing/field-form?race_id=abc123"
Example response
{
  "success": true,
  "data": {
    "race_id": "28376174",
    "date": "2026-10-22",
    "venue": "Ascot Park",
    "venue_slug": "ascot-park",
    "track_condition": "Good",
    "weather": {
      "temp_c": 29,
      "summary": "Overcast, 29°C",
      "wind_kmh": 12,
      "rain_24h_mm": 1.2
    },
    "race_name": "ONE AGENCY BM75 HANDICAP",
    "distance": 1600,
    "race_class": null,
    "runners": [
      {
        "name": "He's Tunza Grunt",
        "slug": "he-s-tunza-grunt",
        "tab_number": 1,
        "entry_id": "2026-10-22_ascot-park_T_3_1",
        "scratched": false,
        "jockey": "A Strawbridge",
        "trainer": "S Faulkner",
        "barrier": null,
        "weight": null,
        "best_win": 7.5,
        "odds": [
          {
            "win": 7,
            "bookmaker": "Baggybet",
            "capturedAt": "2026-10-22T01:03:57.047Z"
          },
          {
            "win": 7,
            "bookmaker": "BetLegends",
            "capturedAt": "2026-10-22T01:04:28.167Z"
          },
          {
            "win": 7,
            "bookmaker": "BetLocal",
            "capturedAt": "2026-10-22T01:04:04.825Z"
          }
        ],
        "career": null,
        "splits": {
          "by_track": [],
          "by_distance": [],
          "by_going": [],
          "by_prep_stage": {
            "first_up": {
              "bucket": "First-up",
              "starts": 0,
              "wins": 0,
              "places": 0,
              "win_rate": 0,
              "place_rate": 0
            },
            "second_up": {
              "bucket": "Second-up",
              "starts": 0,
              "wins": 0,
              "places": 0,
              "win_rate": 0,
              "place_rate": 0
            },
            "in_prep": {
              "bucket": "In prep",
              "starts": 0,
              "wins": 0,
              "places": 0,
              "win_rate": 0,
              "place_rate": 0
            }
          }
        },
        "sectionals": null,
        "profile": null,
        "jockey_stats": null,
        "trainer_stats": null,
        "track_bias": {
          "total_races": 1514,
          "barrier_stats": [
            {
              "barrier": 1,
              "wins": 1,
              "places": 1,
              "win_rate": 0.3333,
              "place_rate": 0.3333,
              "advantage": 0.1909
            },
            {
              "barrier": 2,
              "wins": 1,
              "places": 1,
              "win_rate": 0.0833,
              "place_rate": 0.0833,
              "advantage": -0.0591
            },
            {
              "barrier": 3,
              "wins": 3,
              "places": 3,
              "win_rate": 0.25,
              "place_rate": 0.25,
              "advantage": 0.1076
            }
          ]
        },
        "opening_price": null,
        "opening_prices": null,
        "speed_map": {
          "running_style": "P",
          "early_speed_index": 5.87,
          "settling_position": 4.1
        },
        "form_stats": {
          "track": {
            "starts": 9,
            "wins": 2,
            "places": 5,
            "win_percent": 0.22222222,
            "place_percent": 0.55555556
          },
          "distance": {
            "starts": 24,
            "wins": 4,
            "places": 7,
            "win_percent": 0.16666667,
            "place_percent": 0.29166667
          },
          "first_up": {
            "starts": 6,
            "wins": 1,
            "places": 1,
            "win_percent": 0.16666667,
            "place_percent": 0.16666667
          },
          "second_up": {
            "starts": 6,
            "wins": 0,
            "places": 2,
            "win_percent": 0,
            "place_percent": 0.33333333
          },
          "overall": {
            "starts": 52,
            "wins": 5,
            "places": 12,
            "win_percent": 0.09615385,
            "place_percent": 0.23076923
          }
        },
        "age": null,
        "sex": "Gelding",
        "recent_form": [
          {
            "date": "2025-08-08",
            "track": "Riccarton",
            "race_name": null,
            "distance": null,
            "finish_position": 1,
            "margin": null,
            "jockey": null,
            "weight": null,
            "barrier": null,
            "class_conditions": null,
            "field_size": 4,
            "track_condition": null,
            "win_bsp": null,
            "position_at_400": null,
            "position_at_800": null,
            "position_at_settled": null,
            "replay_video": null
          },
          {
            "date": "2025-07-19",
            "track": "Oamaru",
            "race_name": null,
            "distance": null,
            "finish_position": 2,
            "margin": null,
            "jockey": null,
            "weight": null,
            "barrier": null,
            "class_conditions": null,
            "field_size": 4,
            "track_condition": null,
            "win_bsp": null,
            "position_at_400": null,
            "position_at_800": null,
            "position_at_settled": null,
            "replay_video": null
          },
          {
            "date": "2025-06-20",
            "track": "Riccarton",
            "race_name": null,
            "distance": null,
            "finish_position": 3,
            "margin": null,
            "jockey": null,
            "weight": null,
            "barrier": null,
            "class_conditions": null,
            "field_size": 4,
            "track_condition": null,
            "win_bsp": null,
            "position_at_400": null,
            "position_at_800": null,
            "position_at_settled": null,
            "replay_video": null
          },
          {
            "date": "2025-06-09",
            "track": "Phar Lap",
            "race_name": null,
            "distance": null,
            "finish_position": 1,
            "margin": null,
            "jockey": null,
            "weight": null,
            "barrier": null,
            "class_conditions": null,
            "field_size": 4,
            "track_condition": null,
            "win_bsp": null,
            "position_at_400": null,
            "position_at_800": null,
            "position_at_settled": null,
            "replay_video": null
          }
        ]
      },
      {
        "name": "Monaghan Boy",
        "slug": "monaghan-boy",
        "tab_number": 2,
        "entry_id": "2026-10-22_ascot-park_T_3_2",
        "scratched": false,
        "jockey": "C Stumbles",
        "trainer": "K Tyler",
        "barrier": null,
        "weight": null,
        "best_win": 7.7,
        "odds": [
          {
            "win": 5,
            "bookmaker": "Baggybet",
            "capturedAt": "2026-10-22T00:57:20.436Z"
          },
          {
            "win": 5,
            "bookmaker": "BetLegends",
            "capturedAt": "2026-10-22T00:53:41.901Z"
          },
          {
            "win": 5,
            "bookmaker": "BetLocal",
            "capturedAt": "2026-10-22T00:53:41.726Z"
          }
        ],
        "career": {
          "starts": 30,
          "wins": 6,
          "places": 0,
          "win_rate": 0.2,
          "place_rate": 0,
          "form_string": "PPxxxxx1xx",
          "prize_money": null,
          "avg_win_bsp": 7.395999999999999
        },
        "splits": {
          "by_track": [
            {
              "bucket": "Wingatui",
              "starts": 14,
              "wins": 2,
              "places": 3,
              "win_rate": 0.14285714285714285,
              "place_rate": 0.21428571428571427
            },
            {
              "bucket": "Ascot Park",
              "starts": 11,
              "wins": 3,
              "places": 6,
              "win_rate": 0.2727272727272727,
              "place_rate": 0.5454545454545454
            },
            {
              "bucket": "Riverton",
              "starts": 11,
              "wins": 3,
              "places": 4,
              "win_rate": 0.2727272727272727,
              "place_rate": 0.36363636363636365
            },
            {
              "bucket": "Gore",
              "starts": 3,
              "wins": 0,
              "places": 0,
              "win_rate": 0,
              "place_rate": 0
            },
            {
              "bucket": "GORE",
              "starts": 1,
              "wins": 0,
              "places": 0,
              "win_rate": 0,
              "place_rate": 0
            },
            {
              "bucket": "Riccarton Park",
              "starts": 1,
              "wins": 0,
              "places": 0,
              "win_rate": 0,
              "place_rate": 0
            }
          ],
          "by_distance": [
            {
              "bucket": "1300–1499m",
              "starts": 15,
              "wins": 4,
              "places": 4,
              "win_rate": 0.26666666666666666,
              "place_rate": 0.26666666666666666
            },
            {
              "bucket": "1100–1299m",
              "starts": 10,
              "wins": 1,
              "places": 1,
              "win_rate": 0.1,
              "place_rate": 0.1
            },
            {
              "bucket": "1500–1699m",
              "starts": 7,
              "wins": 1,
              "places": 2,
              "win_rate": 0.14285714285714285,
              "place_rate": 0.2857142857142857
            }
          ],
          "by_going": [
            {
              "bucket": "Unknown",
              "starts": 39,
              "wins": 8,
              "places": 12,
              "win_rate": 0.20512820512820512,
              "place_rate": 0.3076923076923077
            },
            {
              "bucket": "Soft",
              "starts": 1,
              "wins": 0,
              "places": 1,
              "win_rate": 0,
              "place_rate": 1
            },
            {
              "bucket": "Heavy",
              "starts": 1,
              "wins": 0,
              "places": 0,
              "win_rate": 0,
              "place_rate": 0
            }
          ],
          "by_prep_stage": {
            "first_up": {
              "bucket": "First-up",
              "starts": 1,
              "wins": 0,
              "places": 0,
              "win_rate": 0,
              "place_rate": 0
            },
            "second_up": {
              "bucket": "Second-up",
              "starts": 4,
              "wins": 1,
              "places": 1,
              "win_rate": 0.25,
              "place_rate": 0.25
            },
            "in_prep": {
              "bucket": "In prep",
              "starts": 35,
              "wins": 7,
              "places": 12,
              "win_rate": 0.2,
              "place_rate": 0.34285714285714286
            }
          }
        },
        "sectionals": null,
        "profile": null,
        "jockey_stats": null,
        "trainer_stats": null,
        "track_bias": {
          "total_races": 1514,
          "barrier_stats": [
            {
              "barrier": 1,
              "wins": 1,
              "places": 1,
              "win_rate": 0.3333,
              "place_rate": 0.3333,
              "advantage": 0.1909
            },
            {
              "barrier": 2,
              "wins": 1,
              "places": 1,
              "win_rate": 0.0833,
              "place_rate": 0.0833,
              "advantage": -0.0591
            },
            {
              "barrier": 3,
              "wins": 3,
              "places": 3,
              "win_rate": 0.25,
              "place_rate": 0.25,
              "advantage": 0.1076
            }
          ]
        },
        "opening_price": null,
        "opening_prices": null,
        "speed_map": {
          "running_style": "P",
          "early_speed_index": 5.5,
          "settling_position": 4.5
        },
        "form_stats": {
          "track": {
            "starts": 3,
            "wins": 0,
            "places": 1,
            "win_percent": 0,
            "place_percent": 0.33333333
          },
          "distance": {
            "starts": 4,
            "wins": 0,
            "places": 0,
            "win_percent": 0,
            "place_percent": 0
          },
          "first_up": {
            "starts": 3,
            "wins": 0,
            "places": 0,
            "win_percent": 0,
            "place_percent": 0
          },
          "second_up": {
            "starts": 3,
            "wins": 0,
            "places": 2,
            "win_percent": 0,
            "place_percent": 0.66666667
          },
          "overall": {
            "starts": 12,
            "wins": 1,
            "places": 3,
            "win_percent": 0.08333333,
            "place_percent": 0.25
          }
        },
        "age": null,
        "sex": "Gelding",
        "recent_form": [
          {
            "date": "2026-10-22",
            "track": "Ascot Park",
            "race_name": null,
            "distance": null,
            "finish_position": 2,
            "margin": null,
            "jockey": "Cooper Stumbles",
            "weight": 59.5,
            "barrier": 5,
            "class_conditions": null,
            "field_size": 8,
            "track_condition": null,
            "win_bsp": null,
            "position_at_400": null,
            "position_at_800": null,
            "position_at_settled": null,
            "replay_video": null
          },
          {
            "date": "2026-10-16",
            "track": "GORE",
            "race_name": "SOUTHERN SHEEP SERVICES",
            "distance": null,
            "finish_position": 6,
            "margin": "5.62",
            "jockey": "K Bakker",
            "weight": 59.5,
            "barrier": 3,
            "class_conditions": null,
            "field_size": 6,
            "track_condition": null,
            "win_bsp": null,
            "position_at_400": null,
            "position_at_800": null,
            "position_at_settled": null,
            "replay_video": null
          },
          {
            "date": "2026-10-02",
            "track": "Wingatui",
            "race_name": "MORE FM",
            "distance": 1400,
            "finish_position": null,
            "margin": null,
            "jockey": "C Stumbles",
            "weight": 60.5,
            "barrier": 4,
            "class_conditions": "BM75",
            "field_size": 11,
            "track_condition": "HVY10",
            "win_bsp": null,
            "position_at_400": null,
            "position_at_800": null,
            "position_at_settled": null,
            "replay_video": "https://mediatabs.skyracing.com.au/Race_Replay/2026/10/20261002WGTR05_V.mp4"
          },
          {
            "date": "2026-09-04",
            "track": "Wingatui",
            "race_name": "R5 1200m Hcap",
            "distance": 1200,
            "finish_position": null,
            "margin": null,
            "jockey": null,
            "weight": null,
            "barrier": null,
            "class_conditions": null,
            "field_size": 7,
            "track_condition": null,
            "win_bsp": 7.2,
            "position_at_400": null,
            "position_at_800": null,
            "position_at_settled": null,
            "replay_video": null
          },
          {
            "date": "2026-05-31",
            "track": "Wingatui",
            "race_name": "R7 1400m Hcap",
            "distance": 1400,
            "finish_position": null,
            "margin": null,
            "jockey": null,
            "weight": null,
            "barrier": null,
            "class_conditions": null,
            "field_size": 11,
            "track_condition": null,
            "win_bsp": 12.56,
            "position_at_400": null,
            "position_at_800": null,
            "position_at_settled": null,
            "replay_video": null
          }
        ]
      }
    ]
  },
  "meta": {
    "count": 8,
    "field_size": 8,
    "form_limit": 5,
    "tier": "api",
    "limit": 200,
    "timestamp": "2026-10-22T04:35:24.087Z",
    "rate_limit": {
      "limit": 1000,
      "remaining": 439617,
      "reset": "2026-11-01T00:00:00.000Z"
    }
  }
}
GET/api/v1/racing/ratingsFree tier

KrokBot AI pick detail for a single race — per-runner win probability/rating, field analysis verdicts, and exchange money-flow tip signals, from the picks model store.

Pass the race id straight from /api/v1/racing/meetings — it is mapped internally (picks doc id → the race's board entry → venue + meeting date + race number), so a pick stored under a different id family still resolves. A race with no published pick is a 200 with meta.status='not_modelled' and an empty runners array (NOT a 404); a meeting_id supplied alongside race_id that refers to a different race is a 400. `model` field is deliberately null (internal, not exposed via public API). exchange money-flow tip join is best-effort (venue+raceNumber+sport, disambiguated by jumpTime proximity) — failure degrades gracefully, doesn't fail the request.

Query parameters
NameTypeRequiredDefaultDescription
race_idstringNo–Race id from /api/v1/racing/meetings (a race_key is accepted here too). One race identifier is required.
race_keystringNo–Alternative race identifier, e.g. 2026-10-11_seymour_T_1.
meeting_idstringNo–Optional with race_id (must match or 400); use with race_number when no race id is given.
race_numberintegerNo–Race number within the meeting, used with meeting_id.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/racing/ratings?race_id=abc123"
Example response
{
  "success": true,
  "data": {
    "race_id": "1234567_5",
    "meeting_id": "1234567",
    "race_name": "Turnbull Stakes",
    "race_number": 5,
    "venue": "Flemington",
    "state": "VIC",
    "race_type": "T",
    "jump_time": "2026-09-03T04:35:00.000Z",
    "date": "2026-09-03",
    "tier": "feature",
    "score": 82.4,
    "confidence": "high",
    "top_pick": {
      "slug": "zaaki",
      "name": "Zaaki",
      "bet_link": "https://www.sportsbet.com.au/search?q=Zaaki"
    },
    "runners": [
      {
        "slug": "zaaki",
        "name": "Zaaki",
        "win_prob": 0.31,
        "fair_odds": 3.23,
        "confidence": "high",
        "rank": 1,
        "money_share": 0.28,
        "money_delta": 0.03,
        "rating": 88.5
      }
    ],
    "risk": "low",
    "pick_rationale": "Strong recent form at set weights over 2000m.",
    "track_condition": "Good 4",
    "bestWin": 3.2,
    "bestWinBookmaker": "Sportsbet",
    "value_picks": [],
    "market_mover": null
  },
  "meta": {
    "count": 8,
    "empty": false,
    "tier": "free",
    "race_id": "1234567_5",
    "meeting_id": null,
    "timestamp": "2026-09-03T04:00:00.000Z",
    "rate_limit": {
      "limit": 50,
      "remaining": 942,
      "reset": "2026-10-01"
    }
  }
}
GET/api/v1/racing/runner-formFree tier

A single runner's served race history (form) across thoroughbred/harness/greyhound codes — the live recent-form table unioned with the served results history, each row marked form_source — with joined sectionals and a replay-video resolver.

Served form is a UNION: the live recent-form table (floor 2026-07-12) is merged with the served results history (backfilled to 2018) for the same runner, matched on normalised runner name + racing code. History is unioned in when the recent table runs out (recentCount < limit) or the requested `since` predates the recent floor. Every row carries `form_source` ('recent' | 'history'); a recent row wins a tie. Newest first, capped at `limit`, clamped by the key's historicalDays window. Sectionals join is a single best-effort query per request.

Query parameters
NameTypeRequiredDefaultDescription
runner_slugstringYes–Slugified runner name to look up.
sport_keystring enumNoall three codesOne of racing_T | racing_H | racing_G. Alias: `sport`.
sportstring enumNo–Alias for sport_key.
sincestring (YYYY-MM-DD)No–Only races on/after this date; clamped by the key's historicalDays window.
untilstring (YYYY-MM-DD)No–Only races on/before this date.
limitintegerNo50Max rows returned; capped at 50 (free) / 2000 (api).
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/racing/runner-form?runner_slug=value"
Example response
{
  "success": true,
  "data": [
    {
      "race_id": "2026-08-20_randwick_4",
      "sport_key": "racing_T",
      "runner_slug": "zaaki",
      "date": "2026-08-20",
      "track": "Randwick",
      "race_no": 4,
      "race_name": "Warwick Stakes",
      "distance": 1400,
      "win_result": "Winner",
      "place_result": "Placed",
      "win_bsp": 2.8,
      "tab_number": 5,
      "jockey": "J Bowman",
      "trainer": "A Freedman",
      "barrier": 3,
      "finish_position": 1,
      "margin": 1.2,
      "form_source": "recent",
      "replay_video": null,
      "sectionals": {
        "l600": 34.1,
        "l400": 22.4,
        "l200": 11.3,
        "speed": {
          "early": 58.2,
          "mid": 59.8,
          "late": 61.4,
          "overall": 59.9,
          "peak": 62.1
        },
        "closing_ratio": 1.04,
        "runs_sampled": 8
      }
    }
  ],
  "meta": {
    "count": 1,
    "empty": false,
    "tier": "free",
    "limit": 50,
    "requested_limit": 50,
    "runner_slug": "zaaki",
    "sport_key": null,
    "since": null,
    "until": null,
    "timestamp": "2026-09-03T04:00:00.000Z",
    "rate_limit": {
      "limit": 50,
      "remaining": 942,
      "reset": "2026-10-01"
    }
  }
}
GET/api/v1/racing/runner-statsFree tier

Aggregated career/split stats for a single runner — win/place rates by track, distance, going, track+distance combo, and prep-stage (first-up/second-up/in-prep), plus sectionals and career prize money.

404 with meta.status='not_yet_populated' if no historical record AND no sectionals row exist. When sport_key is omitted, probes racing_T → racing_H → racing_G in order and returns the first with a career record (falls further back to sectionals-only if no fetchRunnerStats hit). An upstream read failure answers 503 with Retry-After: 5 and Cache-Control: no-store — deliberately distinct from the not_yet_populated 404, which now means a genuine absence rather than a failed read.

Query parameters
NameTypeRequiredDefaultDescription
runner_slugstringYes–Slugified runner name to look up.
sport_keystring enumNoprobes all three in orderOne of racing_T | racing_H | racing_G. Alias: `sport`.
sportstring enumNo–Alias for sport_key.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/racing/runner-stats?runner_slug=value"
Example response
{
  "success": true,
  "data": {
    "runner_slug": "zaaki",
    "sport_key": "racing_T",
    "historical": {
      "name": "Zaaki",
      "starts": 34,
      "wins": 11,
      "places": 20,
      "win_rate": 32.35,
      "place_rate": 58.82,
      "avg_win_bsp": 4.1,
      "last_track": "Randwick",
      "last_date": "2026-08-20"
    },
    "career_prize_money": 8420000,
    "sectionals": {
      "avg_l600": 34.5,
      "avg_l400": 22.8,
      "avg_l200": 11.5,
      "closing_ratio": 1.03,
      "avg_speed_early": 57.9,
      "avg_speed_mid": 59.4,
      "avg_speed_late": 61,
      "avg_overall_speed": 59.5,
      "avg_peak_speed": 61.8
    },
    "recent_races": [
      {
        "date": "2026-08-20",
        "venue": "Randwick",
        "finish": 1,
        "position": 1,
        "distance": 1400,
        "speed": 61.2
      }
    ],
    "splits": {
      "by_track": [
        {
          "bucket": "Randwick",
          "starts": 9,
          "wins": 4,
          "places": 6,
          "win_rate": 44.4,
          "place_rate": 66.7,
          "avg_bsp": 3.6
        }
      ],
      "by_distance": [
        {
          "bucket": "1400m",
          "starts": 12,
          "wins": 5,
          "places": 8,
          "win_rate": 41.7,
          "place_rate": 66.7,
          "avg_bsp": 3.9
        }
      ],
      "by_going": [
        {
          "bucket": "Good",
          "starts": 20,
          "wins": 8,
          "places": 13,
          "win_rate": 40,
          "place_rate": 65,
          "avg_bsp": 3.8
        }
      ],
      "by_track_distance": [],
      "by_prep_stage": {
        "first_up": {
          "bucket": "first_up",
          "starts": 6,
          "wins": 2,
          "places": 4,
          "win_rate": 33.3,
          "place_rate": 66.7,
          "avg_bsp": 4.5
        },
        "second_up": {
          "bucket": "second_up",
          "starts": 6,
          "wins": 3,
          "places": 4,
          "win_rate": 50,
          "place_rate": 66.7,
          "avg_bsp": 3.2
        },
        "in_prep": {
          "bucket": "in_prep",
          "starts": 22,
          "wins": 6,
          "places": 12,
          "win_rate": 27.3,
          "place_rate": 54.5,
          "avg_bsp": 4.4
        }
      },
      "class_change": null,
      "avg_days_between_starts": 28,
      "spell_length": 84,
      "form_string": "1-2x14",
      "best_bsp": 2.1,
      "best_bsp_label": "2026-06-14 Rosehill",
      "total_analysed": 34
    }
  },
  "meta": {
    "tier": "free",
    "runner_slug": "zaaki",
    "sport_key": "racing_T",
    "timestamp": "2026-09-03T04:00:00.000Z",
    "rate_limit": {
      "limit": 50,
      "remaining": 942,
      "reset": "2026-10-01"
    }
  }
}
GET/api/v1/racing/sectionalsFree tier

Sectional (split-time) lookup by runner name, race id or venue+meeting_date, without needing a horse profile code — one row per past run from the sectional source table.

Requires one of runner, race_id, or venue+meeting_date (else 400). race_id here is the table's own race key ({date}_{venue-slug}_{code}_{raceNo}, e.g. 2026-10-08_kyneton_T_9), not the numeric /api/v1/racing/meetings race id. Rows newest captured_at first; meta.matched reports rows kept. Empty match is 200 + `data: []` (credit refunded), never 204. The collector identity (`source`, `source_table`) is filtered on but NEVER served. Use /api/v1/racing/sectionals/{horseCode} when you already hold a horse code. Three sources are folded into one row per past run: the split table (the only one carrying an overall time for the start), the race's own in-running positions (settled / 800m / 400m) and 600 m split, and the runner's past-run 600 m split from the card-keyed form feed. split_times.last600_s is the union of the second and third; the form feed's copy is matched on the card race because it carries no race id of its own. split_times also carries the last-200/400/600/800-metre splits of the run (l200_s…l800_s, mirrored onto the last200_s…last800_s names) — a split is served only when the run's own segment times tile that whole closing window, so a run with a gap in it, or without a segment reaching the finish, answers null for that split rather than a number that is too fast; l600_s (and its last600_s mirror) is ALWAYS the derived sum of the three trailing 200 m segments, so every run has exactly one 600 m definition; the form feed's own published 600 m figure measures about 2.5 s longer on the same run and is a different quantity, so it is not served and a run that carries only that figure is not returned. split_ranks ranks each of those splits within the race field (1 is fastest, ties share the rank) and is filled only when the request names a race — a runner-only lookup serves nulls there. section_ranks carries the source's own per-segment rank where it publishes one. distance_points includes the run's finishing position where the form carries one. A run filed by the past-form collector and dated before 2026 serves no ladder at all: that collector publishes one set of segment times for the whole race (the winner's), so split_times and split_ranks are null on those rows and only the runner's own finish, margin_lengths and sp are served. meta.pre2026_run_level_split_rows reports how many rows that withheld.

Query parameters
NameTypeRequiredDefaultDescription
runnerstringNo–Runner name, case-insensitive, partial match.
race_idstringNo–Race key as used by this table: {date}_{venue-slug}_{code}_{raceNo}.
venuestringNo–Venue slug; use with meeting_date.
meeting_datestring (YYYY-MM-DD)No–Meeting date; use with venue. `date` is accepted as an alias.
race_numberintegerNo–Narrow to a single race (1-30).
sourcestringNo–Internal collector filter — narrows rows to a single collector; never echoed in the response.
limitintegerNo100Max rows; capped at 100 (free) / 1000 (api).
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/racing/sectionals?runner=value"
Example response
{
  "success": true,
  "data": [
    {
      "id": "2026-10-08_kyneton_T_9__1__2026-08-25__7",
      "runner_name": "Strike Gold",
      "jockey": "Chelsea Jokic",
      "trainer": "Tim Fitzsimmons",
      "tab_number": 1,
      "barrier": 6,
      "race_id": "2026-10-08_kyneton_T_9",
      "venue_slug": "kyneton",
      "meeting_date": "2026-10-08",
      "race_number": 9,
      "race_code": "T",
      "finish": 2,
      "margin_lengths": 1.2,
      "sp": 4.5,
      "captured_at": "2026-10-10T11:13:43Z",
      "split_times": {
        "overall_s": 59.1,
        "last800_s": 45.2,
        "last600_s": 34.2,
        "last400_s": 23,
        "last200_s": 11.6,
        "l800_s": 45.2,
        "l600_s": 34.2,
        "l400_s": 23,
        "l200_s": 11.6,
        "avg_speed": null
      },
      "split_ranks": {
        "l800_s": 3,
        "l600_s": 1,
        "l400_s": 2,
        "l200_s": 2
      },
      "section_ranks": {
        "800m": 1,
        "600m": 4,
        "400m": 2,
        "200m": 2,
        "finish": 1
      },
      "distance_points": [
        {
          "metres": 800,
          "label": null,
          "position": 4
        },
        {
          "metres": 400,
          "label": null,
          "position": 3
        },
        {
          "metres": null,
          "label": "finish",
          "position": 2
        }
      ]
    }
  ],
  "meta": {
    "count": 1,
    "runner": "Strike Gold",
    "matched": 1,
    "tier": "api"
  }
}
GET/api/v1/racing/sectionals/{horseCode}Free tier

Sectional times (L600/L400/L200, speed map) and profile (condition splits, first/second/third-up stats, sire progeny) for a horse, keyed by the horse's own profile code.

404 if BOTH the sectionals and the profiles record are missing for that code. Cache 600s — sectionals are backfilled post-race and slow-moving. Uses the shared _shared.ts authorizeRacing() with default feature 'racing'.

Path parameters
NameTypeRequiredDefaultDescription
horseCodestringNo–The horse's profile code (alphanumeric/underscore/hyphen, 1-64 chars); 400 if it fails that pattern.
Example request
curl \
  -H "X-API-Key: YOUR_KEY" \
  "https://krokodds.com.au/api/v1/racing/sectionals/H123456"
Example response
{
  "success": true,
  "data": {
    "horse_code": "h284719",
    "name": "Zaaki",
    "sectionals": {
      "run_count": 8,
      "l600": 34.1,
      "l400": 22.4,
      "l200": 11.3,
      "speed": {
        "early": 58.2,
        "mid": 59.8,
        "late": 61.4,
        "overall": 59.9,
        "peak": 62.1
      },
      "closing_ratio": 1.04
    },
    "profile": {
      "condition_splits": {
        "firm": "2:1-0-1",
        "good": "24:9-5-3",
        "soft": "6:1-2-1",
        "heavy": "2:0-0-1",
        "wet": "8:1-2-2"
      },
      "first_up": "6:2-0-1",
      "second_up": "6:3-1-0",
      "third_up": "5:1-1-1",
      "winning_range": "1400m-2000m",
      "days_since_last_win": 96,
      "career_stats": "34:11-9-6",
      "sire_progeny_dry": "412:78-65-59",
      "sire_progeny_wet": "88:14-11-9"
    }
  },
  "meta": {
    "tier": "free",
    "timestamp": "2026-09-03T04:00:00.000Z",
    "rate_limit": {
      "limit": 50,
      "remaining": 942,
      "reset": "2026-10-01"
    }
  }
}

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.

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.