Specific uptime targets, support response times, and remedies are defined per agreement for B2B customers. Contact contact@55-tech.com to discuss SLA terms for your use case.
Live status & incident history
Real-time platform status, ongoing incidents, and historical uptime are published on our status page:OddsPapi Status Page
Live availability, incident reports, and uptime history — subscribe for updates.
Architecture for availability
The platform is designed so that no single failure should interrupt your data flow:- WebSocket-first delivery — a persistent gateway streams updates with minimal latency, avoiding the overhead and gaps of REST polling.
- REST + WebSocket redundancy — REST snapshots and the realtime stream are independent paths to the same data. If the stream drops, REST keeps your state current.
- Resume & replay — after a brief disconnect, clients resume from their last cursor and replay missed updates without a full refresh. See Resume & Replay.
- Deterministic recovery — when replay isn’t possible, the gateway emits
snapshot_requiredso clients rebuild state from a fast REST snapshot. Recovery is an explicit, designed path — not an error state.
Latency and freshness
OddsPapi is built to compete on measured end-to-end delay — not throughput — and every odds update carries the timestamps to verify it:changedAt − bookmakerChangedAt gives the observation delay per update; comparing ts to your receipt time gives the delivery hop.
Per-bookmaker freshness bounds are published on GET /bookmakers: maxDelayLiveInSec, maxDelayPregameInSec, and maxDelayPregameMainInSec state the maximum expected refresh delay per delivery mode for each book — measured from observed vs. bookmaker change times (currently the rolling p50) where the book publishes usable timestamps, estimated otherwise.
Representative rolling p50 observation delays (live values per book on GET /bookmakers):
Downstream of observation, the internal pipeline adds ~30 ms (p50) to gateway egress; the delivery hop from
ts to client receipt depends on where you deploy — as low as ~5 ms when colocated (see server location guidance).
To verify these numbers yourself during a trial, see evaluating the feed; to benchmark them against a feed you already run, see running OddsPapi as a second feed; to trade on them, see sharp-line trading & CLV.
Bookmaker staleness: staleOdds
Two different things can fail: the platform (gateway, your connection) and our link to each upstream bookmaker. staleOdds covers the second — the flag that says this bookmaker’s odds on this fixture can no longer be trusted, even while everything else is healthy. Which is why a price can look immaculate and be untradeable at the same time — here in a REST snapshot (GET /fixtures/odds), where one response carries both maps; the bookmakers channel streams the same meta:
What trips it
The flag is always set deliberately, in three situations:- Lost contact — a block, maintenance, or downtime at the bookmaker. We can no longer observe its prices at all.
- Unusual inactivity — a watcher per bookmaker: if an entire book produces no odds movement for longer than its per-book threshold, all of its fixtures are marked stale out of caution. A genuinely quiet stretch (e.g. a pregame-only book overnight) can trip this legitimately — the flag then means we cannot currently distinguish “quiet” from “broken”, which is exactly when you should not be trading it.
- Mismapping — a fixture found mapped to the wrong bookmaker event is marked stale until it is remapped and the old prices are removed. In this case the prices are not old, they are wrong — which is why
staleOddsis a hard block and not an advisory signal.
The level, and how incidents fan out
One rule:staleOdds lives at exactly one level — fixture × bookmaker. Never per market or selection (the flag covers all odds of that bookmaker on that fixture), and never as a single bookmaker-wide message (a book-wide incident is expressed as the flag on every fixture of that book). What you receive per cause:
Store and evaluate it keyed per
fixtureId:bookmaker pair, exactly as delivered. If you want a book-wide view (e.g. “this book is down”), derive it on your side — say, the share of that book’s fixtures currently flagged — rather than waiting for a book-level message that will never come.
What it is not
Not a suspension.suspended is the bookmaker’s own action on the fixture, and active / marketActive on the odds row are the bookmaker’s selection- and market-level stops. staleOdds is about our visibility — it can be true while all of those read fine, and either can be true without the other. Both independently mean “do not trade this book right now”.
The treatment
- Pause trading and quoting on that bookmaker for that fixture.
- Treat held prices as unvalidated. Do not re-price from stale values.
- Resume when the flag returns to
false. Recovery is automatic: every update is full latest state, so the next updates re-validate your store — nothing to replay or reconcile. - Or fall back. If the book is a reference, not a venue — risk measurement at a sportsbook, pricing input for market making — switch to a still-live book of similar sharpness, and back when the flag clears.
Designed for trading-grade failover
Recovery is bounded and predictable rather than best-effort:- The gateway buffers a replay window (
resumeWindowMs) so short interruptions resume with no data loss. - If your cursor falls outside that window, a single REST snapshot restores full state in one call.
- Bookmaker connectivity is surfaced explicitly via the
staleOddsflag, so you always know when a price may no longer be current.
Monitoring & operational responsibility
OddsPapi gives you the signals to operate safely; your client should act on them:- Track the
staleOddsflag per bookmaker before trading on a price. - Handle
snapshot_requiredand reconnect logic (see the Resume & Replay template). - Respect rate limits and WebSocket connection limits; contact support to raise limits for distributed systems.
- Watch the status page for platform-level incidents.
Support & incident response
When reporting an issue, include your
apiKey group, affected channels or endpoints, timestamps (UTC), and any serverEpoch / entryId values — these let us trace your session quickly.