{"id":3111,"date":"2026-07-15T10:00:00","date_gmt":"2026-07-15T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=3111"},"modified":"2026-06-21T18:35:36","modified_gmt":"2026-06-21T18:35:36","slug":"trading-desk-onboarding-playbook","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/","title":{"rendered":"Trading Desk Onboarding: From API Key to Live Pricing in 5 Days"},"content":{"rendered":"<h2>You Just Got B2B Access. Now What?<\/h2>\n<p>Your sportsbook signed an OddsPapi enterprise deal on Monday. By Friday, your trading desk is expected to be pricing live markets off the feed. The dashboard hands you a WebSocket endpoint, an API key, and a docs URL, but no runbook for the order you should actually wire things up in.<\/p>\n<p>This is that runbook. Five days, five integration milestones, each one a working Python building block: connect and detect stale books, anchor on the sharp reference price, baseline your closing line value, close the settlement loop, then read exchange depth. Every code sample below was smoke-tested against the live OddsPapi feed on a World Cup 2026 fixture, so the numbers are real, not illustrative.<\/p>\n<p>If you are a bettor and not an operator, you want the <a href=\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/\">Free Odds API guide<\/a> instead. This post is for the people who run the book, not the people who bet into it.<\/p>\n<h2>The Problem: An Odds Feed Is Not a Trading Desk<\/h2>\n<p>Buying a data feed is the easy part. The hard part is the integration scaffolding nobody sells you: stale-price detection, a sharp anchor to de-vig against, a CLV audit so you know whether your lines leak value, a settlement loop, and exchange-depth reads for hedging. Most teams discover they need all five only after a sharp customer has been arbing a stale line for three weeks.<\/p>\n<p>The OddsPapi B2B stack ships the raw material for all five. What follows is the assembly order. Across 372 bookmakers including sharps (Pinnacle, SBOBet), exchanges (Betfair, Polymarket, Kalshi), and every major US book, plus free historical price timelines and a WebSocket-first feed, you have everything a trading desk needs without licensing five separate vendors.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>The Old Way<\/th>\n<th>OddsPapi Onboarding<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Scrape 40 books, build your own poller, miss every in-play move<\/td>\n<td>One WebSocket: <code>wss:\/\/v5.oddspapi.io\/ws<\/code>, 200+ books pushed<\/td>\n<\/tr>\n<tr>\n<td>Buy a separate &#8220;sharp&#8221; feed for Pinnacle reference pricing<\/td>\n<td>Pinnacle and SBOBet in the same payload as your soft books<\/td>\n<\/tr>\n<tr>\n<td>Pay per-call for historical lines to compute CLV<\/td>\n<td>Free <code>\/historical-odds<\/code> price timelines, opening to close<\/td>\n<\/tr>\n<tr>\n<td>License a stats vendor just to map fixture IDs for compliance<\/td>\n<td><code>externalProviders<\/code> block on every fixture (Betradar, Genius, Pinnacle IDs)<\/td>\n<\/tr>\n<tr>\n<td>Build exchange-depth integration from four different exchange APIs<\/td>\n<td>Normalised <code>exchangeMeta<\/code> back\/lay ladders in the odds payload<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Day 1: Connect the WebSocket and Detect Stale Books<\/h2>\n<p>The feed is WebSocket-first. You connect to the gateway, send a <code>login<\/code> message with your channel filters, and the server pushes updates as they happen rather than making you poll. The envelope is consistent across every channel:<\/p>\n<pre class=\"wp-block-code\"><code>{\n  \"channel\": \"odds\",\n  \"type\": \"UPDATE\",\n  \"payload\": { \"...\": \"...\" },\n  \"ts\": 1765497902846,\n  \"entryId\": \"1765497902846-3221\"\n}<\/code><\/pre>\n<p>Three things to wire up on Day 1, in priority order:<\/p>\n<h3>1. Pick your encoding<\/h3>\n<p>The <code>receiveType<\/code> field on the login message controls compression. On a busy in-play Saturday the odds channel is the bandwidth hog, so do not leave this on the default:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th><code>receiveType<\/code><\/th>\n<th>Format<\/th>\n<th>Bandwidth<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>json<\/code><\/td>\n<td>Plain JSON (default)<\/td>\n<td>1x baseline<\/td>\n<\/tr>\n<tr>\n<td><code>binary<\/code><\/td>\n<td>MessagePack<\/td>\n<td>smaller<\/td>\n<\/tr>\n<tr>\n<td><code>zstd<\/code><\/td>\n<td>Compressed JSON<\/td>\n<td>~5-6x smaller<\/td>\n<\/tr>\n<tr>\n<td><code>zstd-dict<\/code><\/td>\n<td>Dictionary-trained zstd<\/td>\n<td>~7-9x on odds<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h3>2. Handle resume and replay so a blip is not an outage<\/h3>\n<p>The <code>login_ok<\/code> response carries a <code>resume<\/code> block: <code>serverEpoch<\/code> (the gateway session id), <code>serverEntryIds<\/code> (latest cursor per channel), and <code>resumeWindowMs<\/code> (typically <code>60000<\/code>, sixty seconds of buffered replay). Store the last <code>entryId<\/code> you processed per channel. If you reconnect inside the window, you replay missed updates with no gaps. If your cursor is older than the buffer, the server sends a <code>snapshot_required<\/code> control message (reasons: <code>server_restarted<\/code>, <code>resume_window_exceeded<\/code>, <code>client_backpressure<\/code>) and you fall back to a fresh REST snapshot for those channels only. Two-tier recovery: fast replay or one REST call, never an open-ended hole.<\/p>\n<h3>3. Watch the <code>staleOdds<\/code> flag<\/h3>\n<p>This is the single most important field for a trading desk. Bookmaker connectivity is surfaced via <code>staleOdds<\/code>: when a book&#8217;s upstream goes quiet, its prices are flagged rather than silently frozen. A frozen price you treat as live is exactly how a sharp customer arbs you. The full channel architecture, the <code>staleOdds<\/code> deep-dive, and the <code>participantsRotated<\/code> flag are covered in the <a href=\"https:\/\/oddspapi.io\/blog\/sportsbook-odds-feed-websocket-pipeline\/\">Sportsbook Odds Feed pipeline post<\/a>. Read that before you go live.<\/p>\n<h2>Day 2: Anchor on the Sharp Reference Price<\/h2>\n<p>You cannot price a market without a fair-probability anchor, and the cleanest one in the payload is Pinnacle. Day 2 is wiring up a de-vig function and pointing it at the sharp line. Here is the live pull on a real World Cup 2026 group fixture, Norway vs Senegal, captured June 21 with 18 books on the 1X2 market (market id <code>101<\/code>):<\/p>\n<pre class=\"wp-block-code\"><code>import requests\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE = \"https:\/\/api.oddspapi.io\/v4\"\n\ndef get_odds(fixture_id, books=None):\n    params = {\"apiKey\": API_KEY, \"fixtureId\": fixture_id}\n    if books:\n        params[\"bookmakers\"] = \",\".join(books)\n    return requests.get(f\"{BASE}\/odds\", params=params).json()\n\ndef price(book_odds, slug, market=\"101\", outcome=\"101\"):\n    \"\"\"Current decimal price for one book\/market\/outcome, or None.\"\"\"\n    try:\n        node = book_odds[slug][\"markets\"][market][\"outcomes\"][outcome][\"players\"][\"0\"]\n        return node[\"price\"] if node.get(\"active\") and node[\"price\"] > 0 else None\n    except (KeyError, TypeError):\n        return None\n\ndef devig_proportional(prices):\n    \"\"\"prices: {outcome_id: decimal}. Returns {outcome_id: (fair_prob, fair_decimal)}.\"\"\"\n    inv = {k: 1 \/ v for k, v in prices.items()}\n    overround = sum(inv.values())\n    return {k: (inv[k] \/ overround, overround \/ inv[k]) for k in inv}, overround\n\nfixture = \"id1000001666457012\"  # Norway v Senegal, World Cup 2026\nbo = get_odds(fixture)[\"bookmakerOdds\"]\n\npin = {o: price(bo, \"pinnacle\", \"101\", o) for o in [\"101\", \"102\", \"103\"]}\nfair, overround = devig_proportional(pin)\nprint(f\"Pinnacle overround: {(overround - 1) * 100:.2f}%\")\nfor o, label in [(\"101\", \"Norway\"), (\"102\", \"Draw\"), (\"103\", \"Senegal\")]:\n    p, d = fair[o]\n    print(f\"  {label:8} raw {pin[o]:.3f}  ->  fair {p*100:.1f}%  ({d:.3f})\")<\/code><\/pre>\n<p>Real output from that fixture:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Outcome<\/th>\n<th>Pinnacle raw<\/th>\n<th>No-vig fair %<\/th>\n<th>Fair decimal<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Norway<\/td>\n<td>2.28<\/td>\n<td>42.4%<\/td>\n<td>2.356<\/td>\n<\/tr>\n<tr>\n<td>Draw<\/td>\n<td>3.62<\/td>\n<td>26.7%<\/td>\n<td>3.741<\/td>\n<\/tr>\n<tr>\n<td>Senegal<\/td>\n<td>3.14<\/td>\n<td>30.8%<\/td>\n<td>3.245<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Pinnacle&#8217;s overround here was 3.33%, against soft books quoting wider. Once you have the fair line, your own price is just fair plus your target margin. The proportional method shown here is the fast one; for the power and Shin alternatives (they disagree by up to 9% on longshots) see the <a href=\"https:\/\/oddspapi.io\/blog\/no-vig-odds-api\/\">no-vig methods comparison<\/a>, and for blending multiple sharps into a consensus anchor see <a href=\"https:\/\/oddspapi.io\/blog\/consensus-odds-fair-odds-calculator-python\/\">consensus odds<\/a>. The full auto-pricing engine that turns this into quoted lines is the <a href=\"https:\/\/oddspapi.io\/blog\/white-label-price-feed-auto-pricing\/\">white-label price feed post<\/a>.<\/p>\n<h2>Day 3: Baseline Your Closing Line Value<\/h2>\n<p>Before you trust your own prices, you need a yardstick: how did the sharp line move from open to close, and are your lines tracking it? That is CLV, and the free <code>\/historical-odds<\/code> endpoint gives you the full price timeline at no extra cost. Same fixture, Pinnacle&#8217;s complete history on the Norway moneyline:<\/p>\n<pre class=\"wp-block-code\"><code>def historical(fixture_id, book):\n    params = {\"apiKey\": API_KEY, \"fixtureId\": fixture_id, \"bookmakers\": book}\n    return requests.get(f\"{BASE}\/historical-odds\", params=params).json()\n\nh = historical(\"id1000001666457012\", \"pinnacle\")\n# NOTE: historical top key is \"bookmakers\" (not \"bookmakerOdds\"),\n# and players[\"0\"] is a LIST of snapshots, not a single dict.\nsnaps = h[\"bookmakers\"][\"pinnacle\"][\"markets\"][\"101\"][\"outcomes\"][\"101\"][\"players\"][\"0\"]\n\nopening, closing = snaps[0], snaps[-1]\nprices = [s[\"price\"] for s in snaps]\nprint(f\"{len(snaps)} snapshots\")\nprint(f\"open  {opening['price']}  @ limit {opening['limit']}  ({opening['createdAt'][:10]})\")\nprint(f\"latest {closing['price']}  @ limit {closing['limit']}  ({closing['createdAt'][:10]})\")\nprint(f\"range {min(prices)} -> {max(prices)}\")<\/code><\/pre>\n<p>Output: 96 snapshots between May 11 and June 21. The line opened at 2.17 with a <code>limit<\/code> of just 500, and by the latest pull sat at 2.28 with the limit raised to 15,000. That limit growth is the tell: Pinnacle posts early with small limits and scales them up as the market matures and its confidence rises. The price itself drifted across a 1.98 to 2.41 band over six weeks. Your CLV audit is just this timeline diffed against where your own book closed each market. The operator-grade audit pipeline (per-fixture and batched across a slate) is in the <a href=\"https:\/\/oddspapi.io\/blog\/clv-sportsbook-line-audit\/\">CLV line-audit post<\/a>, and if you want these timelines exported to CSV or Excel for your analysts, see <a href=\"https:\/\/oddspapi.io\/blog\/historical-odds-csv-excel-backtesting\/\">historical odds to CSV<\/a>.<\/p>\n<h2>Day 4: Close the Settlement Loop<\/h2>\n<p>A market closes, you need bets graded, the ledger updated. On the enterprise WebSocket tier the settlement endpoints return per-outcome results (won\/lost\/void), final scores, and margins. Worth being precise here so you do not wire up against the wrong layer: the public v4 REST API does <strong>not<\/strong> expose a settlement or results endpoint, and the <code>\/fixtures<\/code> feed carries status (<code>statusName<\/code>: Pre-Game \/ Live \/ Finished) but no scores or stats. If you are on v4 rather than the B2B WebSocket, you grade off the price collapse instead: when an outcome&#8217;s price drops to ~1.0 and the fixture flips to Finished, that outcome resolved. The honest mechanics of what the schedule feed does and does not carry are in the <a href=\"https:\/\/oddspapi.io\/blog\/free-sports-data-api\/\">Free Sports Data API post<\/a>.<\/p>\n<pre class=\"wp-block-code\"><code>def is_settled(fixture_status, outcome_price):\n    \"\"\"v4 proxy for settlement: Finished status + collapsed price.\"\"\"\n    return fixture_status == \"Finished\" and outcome_price is not None and outcome_price <= 1.05<\/code><\/pre>\n<p>The flip side of settlement is risk: knowing when your own book is the soft leg that sharp money is hitting before the market closes. That detection scanner, comparing your quoted price against the market-wide consensus and flagging exploitable gaps, is the <a href=\"https:\/\/oddspapi.io\/blog\/arb-detection-operator-risk-signal\/\">arb-detection risk-signal post<\/a>. And for the compliance side, joining your OddsPapi <code>fixtureId<\/code> to a licensed stats feed for regulatory reporting, every fixture ships an <code>externalProviders<\/code> block (Betradar fills 100%, Pinnacle 57%) covered in <a href=\"https:\/\/oddspapi.io\/blog\/fixture-mapping-compliance-betradar\/\">fixture mapping for compliance<\/a>.<\/p>\n<h2>Day 5: Read Exchange Depth for Hedging<\/h2>\n<p>By Day 5 you are quoting lines and want to hedge directional exposure. For that you need real liquidity, not just a top-of-book price, and the exchanges in the feed ship a full depth-of-book ladder under <code>exchangeMeta<\/code>. Same Norway vs Senegal fixture, the Norway back ladder on the two prediction-market exchanges:<\/p>\n<pre class=\"wp-block-code\"><code>def ladder(book_odds, slug, market=\"101\", outcome=\"101\"):\n    node = book_odds[slug][\"markets\"][market][\"outcomes\"][outcome][\"players\"][\"0\"]\n    em = node.get(\"exchangeMeta\")\n    if not em:  # sportsbooks ship null or {} here\n        return None\n    return em.get(\"back\", []), em.get(\"lay\", [])\n\nfor slug in [\"kalshi\", \"polymarket\"]:\n    back, lay = ladder(bo, slug)\n    print(slug, \"best back:\", back[0], \"| best lay:\", lay[0])<\/code><\/pre>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Exchange<\/th>\n<th>Best back (Norway)<\/th>\n<th>Depth at level<\/th>\n<th>Best lay<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Kalshi<\/td>\n<td>2.273<\/td>\n<td>$1.39M (limit $612K)<\/td>\n<td>1.754<\/td>\n<\/tr>\n<tr>\n<td>Polymarket<\/td>\n<td>2.326<\/td>\n<td>$327K (limit $141K)<\/td>\n<td>1.724<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Each ladder level is a dict of <code>{cents, price, size, limit}<\/code>: <code>price<\/code> is decimal odds, <code>size<\/code> is total liquidity, <code>limit<\/code> is stake depth available to match, and <code>cents<\/code> is the native 0-1 share price on prediction markets. Note the shape varies across exchanges (Betfair uses <code>availableToBack<\/code>\/<code>availableToLay<\/code>, some legacy books ship a flat scalar) so parse defensively. The continuous spread-quoting and directional-hedge signal loop built on these ladders is the <a href=\"https:\/\/oddspapi.io\/blog\/real-time-odds-feed-market-making\/\">market-maker real-time feed post<\/a>.<\/p>\n<h2>The Five-Day Stack, Assembled<\/h2>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Day<\/th>\n<th>Milestone<\/th>\n<th>OddsPapi primitive<\/th>\n<th>Deep-dive<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>Connect + stale detection<\/td>\n<td>WebSocket, <code>staleOdds<\/code>, resume\/replay<\/td>\n<td>Sportsbook Odds Feed (3053)<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>Sharp reference + de-vig<\/td>\n<td>Pinnacle\/SBOBet in payload<\/td>\n<td>White-Label Feed (3068)<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>CLV baseline<\/td>\n<td>Free <code>\/historical-odds<\/code> timelines<\/td>\n<td>CLV Line Audit (3056)<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>Settlement + risk loop<\/td>\n<td>Settlement (B2B), <code>externalProviders<\/code><\/td>\n<td>Arb Detection (3077)<\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>Exchange depth + hedging<\/td>\n<td><code>exchangeMeta<\/code> ladders<\/td>\n<td>Market Maker Feed (3059)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>That is a trading desk wired from a cold API key to live pricing in a working week, on one vendor, with sharps, exchanges, and free historical data in the same feed. The margin-trend monitoring you layer on top of all of this (benchmarking your vig against the sharp market over time) is the <a href=\"https:\/\/oddspapi.io\/blog\/bookmaker-margin-analytics-vig-trends\/\">bookmaker margin analytics post<\/a>.<\/p>\n<h2>Stop Licensing Five Vendors. Get Your Key.<\/h2>\n<p>Sharp reference pricing, exchange depth, free historical timelines, and a WebSocket-first feed across 372 bookmakers, all from one integration. <a href=\"https:\/\/oddspapi.io\/\">Get your free OddsPapi API key<\/a> and start on Day 1 today.<\/p>\n<h2>Frequently Asked Questions<\/h2>\n<h3>What is a sports trading API for sportsbook operators?<\/h3>\n<p>It is a feed built for the people setting and managing lines rather than betting into them. Beyond raw odds it surfaces a sharp reference price to de-vig against, stale-book flags, historical timelines for CLV, exchange depth for hedging, and settlement data. OddsPapi delivers all of these across 372 bookmakers on a WebSocket-first feed.<\/p>\n<h3>How long does it take to integrate an odds feed into a trading desk?<\/h3>\n<p>With the primitives in place, a working week. This playbook sequences it: Day 1 WebSocket and stale detection, Day 2 sharp de-vig anchor, Day 3 CLV baseline, Day 4 settlement and risk loop, Day 5 exchange depth. Each milestone is a tested Python building block.<\/p>\n<h3>Does OddsPapi provide settlement and results data?<\/h3>\n<p>The enterprise WebSocket tier exposes settlement endpoints returning per-outcome results, final scores, and margins. The public v4 REST API does not carry scores or results; v4 users grade off the price collapse to ~1.0 plus the Finished fixture status. Map to a licensed stats feed via the <code>externalProviders<\/code> IDs for regulatory settlement.<\/p>\n<h3>How do I get the sharp (Pinnacle) reference price?<\/h3>\n<p>Pinnacle and SBOBet arrive in the same <code>\/odds<\/code> payload as your soft books, keyed by slug. De-vig the sharp line with the proportional, power, or Shin method to get a fair-probability anchor, then add your target margin to set your own price.<\/p>\n<h3>Can I read exchange order-book depth for hedging?<\/h3>\n<p>Yes. Exchanges (Kalshi, Polymarket, Betfair) ship a full back\/lay ladder under <code>exchangeMeta<\/code>, with <code>price<\/code>, <code>size<\/code>, and <code>limit<\/code> at each level. On the Norway vs Senegal example, Kalshi showed $1.39M of liquidity at the top back level. Parse defensively since the ladder shape varies by exchange.<\/p>\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\"@type\": \"Question\", \"name\": \"What is a sports trading API for sportsbook operators?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"It is a feed built for the people setting and managing lines rather than betting into them. Beyond raw odds it surfaces a sharp reference price to de-vig against, stale-book flags, historical timelines for CLV, exchange depth for hedging, and settlement data. OddsPapi delivers all of these across 372 bookmakers on a WebSocket-first feed.\"}},\n    {\"@type\": \"Question\", \"name\": \"How long does it take to integrate an odds feed into a trading desk?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"With the primitives in place, a working week. This playbook sequences it: Day 1 WebSocket and stale detection, Day 2 sharp de-vig anchor, Day 3 CLV baseline, Day 4 settlement and risk loop, Day 5 exchange depth. Each milestone is a tested Python building block.\"}},\n    {\"@type\": \"Question\", \"name\": \"Does OddsPapi provide settlement and results data?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"The enterprise WebSocket tier exposes settlement endpoints returning per-outcome results, final scores, and margins. The public v4 REST API does not carry scores or results; v4 users grade off the price collapse to ~1.0 plus the Finished fixture status. Map to a licensed stats feed via the externalProviders IDs for regulatory settlement.\"}},\n    {\"@type\": \"Question\", \"name\": \"How do I get the sharp Pinnacle reference price?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Pinnacle and SBOBet arrive in the same \/odds payload as your soft books, keyed by slug. De-vig the sharp line with the proportional, power, or Shin method to get a fair-probability anchor, then add your target margin to set your own price.\"}},\n    {\"@type\": \"Question\", \"name\": \"Can I read exchange order-book depth for hedging?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Yes. Exchanges (Kalshi, Polymarket, Betfair) ship a full back\/lay ladder under exchangeMeta, with price, size, and limit at each level. On the Norway vs Senegal example, Kalshi showed $1.39M of liquidity at the top back level. Parse defensively since the ladder shape varies by exchange.\"}}\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: sports trading API\nSEO Title: Trading Desk Onboarding: From API Key to Live Pricing in 5 Days\nMeta Description: A sports trading API onboarding runbook for sportsbook operators. Wire up a trading desk in 5 days with OddsPapi: WebSocket, sharp de-vig, CLV, exchange depth.\nSlug: trading-desk-onboarding-playbook\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A sports trading API onboarding runbook for operators. Wire up a trading desk in 5 days with OddsPapi: WebSocket, sharp de-vig, CLV, exchange depth.<\/p>\n","protected":false},"author":2,"featured_media":3112,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[72,9,11,74,71],"class_list":["post-3111","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-b2b","tag-odds-api","tag-python","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>Trading Desk Onboarding: From API Key to Live Pricing in 5 Days | 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\/trading-desk-onboarding-playbook\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Trading Desk Onboarding: From API Key to Live Pricing in 5 Days | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"A sports trading API onboarding runbook for operators. Wire up a trading desk in 5 days with OddsPapi: WebSocket, sharp de-vig, CLV, exchange depth.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-15T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/trading-desk-onboarding-playbook-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=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"Trading Desk Onboarding: From API Key to Live Pricing in 5 Days\",\"datePublished\":\"2026-07-15T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/\"},\"wordCount\":1743,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/trading-desk-onboarding-playbook-scaled.webp\",\"keywords\":[\"B2B\",\"Odds API\",\"Python\",\"Sportsbook Operators\",\"WebSocket\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/\",\"name\":\"Trading Desk Onboarding: From API Key to Live Pricing in 5 Days | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/trading-desk-onboarding-playbook-scaled.webp\",\"datePublished\":\"2026-07-15T10:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/trading-desk-onboarding-playbook-scaled.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/trading-desk-onboarding-playbook-scaled.webp\",\"width\":2560,\"height\":1429,\"caption\":\"Trading Desk Onboarding - OddsPapi API Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Trading Desk Onboarding: From API Key to Live Pricing in 5 Days\"}]},{\"@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":"Trading Desk Onboarding: From API Key to Live Pricing in 5 Days | 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\/trading-desk-onboarding-playbook\/","og_locale":"en_US","og_type":"article","og_title":"Trading Desk Onboarding: From API Key to Live Pricing in 5 Days | OddsPapi Blog","og_description":"A sports trading API onboarding runbook for operators. Wire up a trading desk in 5 days with OddsPapi: WebSocket, sharp de-vig, CLV, exchange depth.","og_url":"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-07-15T10:00:00+00:00","og_image":[{"width":2560,"height":1429,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/trading-desk-onboarding-playbook-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":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"Trading Desk Onboarding: From API Key to Live Pricing in 5 Days","datePublished":"2026-07-15T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/"},"wordCount":1743,"commentCount":0,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/trading-desk-onboarding-playbook-scaled.webp","keywords":["B2B","Odds API","Python","Sportsbook Operators","WebSocket"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/","url":"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/","name":"Trading Desk Onboarding: From API Key to Live Pricing in 5 Days | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/trading-desk-onboarding-playbook-scaled.webp","datePublished":"2026-07-15T10:00:00+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/trading-desk-onboarding-playbook-scaled.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/06\/trading-desk-onboarding-playbook-scaled.webp","width":2560,"height":1429,"caption":"Trading Desk Onboarding - OddsPapi API Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/trading-desk-onboarding-playbook\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Trading Desk Onboarding: From API Key to Live Pricing in 5 Days"}]},{"@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\/3111","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=3111"}],"version-history":[{"count":1,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3111\/revisions"}],"predecessor-version":[{"id":3113,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3111\/revisions\/3113"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/3112"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=3111"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=3111"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=3111"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}