FormFav LogoFormFav
    Premium tier

    Horse Racing Odds API

    Live win and place prices for every runner, per bookmaker, as JSON — with opening, high and low prices and the market's recent moves. Horse, harness and greyhound racing, built to poll right up to the jump.

    What's in a Racing Odds Response

    The price you can take now, where the market has been, and which bookmaker is quoting it.

    Win & Place, Fixed & Tote

    Current win and place prices for every runner, one entry per bookmaker and market type. A book quoting both fixed and tote markets appears twice, so you always know which price you are reading.

    Market Moves Included

    Where a bookmaker publishes it, each quote carries its opening, high and low win prices and up to 20 recent moves, timestamped by the bookmaker. No need to poll and store your own history to see a market shift.

    Built for Polling

    Just runners and their quotes: no form or statistics to re-download every few seconds. Cached for 5 seconds at the edge, so polling every 5–10 seconds into the jump is cheap on both sides.

    The Same Parameters as Race Form

    Prices take the date, track and race number you already use for race form and results, so any race you fetch can be priced with the identical query string.

    One Request, Every Bookmaker's Price

    Pass the date, track and race number and get each runner back with a quote from every bookmaker pricing it. The payload is deliberately small, so a market can be polled every few seconds.

    • win and place: the prices on offer now, withheld once a quote goes stale
    • open, high and low: the win market's range, where the bookmaker publishes it
    • close: the last win price quoted, which becomes the closing price after the jump
    • movements: up to 20 recent win-price changes, oldest first
    • startingPrice: that bookmaker's own settled price, once published
    • stale: true when a quote is older than the freshness allowance
    • scratched: withdrawn runners stay in the response, flagged
    GET /v1/prices?date=2026-08-25&track=Gloucester%20Park&race=9&race_code=harness
    {
      "track": "Gloucester Park",
      "raceNumber": 9,
      "raceCode": "harness",
      "startTime": "2026-08-25T13:36:00Z",
      "runners": [
        {
          "number": 1,
          "name": "Fireball Friday",
          "scratched": false,
          "prices": [
            {
              "bookmaker": "tab",
              "marketType": "fixed",
              "win": 8.5,
              "place": 2.6,
              "open": 12.0,
              "high": 12.0,
              "low": 8.0,
              "movements": [
                { "price": 12.0, "at": "2026-08-25T08:02:11Z" },
                { "price": 9.5, "at": "2026-08-25T09:47:52Z" },
                { "price": 8.5, "at": "2026-08-25T10:16:33Z" }
              ],
              "stale": false
            }
          ]
        }
      ]
    }

    Trimmed for length. The full response also carries the date, country, timezone, runner count and each quote's capture time.

    International Racing Odds Coverage

    Prices follow the bookmakers FormFav reads rather than any one racing jurisdiction, so coverage is broad: horse, harness and greyhound odds wherever the covered bookmakers are pricing. Each quote is labelled with the bookmaker it came from, and coverage grows as sources are added.

    International racingThoroughbred · Harness · GreyhoundFixed & tote markets

    Before the Jump, and After It

    Before the market is up

    A race that none of the covered bookmakers is pricing yet returns 200 with empty prices arrays, not a 404. "The market is not up yet" is a real answer, and it changes on its own, so keep polling on a slow cadence until quotes appear.

    Into the jump

    The freshness allowance tightens as the start approaches. Poll every 5–10 seconds through the last few minutes: close to the off the books themselves are read every 3–5 seconds, and a late market can cross a price several times in under a minute.

    After the jump

    Prices stop moving when a race jumps, and there are no in-running prices. Each quote is then served as stale, with its live win and place prices dropped, while the record stays: open, close, high, low, movements and, once published, that bookmaker's starting price.

    Also on Premium

    Everything in Pro, plus race day as it happens.

    Live scratchings and start times

    A scratching or a changed start time reaches race form when it is declared, instead of waiting for the next batch run, so the runners you price are the runners that jump.

    Track condition and weather

    Going and weather changes update as they are published by the bookmaker sources, instead of waiting for the next batch run.

    Real-time results

    Positions arrive as races settle, tagged interim or correct weight, with the same prices inline on each result.

    Horse racing results API →

    What People Use Live Odds For

    Watch a market move

    See where a runner opened, its top and bottom prices and the last moves before the jump, bookmaker by bookmaker.

    Set your model against the market

    Pro's win and place predictions (beta) give every runner a probability. Compare them with live prices to see where your view and the market's part ways.

    Horse racing predictions API →

    Keep closing prices

    Record each bookmaker's closing and starting price next to your own selections, for reviewing your analysis later.

    Premium is for personal, non-commercial use. Planning a commercial product? Talk to us first.

    Horse Racing Odds API FAQ

    Live Odds from $50 a Month

    Premium includes everything in Pro, plus live bookmaker prices, real-time results and live scratchings. Start with a free key to try race form and career stats, and upgrade when you need the market.