How it works
Integrate in an afternoon.
Get a key, call one endpoint, render matched opportunities. The hard parts — coverage, matching, rating, liquidity gating — are already done on our side.
$ curl api.oddsrelay.io/v1/odds/standard?region=uk \
-H "Authorization: Bearer or_live_••••••••••••"GET 200 · application/json
{
"event": "Arsenal v Chelsea",
"sport": "football",
"region": "uk",
"market": "match_odds",
"selection": "Arsenal",
"back": { book: "bet365", odds: 2.1 },
"lay": { exchange: "exchange", odds: 2.12 },
"rating": 98.1,
"updated_at": "2026-07-01T14:08:22Z"
}- 01source
source-direct coverage
60+ books, bet365 included
- 02
normalise
one shape, every book
- 03
match vs exchange lay
back paired to lay
- 04
rate & gate
scored, liquidity-checked
- 05
your endpoint
one authenticated call
The source node is a black box by design — we describe what we deliver reliably, never how.
01 — From key to shipped
Four steps, no matching engine.
Get a key
Start a free trial — the full UK product, bet365 included, for 14 days — or enquire for a paid key. Keys are or_live_* / or_test_*, sent as a Bearer token and scoped to the feed types and regions you need.
Call one endpoint
One authenticated GET, one of seven matcher types, a region filter. Predictable JSON, gzip on the wire, an ETag on every response. No SDK required — it is a plain REST call.
Render the opportunities
The response is already matched: each row is a back/exchange-lay pair with a rating, and qualifying loss and profit computed. You render rows — there is no matching engine to build.
Ship and stay efficient
Send If-None-Match to get cheap 304s, accept gzip, and poll on the matcher cycle. The OpenAPI spec and the API docs cover the full envelope, scopes and rate limits.
02 — Anatomy of an odds object
Every row, already matched.
Hover a field to see what it carries. The full envelope, every field, the seven types, scopes and rate limits live in the API docs.
{
}event
The fixture, normalised across every book so rows line up 1:1.
Every row is normalised and matched — same event, same market, both sides aligned.
Illustrative shape only — read the API docs for the complete reference.
Freshness, honestly
The feed refreshes on the matcher cycle — every few seconds, not per request. Poll on that cadence rather than hammering the endpoint: send If-None-Match and you get a cheap 304 until the board actually changes. Live freshness, uptime and latency are published on the coverage dashboard.
Try the real thing
A free trial gives you the full UK feed, bet365 included, for 14 days. Wire it into your product and see the matched rows for yourself.