Skip to content
Racing data

Horse racing odds API: prices with context

Learn how RacingAPI.net delivers observed horse racing odds with timestamps, price formats, missing-price handling and useful context for own-site comparison.

Published 30 Oct 2026Updated 30 Oct 20267 min read

Illustrative RacingAPI.net diagram for Horse racing odds API: prices with context

If you are building an odds display, a price-comparison view or a runner card that needs more than a single headline figure, RacingAPI.net gives you bookmaker price observations with enough context to use them sensibly. The odds feed is designed to preserve the source price string exactly as observed, alongside bookmaker identity and the race the price belongs to, so you can present what was seen rather than normalising it away.

That matters because racing prices are not a single fixed truth. A runner may have several bookmaker quotes, some may be absent, and some may be suspended or temporarily unavailable. RacingAPI.net does not promise every bookmaker for every race or runner. Instead, it gives you a practical feed for own-site display, comparison and decision support, with the right boundaries around provenance, freshness and missing data.

Try the documented request

Use the race ID from the matching racecard. Keep bookmaker identity and the supplied price observation time alongside the odds.

# Set RACINGAPI_KEY on your server; use IDs returned by the feed.
# FEED_DATE must be YYYY-MM-DD in the feed context you want.
curl --fail-with-body --max-time 15 --get \
  "https://racingapi.net/v1/odds/${RACE_ID}" \
  -H "X-API-Key: ${RACINGAPI_KEY}" \
  --data-urlencode "region=uk" \
  --data-urlencode "date=${FEED_DATE}" \
  -H "Accept: application/json"

Run this on your server, not in public browser code. Replace the environment variables before running it. Respect the response cache headers and Retry-After; do not retry failed requests without a limit.

Check all parameters and response fields

Compare the full API services and integration options

What the odds feed contains

The odds endpoint is /v1/odds/{raceId}. It returns bookmaker prices observed in the live UK feed for a selected race. The useful point is not just the price itself, but the surrounding identifiers that let you map each quote back to the race and runner you are already showing elsewhere on your site.

Each observed price includes raceId, horseId, bookmaker, bookmakerId, price and eachWay. That is enough to build a quote table, a runner summary row or a price badge without inventing extra structure. Because the source price string is preserved, you can display the feed exactly as received instead of trying to infer whether it should be treated as fractional or decimal before you have checked the original format.

  • Endpoint: /v1/odds/{raceId}
  • Observed bookmaker prices for a single race
  • Preserved source price string
  • Bookmaker and runner identifiers included
  • Each-way flag present where supplied

Handling fractional and decimal price formats

Racing users often expect to see prices in the format they are familiar with, and the safest approach is to respect the source string first. RacingAPI.net preserves the observed price representation, which means your front end can show the bookmaker quote as captured rather than forcing a conversion at ingest time.

In practice, that gives you freedom. You can render the returned string directly for a racing audience that expects fractional notation, or you can convert it in your own application layer if your design uses decimal odds as the primary view. The important rule is to keep the original value available somewhere, because that is the best way to avoid accidental rounding, normalisation errors or disputes over what was actually published.

  • Keep the returned price string intact
  • Convert only when your own UI needs a different presentation
  • Avoid overwriting the source representation in storage
  • Use the bookmaker identifier if you need consistent sorting or grouping

Why timestamp provenance matters

An odds feed is only useful if you can explain where the number came from and when you saw it. RacingAPI.net provides observed bookmaker prices, which means the value reflects a captured feed state rather than a guaranteed live quoting window. That distinction helps you design a more honest user experience.

For own-site display, provenance is as important as the headline price. If you cache responses, store the time you received them and keep that separate from the bookmaker's own publication timing if you have it. That way, your interface can say whether a price is current in your cache, recently observed, or simply the latest value your application has retrieved. This avoids presenting stale data as if it were instantaneous and helps you handle personal or session-specific views without leaking reused responses into the wrong context.

  • Treat the feed as observed data, not a guaranteed live market snapshot
  • Store your own retrieval time separately from the quoted price
  • Use cache-aware design so your interface can explain age clearly
  • Do not confuse source cadence with network response time

Missing and suspended prices are normal

In racing, the absence of a price is often just as meaningful as the presence of one. A runner may be suspended, temporarily unavailable or not quoted by a particular bookmaker. RacingAPI.net does not guarantee that every bookmaker will appear for every runner, so your application should treat missing entries as a valid state rather than an error condition.

