Skip to content
RealTimeBets

How to Choose a Live Odds API by Delivery, Pricing and Coverage

7 min read

Developer at a desk with live data dashboards

To choose a live odds API, compare four things: push or polling delivery, what each payload contains, whether the vendor prices and settles markets itself, and the monthly cost at your real volume. Test all four in a sandbox.

This guide works through each criterion with numbers you can check, shows what a signed webhook looks like, and ends with a comparison of RealTimeBets and four established vendors based only on what those vendors publish. If you already know what you need, the live odds API page lists our endpoints, plans and sandbox terms.

Start with the job, not the vendor

A live odds API serves very different buyers, and the right choice depends on which one you are:

  • A licensed sportsbook needs its own prices, suspension, settlement and risk controls, delivered fast enough to take bets on them.
  • An odds comparison or media site needs clean, current odds to display, plus widgets it can embed without building a front end.
  • A developer building analytics or trading tools needs a predictable stream, a clear schema and historical price ticks.

A feed that aggregates other bookmakers' odds is fine for display. It is not a pricing engine: it cannot suspend a market when a goal goes in, and it will not tell you who won. Decide which of those you need before reading any pricing page.

Push versus polling, with the request math

Polling means your server asks for prices on a timer. Push means the vendor sends prices over a streaming connection as they change. The difference is clearest in request counts.

Suppose you track 20 live events and want each price no older than one second.

ApproachRequests per secondRequests per hourRequests for a 2-hour evening
Poll each event every 1 s2072,000144,000
Poll each event every 5 s414,40028,800
Poll one batch endpoint for all 20 every 1 s13,6007,200
Streaming push, one connection0 after connectA handful (connect and reconnects)A handful

At one request per event per second, a 500,000-request monthly quota (our Starter plan) is gone in about 6.9 hours of live play (500,000 / 72,000). Polling every five seconds stretches that to about 35 hours, but now your prices can be five seconds old, which is too stale for in-play betting.

Polling has a second cost that request counts do not show. Most polls return nothing new. And when something does change, you only see it on the next tick, so your worst-case staleness equals your polling interval plus the response time.

Push solves both. The RealTimeBets stream is a server-sent events connection for one event that pushes the full market set once a second. A connection lasts up to 60 seconds, then you reconnect, and each connection counts as one request. Plans also cap open streams: Starter 2, Growth 10, Enterprise 50. Use REST for catalogue lookups and recovery. Use push for everything live.

What a good payload contains

The schema decides how much code you write. Look for these fields on every price update:

  • Stable identifiers for event, market and selection, so you can update in place.
  • Market status (for example open or suspended) on the same message as the price. A price without a status is dangerous: you cannot tell whether bets should be accepted.
  • Decimal price and implied probability, so you never compute one from the other with rounding drift.
  • A timestamp of the change and, for in-play, the match clock at that moment.
  • A way to recover after a gap, either a sequence number per event or a full market set on every push, so a lost message never leaves you on an old state.
  • Window boundaries on micro-markets (start and end on the match clock), so settlement can be checked independently.

RealTimeBets payloads carry stable keys, an open or suspended status, decimal price and probability, a lock time and window boundaries on micro-markets. There are no sequence numbers: each push is the full market set, so a missed push is replaced by the next one a second later. Sandbox payloads carry "sandbox": true so test data can never be mistaken for production. The full schema is on the public API docs.

Signed webhooks with HMAC SHA-256

Settlement results should come to you, not the other way round. A webhook does that, but any public endpoint can receive forged requests, so the body must be signed.

The standard pattern, and the one RealTimeBets uses, is HMAC SHA-256:

  1. When you create a webhook, you receive a secret that only you and the vendor know.
  2. For each delivery, the vendor computes HMAC SHA-256 with that secret and sends the result in a header. RealTimeBets signs {timestamp}.{raw body} and sends X-RTB-Signature: t={timestamp},v1={signature}.
  3. Your server computes the same value over the raw body it received and compares the two in constant time.
  4. If they differ, or the timestamp is older than 5 minutes, reject the request. If they match, store the event and acknowledge quickly.

In Python the check fits in a few lines:

import hmac, hashlib, time

