{"id":3922,"date":"2026-09-16T10:00:00","date_gmt":"2026-09-16T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=3922"},"modified":"2026-09-08T20:49:03","modified_gmt":"2026-09-08T20:49:03","slug":"odds-feed-provider-sportsbooks-trading-desks","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/","title":{"rendered":"Odds Feed Provider: Settle 289 Markets a Fixture From One Feed"},"content":{"rendered":"<h2>Looking for an Odds Feed Provider? Start With What the Feed Has to Do<\/h2>\n<p>Search &#8220;odds feed provider&#8221; and you meet two kinds of vendor. The enterprise data houses sell to licensed operators through a sales call. The developer APIs sell a short list of soft books and stop at the price. A sportsbook or a trading desk needs the pipeline in between: a stream you can price off, a cursor you can resume from, a closing line you can audit against, a grade for every outcome once the fixture finishes, and an ID you can join to the feed you already run.<\/p>\n<p>OddsPapi ships that pipeline as one provider. The B2B documentation at <a href=\"https:\/\/docs.oddspapi.io\">docs.oddspapi.io<\/a> states that &#8220;the majority of the top-10 prediction markets run on OddsPapi data&#8221;, and lists market makers, hedge-fund desks, bookmakers and betting exchanges as production clients. This post walks the pipeline from the first WebSocket message to the settled bet, and runs every step below against the live API on a self-serve key. Every number was measured on September 8, 2026.<\/p>\n<p>If you already hold a key and want the integration order, the <a href=\"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/\">trading desk onboarding playbook<\/a> sequences the same pieces into a five-day build. This post is the map; that one is the runbook.<\/p>\n<h2>Why the Usual Two Options Fail a Trading Desk<\/h2>\n<p>Sportradar and Genius Sports price per deal and gate access behind a sales process. The <a href=\"https:\/\/oddspapi.io\/blog\/sportradar-alternative\/\">Sportradar alternative<\/a> post covers what that costs a small operator in weeks. The developer-tier APIs solve access and stop there: you get a price, and you build stale detection, closing-line capture, settlement and fixture reconciliation yourself, or you license four more vendors to do it. The <a href=\"https:\/\/oddspapi.io\/blog\/odds-api-pricing-2026-comparison\/\">odds API pricing comparison<\/a> shows what the public tiers charge for the price alone.<\/p>\n<p>The OddsPapi feed covers the whole loop. The v4 REST API on a self-serve key carries the catalogue of 350+ bookmakers (357 slugs on <code>\/v4\/bookmakers<\/code> today, 117 of them flagged as clones of another feed), free historical price timelines, per-outcome settlement and period scores. The v5 gateway documented at docs.oddspapi.io adds the WebSocket channels, the opening and closing line endpoints, mapping lookups, and the lineups, injuries and stats channels.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>What the desk needs<\/th>\n<th>On a price-only API<\/th>\n<th>OddsPapi<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Realtime prices<\/td>\n<td>Poll a short list of soft books<\/td>\n<td>WebSocket push from 350+ bookmakers, conflated on a ~10 ms window<\/td>\n<\/tr>\n<tr>\n<td>Reconnect without a gap<\/td>\n<td>Rebuild state by hand<\/td>\n<td><code>serverEpoch<\/code> + <code>entryId<\/code> cursors, 60-second replay buffer, <code>snapshot_required<\/code> fallback<\/td>\n<\/tr>\n<tr>\n<td>Stale-book detection<\/td>\n<td>A frozen price looks live<\/td>\n<td><code>staleOdds<\/code> flag per bookmaker per fixture<\/td>\n<\/tr>\n<tr>\n<td>Closing line<\/td>\n<td>Capture it yourself at kick-off<\/td>\n<td><code>GET \/fixtures\/odds\/clv<\/code> on v5; free <code>\/v4\/historical-odds<\/code> timelines<\/td>\n<\/tr>\n<tr>\n<td>Settlement<\/td>\n<td>License a results feed<\/td>\n<td><code>\/v4\/settlements<\/code>: WIN, LOSE, HALFWIN, HALFLOSS, PUSH per outcome<\/td>\n<\/tr>\n<tr>\n<td>Join to Betradar or Genius<\/td>\n<td>Build a mapping table<\/td>\n<td><code>externalProviders<\/code> on every fixture; <code>betradarId<\/code> on 1,731 of 1,731 finished fixtures<\/td>\n<\/tr>\n<tr>\n<td>Size at price<\/td>\n<td>Unknown<\/td>\n<td><code>limit<\/code> field carried for close to every sharp book<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Step 1: Price Off the Stream, Recover From the Cursor<\/h2>\n<p>The production gateway is <code>wss:\/\/v5.oddspapi.io\/ws<\/code>. You send one <code>login<\/code> message with your key, the channels you want and the filters that cut the noise, and the server pushes every change after <code>login_ok<\/code>. The documented login shape:<\/p>\n<pre class=\"wp-block-code\"><code>{\n  \"type\": \"login\",\n  \"apiKey\": \"YOUR_API_KEY\",\n  \"channels\": [\"fixtures\", \"bookmakers\", \"odds\", \"scores\"],\n  \"receiveType\": \"zstd\",\n  \"sportIds\": [10],\n  \"bookmakers\": [\"pinnacle\", \"betfair-ex\", \"draftkings\"]\n}<\/code><\/pre>\n<p>Three design points from the docs matter more than the rest for a desk that trades on the feed.<\/p>\n<h3>The odds channel is state, not a tick ledger<\/h3>\n<p>The odds channel conflates updates on a fixed batching window of about 10 milliseconds. If a price moves twice inside one window you receive the newer value. The final value of every move arrives, and a delivered price is never more than one window behind the observation at the bookmaker. For full tick history you go to the REST history endpoints in Step 2.<\/p>\n<h3>A disconnect is a cursor problem, not an outage<\/h3>\n<p>Every message carries an <code>entryId<\/code> of the form <code>&lt;ts_ms&gt;-&lt;seq&gt;<\/code>. The <code>login_ok<\/code> reply carries a <code>resume<\/code> block with the <code>serverEpoch<\/code>, a <code>resumeWindowMs<\/code> buffer (the docs show 60,000) and the server&#8217;s latest cursor per channel. Persist the epoch and your last processed <code>entryId<\/code> per channel. On reconnect you send both back and the gateway replays what you missed inside the window. Outside the window it sends <code>snapshot_required<\/code> with a reason (<code>server_restarted<\/code>, <code>resume_window_exceeded<\/code> or <code>client_backpressure<\/code>) and you rebuild those channels from one REST snapshot. Before a release the server pushes a <code>reconnect<\/code> control frame and keeps streaming for a few seconds, so you reconnect on the message and never wait for the socket to die. The <a href=\"https:\/\/oddspapi.io\/blog\/sportsbook-odds-feed-websocket-pipeline\/\">WebSocket pricing pipeline<\/a> post wires this loop in Python.<\/p>\n<h3>Every price carries its own delivery chain<\/h3>\n<p>Each odds update ships <code>bookmakerChangedAt<\/code> (the book&#8217;s own clock, where the book publishes one), <code>changedAt<\/code> (when OddsPapi observed the change) and the envelope <code>ts<\/code> (when the gateway sent it). You measure the last hop yourself. The reliability page publishes representative rolling p50 observation delays per book: 0.05 s for Polymarket, 0.10 s for Betfair Exchange, 0.38 s for Pinnacle, and an estimated 1 s in-play for Singbet. It puts the internal pipeline at about 30 ms p50 to gateway egress, and the delivery hop as low as about 5 ms when you colocate in Central Europe. The same page publishes no uptime percentage; SLA terms are set per agreement.<\/p>\n<h2>Step 2: Audit Every Line Against the Close<\/h2>\n<p>A desk that cannot measure its own closing line value is guessing about its edge. On v5 the endpoints are <code>GET \/fixtures\/odds\/historical<\/code> for the full timeline and <code>GET \/fixtures\/odds\/clv<\/code> for opening versus closing values, both keyed on the same <code>oddsId<\/code> as the live stream, so a fill joins to its closing record on one string. On the self-serve v4 key the same audit runs off <code>\/v4\/historical-odds<\/code>, which returns every snapshot from the first price to the final whistle and costs nothing extra.<\/p>\n<p>The script below reads Arsenal v Chelsea from last Sunday (Premier League, kick-off 15:30 UTC on September 6) at three books and prints the opening and closing 1X2 prices. The closing price is the last active snapshot before kick-off; snapshots keep arriving after the clock starts, so the filter on <code>createdAt<\/code> is load-bearing.<\/p>\n<pre class=\"wp-block-code\"><code>import time\nfrom datetime import datetime, timezone\nimport requests\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE = \"https:\/\/api.oddspapi.io\/v4\"\n\n# Arsenal v Chelsea, Premier League, kicked off 2026-09-06 15:30 UTC.\n# Both values come from the \/fixtures record.\nFIXTURE = \"id1000001772221232\"\nKICKOFF = datetime(2026, 9, 6, 15, 30, tzinfo=timezone.utc)\n\n# \/historical-odds accepts at most 3 bookmakers per call.\nr = requests.get(f\"{BASE}\/historical-odds\", params={\n    \"apiKey\": API_KEY, \"fixtureId\": FIXTURE,\n    \"bookmakers\": \"pinnacle,bet365,draftkings\"})\nr.raise_for_status()\ntimeline = r.json()[\"bookmakers\"]\ntime.sleep(4.6)   # cooldown after a successful \/historical-odds call\n\ndef ts(s):\n    return datetime.fromisoformat(s[\"createdAt\"].replace(\"Z\", \"+00:00\"))\n\nlabels = {\"101\": \"home\", \"102\": \"draw\", \"103\": \"away\"}\nprint(f\"{'book':11s}{'side':6s}{'open':&gt;7s}{'close':&gt;7s}{'move':&gt;8s}\")\nfor book, data in timeline.items():\n    for oid, outcome in data[\"markets\"][\"101\"][\"outcomes\"].items():\n        snaps = outcome[\"players\"][\"0\"]          # oldest first\n        opening = snaps[0][\"price\"]\n        # The closing price is the last ACTIVE snapshot before kick-off.\n        # Snapshots keep arriving after kick-off, so filter on the clock.\n        pre = [s for s in snaps if ts(s) &lt; KICKOFF and s[\"active\"] and s[\"price\"] &gt; 1]\n        closing = pre[-1][\"price\"]\n        move = (closing \/ opening - 1) * 100\n        print(f\"{book:11s}{labels[oid]:6s}{opening:7.3f}{closing:7.3f}{move:+7.1f}%\")<\/code><\/pre>\n<p>Output, measured September 8, 2026:<\/p>\n<pre class=\"wp-block-code\"><code>book       side     open  close    move\nbet365     home    1.570  1.660   +5.7%\nbet365     draw    3.750  3.800   +1.3%\nbet365     away    5.250  4.750   -9.5%\ndraftkings home    1.645  1.714   +4.2%\ndraftkings draw    3.600  3.900   +8.3%\ndraftkings away    5.250  4.800   -8.6%\npinnacle   home    1.675  1.751   +4.5%\npinnacle   draw    3.800  3.900   +2.6%\npinnacle   away    4.850  5.000   +3.1%<\/code><\/pre>\n<p>Arsenal won 2-1. Between the opening print on August 23 and kick-off, bet365 recorded 689 snapshots on the home price and Pinnacle 620. All three books drifted Arsenal out by 4 to 6 percent. They split on Chelsea: bet365 and DraftKings cut the away price from 5.25 to 4.75 and 4.80, while Pinnacle pushed it out to 5.00. A book that closed Chelsea at 4.75 sat 5.3 percent under the sharp close on the same outcome, which is the number a CLV audit exists to surface. The <a href=\"https:\/\/oddspapi.io\/blog\/clv-sportsbook-line-audit\/\">operator CLV audit<\/a> post turns this read into a per-market report across your own book.<\/p>\n<h2>Step 3: Grade Every Outcome When the Fixture Finishes<\/h2>\n<p>Settlement is where most feeds stop and hand you to a results vendor. OddsPapi grades the outcomes it priced. On v5 the endpoint is <code>GET \/fixtures\/settlement<\/code>; on the self-serve v4 key it is <code>GET \/v4\/settlements?fixtureId=<\/code>, paired with <code>GET \/v4\/scores<\/code> for the period scores. The grades are a frozen vocabulary: <code>WIN<\/code>, <code>LOSE<\/code>, <code>PUSH<\/code>, <code>HALFWIN<\/code>, <code>HALFLOSS<\/code>, <code>CANCELLED<\/code> and <code>UNDECIDED<\/code>. The two half grades settle Asian quarter lines natively, so a -0.25 handicap on a draw grades as a half loss without a rule table on your side.<\/p>\n<p>Two traps. A finished fixture flips <code>hasOdds<\/code> to <code>false<\/code>, so select finished fixtures on <code>statusName<\/code> and never on that flag. And <code>\/settlements<\/code> has its own cooldown: two of ten calls spaced 1.1 seconds apart returned 429 during this test, and 2 seconds cleared it.<\/p>\n<pre class=\"wp-block-code\"><code>import time\nimport requests\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE = \"https:\/\/api.oddspapi.io\/v4\"\n\ndef get(path, **params):\n    params[\"apiKey\"] = API_KEY\n    r = requests.get(f\"{BASE}\/{path}\", params=params)\n    r.raise_for_status()\n    return r.json()\n\n# 1. Finished fixtures in one tournament. hasOdds is false once a fixture\n#    finishes, so select on statusName, never on hasOdds.\nfixtures = get(\"fixtures\", tournamentId=325,          # Brasileiro Serie A\n               **{\"from\": \"2026-09-06T00:00:00Z\", \"to\": \"2026-09-08T00:00:00Z\"})\nfinished = [f for f in fixtures if f[\"statusName\"] == \"Finished\"]\nfx = finished[0]\nprint(fx[\"participant1Name\"], \"v\", fx[\"participant2Name\"], fx[\"fixtureId\"])\n\n# 2. Final score by period.\nscores = get(\"scores\", fixtureId=fx[\"fixtureId\"])[\"scores\"][\"periods\"]\nfor period in (\"p1\", \"fulltime\", \"result\"):\n    p = scores[period]\n    print(f\"  {period:9s} {p['participant1Score']}-{p['participant2Score']}\")\ntime.sleep(2)\n\n# 3. Per-outcome grades. UNDECIDED means nobody priced that rung.\nsettlement = get(\"settlements\", fixtureId=fx[\"fixtureId\"])\ngraded, results = 0, {}\nfor market_id, market in settlement[\"markets\"].items():\n    grades = [p[\"result\"] for o in market[\"outcomes\"].values()\n              for p in o[\"players\"].values()]\n    for g in grades:\n        results[g] = results.get(g, 0) + 1\n    if all(g != \"UNDECIDED\" for g in grades):\n        graded += 1\n\nprint(f\"  markets returned: {len(settlement['markets'])}, fully graded: {graded}\")\nprint(\"  \", {k: v for k, v in sorted(results.items())})\nlabels = {\"101\": \"home\", \"102\": \"draw\", \"103\": \"away\"}\nfor oid, o in settlement[\"markets\"][\"101\"][\"outcomes\"].items():\n    print(f\"  1X2 {labels[oid]}: {o['players']['0']['result']}\")<\/code><\/pre>\n<p>Output for the first finished fixture in the window, Fluminense v Vasco da Gama:<\/p>\n<pre class=\"wp-block-code\"><code>Fluminense FC RJ v CR Vasco da Gama RJ id1000032566886978\n  p1        0-0\n  fulltime  1-0\n  result    1-0\n  markets returned: 1066, fully graded: 289\n   {'HALFLOSS': 12, 'HALFWIN': 12, 'LOSE': 283, 'PUSH': 13, 'UNDECIDED': 1622, 'WIN': 282}\n  1X2 home: WIN\n  1X2 draw: LOSE\n  1X2 away: LOSE<\/code><\/pre>\n<p>The response carries 1,066 market IDs. 289 of them come back fully graded, 602 outcomes in all, and the rest read <code>UNDECIDED<\/code> because nobody priced that rung. Eight finished Brasileiro Serie A fixtures from the same weekend and an Ecuador Serie B fixture from the same week returned the same grid: 1,066 market IDs and 289 graded markets each, with the WIN and LOSE split moving fixture to fixture. Scores arrive keyed by the generic period vocabulary (<code>p1<\/code>, <code>fulltime<\/code>, <code>result<\/code>), so the same parser reads a soccer half and a basketball quarter. Day 4 of the <a href=\"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/\">onboarding playbook<\/a> closes the loop from this call to the ledger.<\/p>\n<h2>Step 4: Join the Feed to the IDs You Already Hold<\/h2>\n<p>A regulated book runs a licensed data feed for official results and a pricing feed for the market. The two have to agree on which fixture is which. Every OddsPapi fixture record ships an <code>externalProviders<\/code> block, so the join is a dictionary lookup on a key you already hold rather than a name-matching project. On v5, <code>GET \/fixtures\/mapping<\/code> also runs the lookup in reverse: pass a bookmaker and its own fixture IDs and get the OddsPapi IDs back.<\/p>\n<pre class=\"wp-block-code\"><code>import requests\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE = \"https:\/\/api.oddspapi.io\/v4\"\n\n# Every fixture record carries an externalProviders block. Read it off\n# the same \/fixtures call you already make for the schedule.\nr = requests.get(f\"{BASE}\/fixtures\", params={\n    \"apiKey\": API_KEY, \"sportId\": 10,\n    \"from\": \"2026-09-06T00:00:00Z\", \"to\": \"2026-09-08T00:00:00Z\"})\nr.raise_for_status()\nfinished = [f for f in r.json() if f.get(\"statusName\") == \"Finished\"]\n\n# One fixture, every provider key it ships.\nfx = next(f for f in finished if f[\"fixtureId\"] == \"id1000032566886978\")\nprint(fx[\"participant1Name\"], \"v\", fx[\"participant2Name\"])\nfor provider, ext_id in fx[\"externalProviders\"].items():\n    print(f\"  {provider:13s} {ext_id}\")\n\n# Population rate per provider across the whole finished window.\ncounts = {}\nfor f in finished:\n    for provider, ext_id in f[\"externalProviders\"].items():\n        if ext_id is not None:\n            counts[provider] = counts.get(provider, 0) + 1\nprint(f\"\\n{len(finished)} finished soccer fixtures, Sep 6-7 2026\")\nfor provider, n in sorted(counts.items(), key=lambda kv: -kv[1]):\n    print(f\"  {provider:13s} {n:5d}  {100 * n \/ len(finished):5.1f}%\")<\/code><\/pre>\n<p>Output:<\/p>\n<pre class=\"wp-block-code\"><code>Fluminense FC RJ v CR Vasco da Gama RJ\n  betradarId    66886978\n  mollybetId    2026-09-06,26061,773\n  opticoddsId   202609068ADA0CB6\n  lsportsId     19906694\n  txoddsId      None\n  sofascoreId   None\n  betgeniusId   13391445\n  flashscoreId  MwalAAYH\n  pinnacleId    1634729439\n  oddinId       None\n\n1731 finished soccer fixtures, Sep 6-7 2026\n  betradarId     1731  100.0%\n  pinnacleId     1089   62.9%\n  flashscoreId    882   51.0%\n  opticoddsId     850   49.1%\n  betgeniusId     697   40.3%\n  lsportsId       631   36.5%\n  mollybetId      212   12.2%\n  sofascoreId      35    2.0%<\/code><\/pre>\n<p>The Betradar ID is present on every one of the 1,731 finished soccer fixtures in the window, from the Premier League down to the Spanish fourth tier. The Pinnacle ID covers 62.9 percent, which tracks the share of that slate Pinnacle prices, the OpticOdds ID sits at 49.1 percent and the Genius ID at 40.3. The <a href=\"https:\/\/oddspapi.io\/blog\/fixture-mapping-compliance-betradar\/\">fixture mapping for compliance<\/a> post builds the reconciliation table and the exception report on top of this block.<\/p>\n<h2>Lineups, Injuries, Futures and the Rest of the Board<\/h2>\n<p>The v5 gateway added <code>injuries<\/code>, <code>lineups<\/code> and <code>stats<\/code> channels in December 2025 and a <code>clocks<\/code> channel in April 2026, all with the same resume and replay semantics as odds. Futures run on their own channels (<code>futures<\/code>, <code>oddsFutures<\/code>, <code>bookmakersFutures<\/code>) with their own history and CLV endpoints, and the same model covers non-sports prediction-market topics as futures on <code>sportId<\/code> 69 to 78. The docs state that futures settlement is rolling out and the endpoint does not yet serve results, so grade outrights off the fixture pipeline until it does. Exchanges and prediction markets ship their order books in the <code>meta<\/code> field as uniform <code>back<\/code> and <code>lay<\/code> ladders, and a <code>currencies<\/code> channel streams fiat and crypto rates for odds conversion.<\/p>\n<h2>What the Limits Are<\/h2>\n<p>The v5 docs set 10 requests a second on the odds snapshot endpoints and 200 a minute on everything else, per key and per endpoint, with <code>X-RateLimit-Remaining<\/code> and <code>Retry-After<\/code> headers on every response. The WebSocket gateway allows 5 concurrent connections per key group and closes a client that cannot keep up with close code <code>4002<\/code>. Filters on <code>sportIds<\/code>, <code>tournamentIds<\/code> and <code>bookmakers<\/code>, plus <code>receiveType: \"zstd\"<\/code> (5 to 6 times smaller frames on the odds channel, per the docs), keep a single connection inside those bounds. Distributed systems that need more raise the limits by agreement.<\/p>\n<h2>Pricing and Access<\/h2>\n<p>Access is self-serve. <a href=\"https:\/\/oddspapi.io\/en\/sign-up\">Sign up for a free key<\/a>, run the three scripts above against last weekend&#8217;s fixtures, and scale from there. Pricing is usage-based: the <a href=\"https:\/\/oddspapi.io\/en\/pricing\">pricing page<\/a> is a calculator that prices the bookmakers and sports you select, multiplied by your requests per month, so a desk that reads three sharp books on two sports pays for that and not for the catalogue. The <a href=\"https:\/\/oddspapi.io\/blog\/odds-api-pricing-2026-comparison\/\">2026 pricing comparison<\/a> puts the public tiers of four providers side by side. Licensed operators who need SLA terms, raised limits or the v5 gateway write to contact@55-tech.com, and the B2B reference for everything in this post is <a href=\"https:\/\/docs.oddspapi.io\">docs.oddspapi.io<\/a>.<\/p>\n<p>For a plain REST introduction to the same feed, the <a href=\"https:\/\/oddspapi.io\/blog\/odds-feed-api-real-time-bookmaker-data\/\">odds feed API<\/a> post starts from the first call.<\/p>\n<h2>One Provider From First Price to Settled Bet<\/h2>\n<p>A WebSocket you resume from a cursor, a closing line you audit against, a grade for 289 markets a fixture and a Betradar ID on every record: that is the pipeline a sportsbook or a trading desk needs from an odds feed provider, and it runs on one key. <a href=\"https:\/\/oddspapi.io\/en\/sign-up\">Get your free key<\/a>, then open <a href=\"https:\/\/docs.oddspapi.io\">docs.oddspapi.io<\/a> for the channel schemas.<\/p>\n<h2>Frequently Asked Questions<\/h2>\n<h3>What does an odds feed provider need to deliver for a sportsbook?<\/h3>\n<p>Five things: a realtime price stream, a recovery path that replays what you missed, a closing line to audit against, per-outcome settlement, and fixture IDs that join to your official data feed. OddsPapi delivers all five: a WebSocket with resume and replay across 350+ bookmakers, OLV\/CLV endpoints, settlement grades and an externalProviders block on every fixture.<\/p>\n<h3>Does OddsPapi settle bets?<\/h3>\n<p>Yes, for fixtures. GET \/v4\/settlements returns WIN, LOSE, HALFWIN, HALFLOSS or PUSH for every priced outcome; on a finished Brasileiro Serie A fixture it graded 289 markets and 602 outcomes. GET \/v4\/scores returns the period scores. The v5 endpoint is GET \/fixtures\/settlement, and futures settlement is rolling out per the docs.<\/p>\n<h3>How does the feed recover from a disconnect?<\/h3>\n<p>Every message carries an entryId cursor. On reconnect you send your serverEpoch and last entryId per channel, and the gateway replays what you missed inside the resume window (60 seconds in the documented example). Past the window it sends snapshot_required and you rebuild those channels from a single REST snapshot.<\/p>\n<h3>Can I run OddsPapi next to Betradar or Genius Sports?<\/h3>\n<p>Yes. Each fixture record ships externalProviders with betradarId, betgeniusId, pinnacleId, opticoddsId, lsportsId, flashscoreId and more. On September 8, 2026 the Betradar ID was present on all 1,731 finished soccer fixtures from the previous two days, so the join is a dictionary lookup.<\/p>\n<h3>Is there an enterprise tier or an SLA?<\/h3>\n<p>Access is self-serve with usage-based pricing: the calculator prices the bookmakers and sports you pick, multiplied by requests per month. The reliability page publishes a live status page and states that uptime targets and support response times are set per agreement for B2B customers, through contact@55-tech.com.<\/p>\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\"@type\": \"Question\", \"name\": \"What does an odds feed provider need to deliver for a sportsbook?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Five things: a realtime price stream, a recovery path that replays what you missed, a closing line to audit against, per-outcome settlement, and fixture IDs that join to your official data feed. OddsPapi delivers all five: a WebSocket with resume and replay across 350+ bookmakers, OLV\/CLV endpoints, settlement grades and an externalProviders block on every fixture.\"}},\n    {\"@type\": \"Question\", \"name\": \"Does OddsPapi settle bets?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Yes, for fixtures. GET \/v4\/settlements returns WIN, LOSE, HALFWIN, HALFLOSS or PUSH for every priced outcome; on a finished Brasileiro Serie A fixture it graded 289 markets and 602 outcomes. GET \/v4\/scores returns the period scores. The v5 endpoint is GET \/fixtures\/settlement, and futures settlement is rolling out per the docs.\"}},\n    {\"@type\": \"Question\", \"name\": \"How does the feed recover from a disconnect?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Every message carries an entryId cursor. On reconnect you send your serverEpoch and last entryId per channel, and the gateway replays what you missed inside the resume window (60 seconds in the documented example). Past the window it sends snapshot_required and you rebuild those channels from a single REST snapshot.\"}},\n    {\"@type\": \"Question\", \"name\": \"Can I run OddsPapi next to Betradar or Genius Sports?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Yes. Each fixture record ships externalProviders with betradarId, betgeniusId, pinnacleId, opticoddsId, lsportsId, flashscoreId and more. On September 8, 2026 the Betradar ID was present on all 1,731 finished soccer fixtures from the previous two days, so the join is a dictionary lookup.\"}},\n    {\"@type\": \"Question\", \"name\": \"Is there an enterprise tier or an SLA?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Access is self-serve with usage-based pricing: the calculator prices the bookmakers and sports you pick, multiplied by requests per month. The reliability page publishes a live status page and states that uptime targets and support response times are set per agreement for B2B customers, through contact@55-tech.com.\"}}\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: odds feed provider\nSEO Title: Odds Feed Provider: Settle 289 Markets a Fixture From One Feed\nMeta Description: Odds feed provider for sportsbooks and trading desks: 350+ books over WebSocket with replay, OLV\/CLV endpoints and per-outcome settlement on one key.\nSlug: odds-feed-provider-sportsbooks-trading-desks\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Odds feed provider for sportsbooks and trading desks: 350+ books over WebSocket with replay, OLV\/CLV endpoints and per-outcome settlement on one key.<\/p>\n","protected":false},"author":2,"featured_media":3923,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[72,9,10,74,71],"class_list":["post-3922","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-b2b","tag-odds-api","tag-sports-betting-api","tag-sportsbook-operators","tag-websocket"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Odds Feed Provider: Settle 289 Markets a Fixture From One Feed | OddsPapi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Odds Feed Provider: Settle 289 Markets a Fixture From One Feed | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"Odds feed provider for sportsbooks and trading desks: 350+ books over WebSocket with replay, OLV\/CLV endpoints and per-outcome settlement on one key.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-16T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/odds-feed-provider-sportsbooks-trading-desks-scaled.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1429\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Odds API Writer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/oddspapi.io\/logo-v2.webp\" \/>\n<meta name=\"twitter:creator\" content=\"@oddspapiapi\" \/>\n<meta name=\"twitter:site\" content=\"@oddspapiapi\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Odds API Writer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"Odds Feed Provider: Settle 289 Markets a Fixture From One Feed\",\"datePublished\":\"2026-09-16T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/\"},\"wordCount\":2131,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/odds-feed-provider-sportsbooks-trading-desks-scaled.webp\",\"keywords\":[\"B2B\",\"Odds API\",\"Sports Betting API\",\"Sportsbook Operators\",\"WebSocket\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/\",\"name\":\"Odds Feed Provider: Settle 289 Markets a Fixture From One Feed | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/odds-feed-provider-sportsbooks-trading-desks-scaled.webp\",\"datePublished\":\"2026-09-16T10:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/odds-feed-provider-sportsbooks-trading-desks-scaled.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/odds-feed-provider-sportsbooks-trading-desks-scaled.webp\",\"width\":2560,\"height\":1429,\"caption\":\"Odds Feed Provider - OddsPapi API Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Odds Feed Provider: Settle 289 Markets a Fixture From One Feed\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\",\"url\":\"https:\/\/oddspapi.io\/blog\/\",\"name\":\"OddsPapi\",\"description\":\"Sports Odds API Tutorials &amp; Guides\",\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"alternateName\":\"Odds Papi\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/oddspapi.io\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\",\"name\":\"OddsPapi\",\"url\":\"https:\/\/oddspapi.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/oddspapi.png\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/oddspapi.png\",\"width\":135,\"height\":135,\"caption\":\"OddsPapi\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/oddspapiapi\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\",\"name\":\"Odds API Writer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/33b204f24af3d02e35b25ae730c0536121ca6a783fdb196e7611c9e49fcd13eb?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/33b204f24af3d02e35b25ae730c0536121ca6a783fdb196e7611c9e49fcd13eb?s=96&d=mm&r=g\",\"caption\":\"Odds API Writer\"},\"url\":\"https:\/\/oddspapi.io\/blog\/author\/andy-lavelle\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Odds Feed Provider: Settle 289 Markets a Fixture From One Feed | OddsPapi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/","og_locale":"en_US","og_type":"article","og_title":"Odds Feed Provider: Settle 289 Markets a Fixture From One Feed | OddsPapi Blog","og_description":"Odds feed provider for sportsbooks and trading desks: 350+ books over WebSocket with replay, OLV\/CLV endpoints and per-outcome settlement on one key.","og_url":"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-09-16T10:00:00+00:00","og_image":[{"width":2560,"height":1429,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/odds-feed-provider-sportsbooks-trading-desks-scaled.webp","type":"image\/webp"}],"author":"Odds API Writer","twitter_card":"summary_large_image","twitter_image":"https:\/\/oddspapi.io\/logo-v2.webp","twitter_creator":"@oddspapiapi","twitter_site":"@oddspapiapi","twitter_misc":{"Written by":"Odds API Writer","Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"Odds Feed Provider: Settle 289 Markets a Fixture From One Feed","datePublished":"2026-09-16T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/"},"wordCount":2131,"commentCount":0,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/odds-feed-provider-sportsbooks-trading-desks-scaled.webp","keywords":["B2B","Odds API","Sports Betting API","Sportsbook Operators","WebSocket"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/","url":"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/","name":"Odds Feed Provider: Settle 289 Markets a Fixture From One Feed | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/odds-feed-provider-sportsbooks-trading-desks-scaled.webp","datePublished":"2026-09-16T10:00:00+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/odds-feed-provider-sportsbooks-trading-desks-scaled.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/odds-feed-provider-sportsbooks-trading-desks-scaled.webp","width":2560,"height":1429,"caption":"Odds Feed Provider - OddsPapi API Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/odds-feed-provider-sportsbooks-trading-desks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Odds Feed Provider: Settle 289 Markets a Fixture From One Feed"}]},{"@type":"WebSite","@id":"https:\/\/oddspapi.io\/blog\/#website","url":"https:\/\/oddspapi.io\/blog\/","name":"OddsPapi","description":"Sports Odds API Tutorials &amp; Guides","publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"alternateName":"Odds Papi","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/oddspapi.io\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/oddspapi.io\/blog\/#organization","name":"OddsPapi","url":"https:\/\/oddspapi.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/oddspapi.png","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/oddspapi.png","width":135,"height":135,"caption":"OddsPapi"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/oddspapiapi"]},{"@type":"Person","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13","name":"Odds API Writer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/33b204f24af3d02e35b25ae730c0536121ca6a783fdb196e7611c9e49fcd13eb?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/33b204f24af3d02e35b25ae730c0536121ca6a783fdb196e7611c9e49fcd13eb?s=96&d=mm&r=g","caption":"Odds API Writer"},"url":"https:\/\/oddspapi.io\/blog\/author\/andy-lavelle\/"}]}},"_links":{"self":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3922","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/comments?post=3922"}],"version-history":[{"count":2,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3922\/revisions"}],"predecessor-version":[{"id":3925,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3922\/revisions\/3925"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/3923"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=3922"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=3922"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=3922"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}