Methodology
Version 1.2 · applies to run 2026-09 onward · methodology
Every provider is measured with the same open-source probe, from the same two servers, over the same 7-day window, against the same reference events. We publish per-provider summary statistics — percentiles, error rate and sample size — as CSV and JSON for every run, so each figure can be checked against the file it comes from.
How providers are selected
- Every book's own direct feed where one is sold: Pinnacle, Sportradar's Unified Odds Feed (the Betradar reference) and ODDIN.GG. These are contract-only and are shown for reference, not as purchasable plans.
- Every self-serve plan that includes a live push stream, found by reading the vendor's own pricing page. A vendor enters the set when that plan exists, and leaves it if the plan is withdrawn or turns out not to be a full live-odds feed.
- Enterprise-only feeds at the same books (LSports, OddsMatrix, OpticOdds, Unabated and others), measured for reference where access could be arranged.
- The result is uneven by book: Pinnacle has the most resellers publishing self-serve push plans, so its cohort is the largest; Betradar (Sportradar) has one. The spread reflects who actually sells access, not which feed we would prefer to show.
What we measure
- Line-change latency (primary metric)
- Time from a sportsbook changing a price to that new price being observable in the provider's feed. Detection: an independent reference probe watches the sportsbook's own public odds surface for the reference event set. When a price changes, we record T0. Each provider feed is then watched for the first message or poll response containing the same new price for the same market; that is T1. Latency = T1 − T0. Changes not seen in a provider feed within 120 s are counted as missed and excluded from percentiles but reported in the error rate.
- Response time
- For REST: request sent → last byte of a valid JSON body, connection reused (warm). For SSE/WebSocket: initial handshake to first data frame. Not applicable to AMQP push feeds. Cold-connection TTFB is recorded in the raw data but not shown in the headline table.
- Value score eligibility
- Value score = line-change p95 (ms) × monthly price of the cheapest compliant unlimited push tier ($) ÷ 1,000, lower is better. A feed is only ranked when its measured p95 is 1,000 ms or better and the priced tier carries every sportsbook the vendor advertises for that product. Subset tiers are published with their scope and excluded from the ranking; so are feeds too slow to be used for in-play alerts.
- Live in-play / Pre-match / Neither
- Whether the measured feed carries odds while an event is running. Live = in-play line changes observed. Pre-match = the vendor states no in-play coverage, so only pre-match markets were measured. Neither = the product carries no odds feed of its own (props, picks or affiliate products).
- Unlimited real-time push (price column)
- The vendor's published monthly price for the widest self-serve tier that includes an unmetered WebSocket or SSE stream of live line changes, with any required add-on summed. A dash means no compliant plan is published: REST-only, credit- or stream-hour metered, pre-match only at every push tier, enterprise/quote-only, or no unlimited tier at all. scope-limited marks a published price whose tier carries only part of the vendor's advertised book list; those rows keep their price, state the scope, and are excluded from the value ranking.
- Value score eligibility
- A priced feed is ranked only when its measured line-change p95 is 1,000 ms or better and its priced tier carries every book the vendor advertises. A cheap price on a feed that cannot track a line move, or that covers a fraction of the books, is not a value claim.
- Error rate
- Share of probes or expected messages that timed out (>10 s), returned 5xx, returned malformed JSON, or missed a reference line change. Reported per vantage.
How we test
- Vantages: AWS us-east-1 (c7g.large, Virginia) and Hetzner FSN1 (CPX31, Falkenstein). Clocks disciplined with chrony against the same stratum-1 sources; drift held under 1 ms.
- Window: 7 consecutive days, continuous, including at least two weekend days with major in-play volume.
- Reference events: 40 fixtures per run across NFL, NBA, EPL, MLB and CS2/LoL (for ODDIN feeds), selected 48 h before the window starts and published in the run CSV.
- Markets: moneyline, spread/handicap, total. Pre-match and in-play both included and tagged.
- Polling: REST feeds are polled at the fastest interval the provider's plan permits without rate-limit errors; the interval is stated in the Feed column. Push feeds are held open continuously with automatic reconnect.
- Sample size: minimum 8,000 observed line changes per provider per vantage; rows with fewer are marked and excluded from "fastest" verdicts.
- Percentiles: nearest-rank p50 and p95 over all observations in the window, rounded to the nearest 5 ms; mean, max and the unrounded percentiles are in the per-provider data. No outlier removal.
- Credentials: OddsBench pays for every key at the stated tier. Free tiers are used only where a provider offers no paid self-serve plan, and are labelled.
Known limitations
- Two vantages, not global. Your latency will differ with your location and peering.
- The reference probe itself has latency (measured at 60–140 ms to Pinnacle's public surface); it is identical for all providers so rankings are unaffected, but absolute numbers include it.
- Enterprise feeds (Sportradar UOF, official Pinnacle API) may offer faster commercial tiers than the ones we could purchase.
- We measure speed and reliability. Price and book coverage are taken from the vendor's own published pricing and coverage pages on a stated date, are shown with that basis, and are not independently verified; we do not measure licensing, data quality or suspension behaviour.
Changes
- 1.2 (2026-09): coverage expanded to 34 feeds; missed-change threshold set at 120 s.
- 1.1 (2026-08): added EU-Central vantage; added value-score eligibility rules (published tier must carry every advertised book, p95 ≤ 1,000 ms).
- 1.0 (2026-07): first public run, 11 feeds, US-East only.