def is_valid(raw_body: bytes, header: str, secret: bytes) -> bool:
    parts = dict(p.split('=', 1) for p in header.split(','))
    signed = parts['t'].encode() + b'.' + raw_body
    expected = hmac.new(secret, signed, hashlib.sha256).hexdigest()
    fresh = abs(time.time() - int(parts['t'])) < 300
    return fresh and hmac.compare_digest(expected, parts['v1'])

Three details catch teams out. Compute the signature over the raw bytes, not over parsed and re-encoded JSON, which may reorder keys. Use a constant-time comparison. Make the handler idempotent, because retries mean the same settlement can arrive twice. Ask any vendor whether failed deliveries are retried and whether you can see a delivery log with response codes. RealTimeBets tries each delivery up to 3 times, and a "Send test event" button in the console checks your endpoint.

Coverage, read carefully

Coverage claims are where comparisons get slippery. A large number of leagues is not useful if the sport you trade only has pre-match prices, or if in-play updates arrive with gaps. Ask three questions for each sport you care about:

  • Is it covered in-play, or pre-match only?
  • Which market types exist in-play, and are micro-markets among them?
  • Does the vendor settle those markets, or only display prices?

The RealTimeBets engine today prices soccer, basketball, tennis, American football, ice hockey, baseball and CS2. Starter covers 3 sports of your choice, Growth and Enterprise cover all of them including esports. Event data (scores, incidents, clock, lineups) is described on the sports data API page.

Evaluate in a sandbox, not a sales call

The fastest way to compare vendors is to connect to each and measure. A useful evaluation takes an afternoon:

  1. Get a sandbox or trial key.
  2. Subscribe to one live event and log every message with your own receive timestamp.
  3. Watch a goal or a point. Did a suspended status arrive before the new price?
  4. Kill your connection for 30 seconds. Can you recover a complete, current state after you reconnect?
  5. Point a webhook at a test endpoint and verify the signature with your own code.
  6. Price your real volume against each plan, including connections, not just requests.

The RealTimeBets sandbox key is issued right after signup. It is delayed by 60 seconds, covers 1 sport, allows 1,000 requests and lasts 7 days, and every payload is marked as sandbox. Production keys need a stored licence record (licence number, regulator, country) and a paid plan.

How the main options compare

The table uses only what each vendor states publicly at the time of writing. Terms change, so check each vendor's own pages before you decide.

VendorPublished pricingDeliveryOwn pricing and micro-marketsSettlementOnboarding
The Odds APIFree 500 credits, $30 to $249 per monthPollingNo, aggregated bookmaker oddsNoSelf-serve
SportsDataIONot publishedNot compared hereNot compared hereNot compared hereTrial, then sales
OpticOddsNot publishedReal-time pushBuilt for large booksNot compared hereSales form
SportradarEnterprise contractsNot compared hereOfficial data and trading servicesNot compared hereLong contracts, slower onboarding
RealTimeBets$499, $1,999, $4,999 per month (half when billed yearly)REST plus streaming pushYes, model-based pricing, micro-markets from GrowthYes, signed webhooks on every planSelf-serve, sandbox key at signup

Each vendor fits a different buyer. The Odds API is a low-cost choice for displaying aggregated odds. SportsDataIO is known for broad data. Sportradar offers official data and full trading services on enterprise terms. RealTimeBets fits licensed operators and developers who want their own live prices, micro-markets and settlement with published plans and no sales process. Plan details are on the pricing page.

Questions about live odds APIs

Is polling ever good enough?

For pre-match odds or a page that refreshes every minute, yes. For in-play betting, polling either burns requests or leaves prices stale, so streaming push is the better fit.

What should I check first in a sandbox?

Watch one live incident. The suspended status should arrive before the new price, and every message should carry a status and a timestamp, and you should be able to rebuild the full state after a reconnect.

Why sign webhooks if the endpoint uses HTTPS?

HTTPS protects the data in transit, but anyone can still send a request to your endpoint. The HMAC SHA-256 signature proves the vendor sent it and the body was not changed.

Do I need a gambling licence to use a live odds API?

For real-money use, yes, in every jurisdiction where you take bets. RealTimeBets issues production keys only after a licence record is stored. The sandbox needs no licence.

How do I estimate my monthly request volume?

Multiply events by polls per second by seconds of live play, then add snapshot and catalogue calls. With streaming push, count one request per connection (RealTimeBets connections last up to 60 seconds per event) and keep REST for recovery.