How to Choose a Live Odds API by Delivery, Pricing and Coverage
7 min read
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.
| Approach | Requests per second | Requests per hour | Requests for a 2-hour evening |
|---|---|---|---|
| Poll each event every 1 s | 20 | 72,000 | 144,000 |
| Poll each event every 5 s | 4 | 14,400 | 28,800 |
| Poll one batch endpoint for all 20 every 1 s | 1 | 3,600 | 7,200 |
| Streaming push, one connection | 0 after connect | A 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:
- When you create a webhook, you receive a secret that only you and the vendor know.
- 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 sendsX-RTB-Signature: t={timestamp},v1={signature}. - Your server computes the same value over the raw body it received and compares the two in constant time.
- 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:
- Get a sandbox or trial key.
- Subscribe to one live event and log every message with your own receive timestamp.
- Watch a goal or a point. Did a suspended status arrive before the new price?
- Kill your connection for 30 seconds. Can you recover a complete, current state after you reconnect?
- Point a webhook at a test endpoint and verify the signature with your own code.
- 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.
| Vendor | Published pricing | Delivery | Own pricing and micro-markets | Settlement | Onboarding |
|---|---|---|---|---|---|
| The Odds API | Free 500 credits, $30 to $249 per month | Polling | No, aggregated bookmaker odds | No | Self-serve |
| SportsDataIO | Not published | Not compared here | Not compared here | Not compared here | Trial, then sales |
| OpticOdds | Not published | Real-time push | Built for large books | Not compared here | Sales form |
| Sportradar | Enterprise contracts | Not compared here | Official data and trading services | Not compared here | Long contracts, slower onboarding |
| RealTimeBets | $499, $1,999, $4,999 per month (half when billed yearly) | REST plus streaming push | Yes, model-based pricing, micro-markets from Growth | Yes, signed webhooks on every plan | Self-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.