A good pattern is to distinguish between no data, no quote and suspended quote. If a runner has no price in the feed, show that plainly instead of forcing a default. If your UI already displays bookmaker rows, keep them stable when a price disappears so users can see that the market has changed. This is especially important on race day, when quote availability can change quickly and a blank cell may be more useful than a misleading placeholder.

  • No quote is not the same as an error
  • Suspended runners should be shown as unavailable, not invented values
  • Keep row layout stable when prices drop out
  • Do not assume complete bookmaker coverage for every race

Using the feed for own-site comparison

The most practical use of the odds feed is comparison on your own site. Because the API is intended for customer display use, you can combine odds with racecards or runner profiles to build a clean comparison surface that helps visitors understand the market context without claiming to be a full exchange or complete bookmaker census.

A sensible comparison view shows the runner name, the observed bookmaker, the price format as returned, and a clear source note. If you aggregate several quotes, be explicit about scope: your table may be useful for comparing the prices RacingAPI.net observed, but it should not imply complete market coverage. That makes your product more trustworthy and avoids over-claiming completeness that the feed does not promise.

  • Use the odds feed as context, not a universal market guarantee
  • Pair prices with runner names from your own race view
  • Show the source note or timestamp near the comparison
  • Make incomplete coverage obvious rather than hidden

Storage, display and cache behaviour

If you persist odds, store the original price string, the bookmaker identifiers and your retrieval timestamp together. That gives you a reliable audit trail for both UI rendering and debugging. It also makes it easier to rebuild a comparison table later without guessing which data came from the source and which part you derived locally.

For delivery, keep caching intentional. Reuse can reduce repeated round trips, but cached odds should never be presented as if they were live without a freshness cue. If you are rendering a public page, separate shared cache logic from personalised user views so one user's selection or browsing context does not leak into another's page. That is particularly relevant when a race is moving quickly and a price may change between visits.

  • Persist source string, bookmaker ID and fetch time together
  • Add a freshness label if you cache the response
  • Separate shared cache use from user-specific presentation
  • Rebuild price tables from stored source values, not guesses

Implementation boundaries you should design around

RacingAPI.net access requires a completed card-required seven-day trial checkout or an active subscription, and requests are made to https://racingapi.net with your X-API-Key header. Monthly usage is counted across keys, and the quota resets on the first day of the calendar month in UTC. Those account rules matter because odds tables tend to be polled more frequently than static racecard content.

At the product level, the odds feed is one part of a wider racing API, not a promise that every runner will always have a quote. Build your application to tolerate partial data, preserve what you received, and explain freshness clearly. If you do that, your own-site odds view will stay accurate even when bookmakers, suspensions or feed timing make the market incomplete for a moment.

  • Call the API from your own server with X-API-Key
  • Plan for repeated polling within your plan limits
  • Keep partial markets functional
  • Surface context, not just bare numbers

Key takeaways

  • Use /v1/odds/{raceId} as an observed bookmaker-price feed, not a promise of complete market coverage.
  • Preserve the source price string and your own retrieval timestamp so fractional, decimal and freshness context remain accurate.
  • Design your UI to handle missing or suspended prices cleanly, with clear source notes and stable comparison layouts.

Feed-family explorer

What each family covers, with links to the documentation that defines it. Plan availability is listed on the pricing page.

Racecards

All plans
  • UK and Irish meetings, races and declared runners
  • Supplied identifiers for joining detail requests
  • Going, distance and race context as supplied
Read the docs

Frequently asked questions

Does the odds endpoint return every bookmaker for every runner?

No. RacingAPI.net does not guarantee complete bookmaker coverage for every race or runner. The feed returns bookmaker prices observed in the live UK feed, so missing quotes should be treated as normal rather than as a failure.

Should I display the returned price exactly as received?

Yes, that is usually the safest approach. The source price string is preserved, so you can display the bookmaker quote without losing its original representation. If your own UI prefers decimal or fractional format, convert in your presentation layer while keeping the original value stored.

How should I show suspended or missing prices?

Treat them as a valid market state. A suspended runner or an absent quote should be shown as unavailable or missing, not replaced with a fake number. If you are using rows or cards, keep the layout stable so users can tell that the market changed.

Can I use the odds feed on my own site for price comparison?

Yes. The feed is suitable for own-site display and comparison, provided you are clear that you are showing observed prices from RacingAPI.net rather than claiming full bookmaker market coverage. Pair the odds with your own race context and a freshness indicator if you cache results.

What should I store if I want to audit the price later?

Store the original price string, the raceId, horseId, bookmaker and bookmakerId, plus the time your application retrieved the data. That gives you a clean provenance trail and makes it easier to explain exactly what your system saw at the time.