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 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. 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 every observation in the window, reported to the nearest whole millisecond — the resolution the probe records at. Nothing is rounded to a coarser grid, smoothed or interpolated: what the probe timed is what the table shows, which is why published p95 values are things like 243 ms, 286 ms and 521 ms rather than multiples of 5. Mean and max 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 (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 — 2026-09-13 for the current run, the publication date for frozen runs — and every table that shows a price carries that date. Prices are re-probed separately from the measurements, every change is logged in the runs changelog, and a frozen run keeps the price in force when it was published. Prices are not independently verified; we do not measure licensing, data quality or suspension behaviour.
Changes
- 1.2 (2026-09): coverage expanded to 32 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.