{"id":3903,"date":"2026-09-15T10:00:00","date_gmt":"2026-09-15T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=3903"},"modified":"2026-09-08T13:39:58","modified_gmt":"2026-09-08T13:39:58","slug":"winamax-api-odds-access","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/","title":{"rendered":"Winamax API: The .fr Suffix Adds 3.3 Points to Four Brands"},"content":{"rendered":"<p>Winamax is the biggest sportsbook in France and it has no public API. There is no developer portal, no documented endpoint, no key you can request. What Winamax does have in the OddsPapi catalogue is three slugs: <code>winamax.fr<\/code>, <code>winamax.es<\/code> and <code>winamax.de<\/code>. All three carry live odds. None of them is a copy of the others.<\/p>\n<p>This post shows how to read all three in one call, and what a 69-fixture measurement says about which one you should trust. The short version: on the same fixture, at the same second, the French feed quotes a wider price than the German one. That holds on 49 of 49 fixtures where both ship a clean three-way.<\/p>\n<p>Then the pattern widens past Winamax. Six <code>.fr<\/code> slugs sit on a Ligue 1 board, and each one prices its own domestic competition worse than its own international sibling does.<\/p>\n<h2>Three Slugs, Two Feeds<\/h2>\n<p>The catalogue call is one line. On 8 September 2026 it returned 357 bookmakers, three of them Winamax.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Slug<\/th>\n<th>Name<\/th>\n<th>liveOdds<\/th>\n<th>cloneOf<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>winamax.fr<\/code><\/td>\n<td>Winamax FR<\/td>\n<td>true<\/td>\n<td>null<\/td>\n<\/tr>\n<tr>\n<td><code>winamax.es<\/code><\/td>\n<td>Winamax ES<\/td>\n<td>true<\/td>\n<td>null<\/td>\n<\/tr>\n<tr>\n<td><code>winamax.de<\/code><\/td>\n<td>Winamax DE<\/td>\n<td>true<\/td>\n<td>null<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p><code>cloneOf<\/code> is null on all three, which tells you nothing. It is null on plenty of slugs that quote byte-identical prices. The only way to know whether two feeds are the same feed is to compare the numbers.<\/p>\n<p>So we did. Across 69 fixtures in seven competitions, <code>winamax.es<\/code> and <code>winamax.de<\/code> posted the same three-way tuple on 42 of the 45 fixtures where both were readable. <code>winamax.fr<\/code> matched neither one, on any of the 49 fixtures readable against the German feed or the 42 against the Spanish. Three slugs, two pricing engines: a French one, and a shared international one.<\/p>\n<h2>Old Way vs OddsPapi<\/h2>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>Scraping Winamax<\/th>\n<th>OddsPapi<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Access<\/td>\n<td>No public API, geo-locked site, session tokens<\/td>\n<td><code>?apiKey=<\/code> query parameter<\/td>\n<\/tr>\n<tr>\n<td>Regional feeds<\/td>\n<td>Three separate sites, three scrapers<\/td>\n<td>Three slugs in one call<\/td>\n<\/tr>\n<tr>\n<td>Comparison books<\/td>\n<td>Build one scraper per book<\/td>\n<td>281 books on the same fixture payload<\/td>\n<\/tr>\n<tr>\n<td>Price history<\/td>\n<td>You store it yourself from day one<\/td>\n<td><code>\/historical-odds<\/code> on the free tier<\/td>\n<\/tr>\n<tr>\n<td>Market coverage<\/td>\n<td>Whatever the page renders<\/td>\n<td>61 to 67 market IDs per Winamax feed<\/td>\n<\/tr>\n<tr>\n<td>Push updates<\/td>\n<td>Poll and hope<\/td>\n<td>WebSocket stream<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Step 1: Find a French Fixture<\/h2>\n<p>Authentication is a query parameter. There is no header, no OAuth dance, no bearer token.<\/p>\n<pre class=\"wp-block-code\"><code>import os\nimport requests\n\nAPI_KEY = os.environ[\"ODDSPAPI_API_KEY\"]\nBASE = \"https:\/\/api.oddspapi.io\/v4\"\n\nfixtures = requests.get(f\"{BASE}\/fixtures\", params={\n    \"apiKey\": API_KEY,\n    \"sportId\": 10,          # soccer\n    \"from\": \"2026-09-08\",\n    \"to\": \"2026-09-16\",\n}).json()\n\nligue1 = [f for f in fixtures\n          if f[\"tournamentName\"] == \"Ligue 1\"\n          and f[\"categoryName\"] == \"France\"\n          and f[\"hasOdds\"]]\n\nfor f in ligue1[:3]:\n    print(f[\"fixtureId\"], f[\"startTime\"],\n          f[\"participant1Name\"], \"v\", f[\"participant2Name\"])\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>id1000003472036180 2026-09-11T18:45:00.000Z Stade Rennais FC v Olympique Marseille\nid1000003472036182 2026-09-12T15:15:00.000Z Strasbourg Alsace v AS Monaco\nid1000003472036166 2026-09-12T18:45:00.000Z AJ Auxerre v OGC Nice\n<\/code><\/pre>\n<p>Filter on <code>categoryName<\/code>, because &#8220;Ligue 1&#8221; is also the name of the Algerian top flight. Two Algerian Ligue 1 fixtures sat in the same window while we ran this. The <code>tournamentName<\/code> alone will hand you the wrong country.<\/p>\n<p>Set <code>to<\/code> to the day after the last day you want. It is a midnight UTC instant, so a same-day range returns only the 00:00Z kick-offs.<\/p>\n<h2>Step 2: Pull All Three Feeds in One Call<\/h2>\n<p>The <code>bookmakers<\/code> filter takes a comma-separated list. Ask for all three Winamax slugs at once.<\/p>\n<pre class=\"wp-block-code\"><code>FIXTURE = \"id1000003472036180\"   # Stade Rennais v Olympique Marseille\nWINAMAX = \"winamax.fr,winamax.es,winamax.de\"\n\nodds = requests.get(f\"{BASE}\/odds\", params={\n    \"apiKey\": API_KEY,\n    \"fixtureId\": FIXTURE,\n    \"bookmakers\": WINAMAX,\n}).json()[\"bookmakerOdds\"]\n\nprint(sorted(odds))\n# ['winamax.de', 'winamax.es', 'winamax.fr']\n<\/code><\/pre>\n<h2>Step 3: Read the Three-Way and Measure the Margin<\/h2>\n<p>Soccer&#8217;s full-time result is market <code>101<\/code>, with outcomes <code>101<\/code> home, <code>102<\/code> draw and <code>103<\/code> away. Three flags decide whether a quote is real, and you have to check all three. The book-level <code>suspended<\/code> flag and <code>bookmakerIsActive<\/code> sit on the bookmaker object. The <code>active<\/code> flag sits on each price. A parked board ships every price with <code>active: true<\/code> underneath a <code>suspended: true<\/code> book.<\/p>\n<pre class=\"wp-block-code\"><code>FULL_TIME_RESULT = \"101\"\nLEGS = {\"101\": \"home\", \"102\": \"draw\", \"103\": \"away\"}\n\ndef read_1x2(book):\n    if book.get(\"suspended\") or book.get(\"bookmakerIsActive\") is False:\n        return None\n    market = book.get(\"markets\", {}).get(FULL_TIME_RESULT)\n    if not market or not market.get(\"marketActive\"):\n        return None\n    prices = {}\n    for outcome_id, name in LEGS.items():\n        outcome = market[\"outcomes\"].get(outcome_id)\n        if outcome is None:\n            return None\n        price = next((p for p in outcome[\"players\"].values() if p[\"active\"]), None)\n        if price is None:\n            return None\n        prices[name] = price[\"price\"]\n    return prices\n\ndef overround(prices):\n    return (sum(1 \/ p for p in prices.values()) - 1) * 100\n\nfor slug in sorted(odds):\n    book = odds[slug]\n    prices = read_1x2(book)\n    if prices is None:\n        print(f\"{slug:12} skipped: suspended={book['suspended']}\")\n    else:\n        print(f\"{slug:12} {prices}  margin {overround(prices):.2f}%\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>winamax.de   {'home': 2.1, 'draw': 4.0, 'away': 2.9}   margin 7.10%\nwinamax.es   skipped: suspended=True\nwinamax.fr   {'home': 2.1, 'draw': 3.95, 'away': 2.9}  margin 7.42%\n<\/code><\/pre>\n<p>The two live feeds differ by five hundredths on the draw and nothing else. That is enough to move the margin by a third of a point. Across the 69 fixtures, <code>winamax.fr<\/code> shipped <code>suspended: true<\/code> on 14, <code>winamax.es<\/code> on 17 and <code>winamax.de<\/code> on 7. Skip that check and you will average a parked board into your consensus.<\/p>\n<p>The <code>players<\/code> dict is keyed by player ID on prop markets and by <code>\"0\"<\/code> on game lines. Iterate the values rather than hardcoding <code>players[\"0\"]<\/code>, and the same reader works on both.<\/p>\n<h2>Step 4: Rank Winamax Against the Whole Board<\/h2>\n<p>Drop the <code>bookmakers<\/code> filter and the same fixture returns everything the key can read.<\/p>\n<pre class=\"wp-block-code\"><code>board_raw = requests.get(f\"{BASE}\/odds\", params={\n    \"apiKey\": API_KEY, \"fixtureId\": FIXTURE,\n}).json()[\"bookmakerOdds\"]\n\nboard = {}\nfor slug, book in board_raw.items():\n    if slug.startswith(\"pinnacle+\") or slug == \"demo\":\n        continue                       # internal test feeds\n    prices = read_1x2(book)\n    if prices:\n        board[slug] = prices\n\nranked = sorted(board, key=lambda s: overround(board[s]))\ntuples = {tuple(p.values()) for p in board.values()}\n\nprint(len(board_raw), \"books in the payload\")\nprint(len(board), \"quote a complete active three-way\")\nprint(len(tuples), \"independent price tuples\")\n\nfor slug in [\"pinnacle\", \"winamax.de\", \"winamax.fr\", \"bet365.fr\", \"bwin.fr\"]:\n    if slug in board:\n        print(f\"{slug:12} rank {ranked.index(slug) + 1:>3} of {len(ranked)}\"\n              f\"   {overround(board[slug]):.2f}%\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>281 books in the payload\n267 quote a complete active three-way\n87 independent price tuples\npinnacle     rank  30 of 267   3.48%\nwinamax.de   rank 187 of 267   7.10%\nwinamax.fr   rank 189 of 267   7.42%\nbet365.fr    rank 263 of 267   12.90%\nbwin.fr      rank 264 of 267   14.56%\n<\/code><\/pre>\n<p>267 books, 87 independent prices. Two thirds of that board is duplicate feeds quoting the same tuple, which is why you <a href=\"https:\/\/oddspapi.io\/blog\/consensus-odds-fair-odds-calculator-python\/\">dedupe on the price tuple before you compute a consensus<\/a>. Counting slugs instead of prices will triple-weight whichever group happens to be largest.<\/p>\n<h2>The .fr Premium Runs Across Six Brands<\/h2>\n<p>Look at the ranks again. <code>bet365.fr<\/code> at 263 and <code>bwin.fr<\/code> at 264, out of 267. The international <code>bet365<\/code> slug on the same fixture prices at 10.11% and <code>bwin<\/code> at 6.51%. Same brand, same match, same second.<\/p>\n<p>We ran the pairing across all 69 fixtures: every <code>.fr<\/code> slug against its own brand&#8217;s international feed on the same fixture. Four brands ship both.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>French feed<\/th>\n<th>Parent feed<\/th>\n<th>Paired reads<\/th>\n<th>Median gap<\/th>\n<th>.fr wider on<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>bwin.fr<\/code><\/td>\n<td><code>bwin<\/code><\/td>\n<td>65<\/td>\n<td>+8.81 pp<\/td>\n<td>65 of 65<\/td>\n<\/tr>\n<tr>\n<td><code>bet365.fr<\/code><\/td>\n<td><code>bet365<\/code><\/td>\n<td>69<\/td>\n<td>+3.02 pp<\/td>\n<td>69 of 69<\/td>\n<\/tr>\n<tr>\n<td><code>unibet.fr<\/code><\/td>\n<td><code>unibet<\/code><\/td>\n<td>64<\/td>\n<td>+3.01 pp<\/td>\n<td>62 of 64<\/td>\n<\/tr>\n<tr>\n<td><code>winamax.fr<\/code><\/td>\n<td><code>winamax.de<\/code><\/td>\n<td>49<\/td>\n<td>+1.60 pp<\/td>\n<td>49 of 49<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><strong>All four<\/strong><\/td>\n<td><strong>247<\/strong><\/td>\n<td><strong>+3.28 pp<\/strong><\/td>\n<td><strong>245 of 247<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Six <code>.fr<\/code> slugs appeared on these boards: <code>bet365.fr<\/code>, <code>bwin.fr<\/code>, <code>pokerstars.fr<\/code>, <code>unibet.fr<\/code>, <code>winamax.fr<\/code> and <code>zebet.fr<\/code>. On the 18 French league fixtures their median overrounds ran 9.75% to 14.94%, against a board median of 7.20% and a Pinnacle median of 3.88%.<\/p>\n<p>The suffix predicts the price better than the brand does. If you are building a French-facing product and you reach for the French slug because it looks like the right one, you are picking the widest version of that book on purpose.<\/p>\n<pre class=\"wp-block-code\"><code>PAIRS = [(\"winamax.fr\", \"winamax.de\"), (\"unibet.fr\", \"unibet\"),\n         (\"bwin.fr\", \"bwin\"), (\"bet365.fr\", \"bet365\")]\n\nfor local, parent in PAIRS:\n    if local in board and parent in board:\n        gap = overround(board[local]) - overround(board[parent])\n        print(f\"{local:12} {overround(board[local]):5.2f}%\"\n              f\"   {parent:12} {overround(board[parent]):5.2f}%\"\n              f\"   {gap:+.2f} pp\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>winamax.fr    7.42%   winamax.de    7.10%   +0.32 pp\nunibet.fr     6.68%   unibet        7.08%   -0.40 pp\nbwin.fr      14.56%   bwin          6.51%   +8.04 pp\nbet365.fr    12.90%   bet365       10.11%   +2.79 pp\n<\/code><\/pre>\n<p>One fixture is not the study. On this particular match <code>unibet.fr<\/code> came in 0.40 points tighter than its parent, one of the two reversals in 247. Run the loop over a slate before you trust the direction, which is the whole reason we ran 69.<\/p>\n<h2>Where the Gap Is Widest<\/h2>\n<p>The two Winamax feeds track each other closely in the top flights and separate in the second tiers.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Competition<\/th>\n<th>Fixtures<\/th>\n<th>Board median<\/th>\n<th><code>winamax.fr<\/code><\/th>\n<th><code>winamax.de<\/code><\/th>\n<th>Gap<\/th>\n<th><code>pinnacle<\/code><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Premier League<\/td>\n<td>10<\/td>\n<td>6.04%<\/td>\n<td>7.70%<\/td>\n<td>6.83%<\/td>\n<td>0.79 pp<\/td>\n<td>3.60%<\/td>\n<\/tr>\n<tr>\n<td>LaLiga<\/td>\n<td>13<\/td>\n<td>6.25%<\/td>\n<td>7.90%<\/td>\n<td>7.01%<\/td>\n<td>1.06 pp<\/td>\n<td>3.87%<\/td>\n<\/tr>\n<tr>\n<td>Serie A<\/td>\n<td>10<\/td>\n<td>6.22%<\/td>\n<td>8.00%<\/td>\n<td>6.93%<\/td>\n<td>1.28 pp<\/td>\n<td>3.70%<\/td>\n<\/tr>\n<tr>\n<td>Ligue 1<\/td>\n<td>9<\/td>\n<td>6.33%<\/td>\n<td>8.12%<\/td>\n<td>6.80%<\/td>\n<td>1.29 pp<\/td>\n<td>3.35%<\/td>\n<\/tr>\n<tr>\n<td>Bundesliga<\/td>\n<td>9<\/td>\n<td>6.41%<\/td>\n<td>8.90%<\/td>\n<td>7.23%<\/td>\n<td>1.91 pp<\/td>\n<td>3.68%<\/td>\n<\/tr>\n<tr>\n<td>Ligue 2<\/td>\n<td>9<\/td>\n<td>7.87%<\/td>\n<td>14.87%<\/td>\n<td>12.10%<\/td>\n<td>2.17 pp<\/td>\n<td>5.62%<\/td>\n<\/tr>\n<tr>\n<td>2. Bundesliga<\/td>\n<td>9<\/td>\n<td>7.60%<\/td>\n<td>14.84%<\/td>\n<td>11.90%<\/td>\n<td>2.99 pp<\/td>\n<td>4.56%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>The ordering is consistent. Premier League 0.79 points apart, 2. Bundesliga 2.99. Both Winamax feeds roughly double their margin when they drop from a first division to a second, and the French feed doubles further. Pinnacle widens too, from 3.35% on Ligue 1 to 5.62% on Ligue 2, so some of this is the competition rather than the book. The <em>difference between two feeds of one brand<\/em> is not a competition effect.<\/p>\n<p>If your model reads Ligue 2, this is the whole ballgame. A 14.87% overround against a 7.87% board median means you are paying twice the going rate for the same opinion. <a href=\"https:\/\/oddspapi.io\/blog\/ligue-1-odds-api\/\">Ligue 1 alone carries 174 books a fixture<\/a>, and the second tier still returned 258 on the fixtures we sampled.<\/p>\n<h2>Two Brands, One Price<\/h2>\n<p>The clone check turned up a pair that has nothing to do with Winamax and everything to do with your consensus maths.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Slug A<\/th>\n<th>Slug B<\/th>\n<th>Identical three-way on<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>unibet.fr<\/code><\/td>\n<td><code>zebet.fr<\/code><\/td>\n<td>66 of 66 fixtures<\/td>\n<\/tr>\n<tr>\n<td><code>winamax.de<\/code><\/td>\n<td><code>winamax.es<\/code><\/td>\n<td>42 of 45 fixtures<\/td>\n<\/tr>\n<tr>\n<td><code>unibet<\/code><\/td>\n<td><code>unibet.be<\/code><\/td>\n<td>42 of 67 fixtures<\/td>\n<\/tr>\n<tr>\n<td><code>pmu<\/code><\/td>\n<td><code>unibet<\/code><\/td>\n<td>30 of 67 fixtures<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Unibet France and Zebet are two brands, two websites and two licences, and they posted the same numbers on every fixture we read. <code>cloneOf<\/code> is null on both. Add them both to a fair-value average and you have weighted one opinion twice.<\/p>\n<p>The rule that survives every one of these audits: dedupe on the price tuple, never on the metadata. Post 3731 found the same thing inside <a href=\"https:\/\/oddspapi.io\/blog\/bwin-api-odds-access\/\">Bwin&#8217;s seven regional feeds<\/a>, where the international slug turned out to share a price with BetMGM.<\/p>\n<h2>When a Slug Returns Nothing<\/h2>\n<p>Winamax France stops at the top two divisions. On a French third-tier fixture the German feed priced it and the French one did not. The failure modes look identical from the outside until you probe one slug at a time.<\/p>\n<pre class=\"wp-block-code\"><code>def probe(fixture_id, slug):\n    r = requests.get(f\"{BASE}\/odds\", params={\n        \"apiKey\": API_KEY, \"fixtureId\": fixture_id, \"bookmakers\": slug,\n    })\n    if r.status_code == 400:\n        return \"not a slug in the catalogue\"\n    if r.status_code == 403:\n        return \"real slug, gated on your plan\"\n    if slug in r.json().get(\"bookmakerOdds\", {}):\n        return \"priced\"\n    return \"real slug, no board on this fixture\"\n\nNATIONAL = \"id1000018372523912\"   # SM Caen v Paris 13 Atletico\n\nfor slug in [\"winamax.fr\", \"winamax.de\", \"winamax.co.uk\"]:\n    print(f\"{slug:14} {probe(NATIONAL, slug)}\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>winamax.fr     real slug, no board on this fixture\nwinamax.de     priced\nwinamax.co.uk  not a slug in the catalogue\n<\/code><\/pre>\n<p>Three distinct answers, three distinct status codes. The 400 body is worth reading on its own: it enumerates every valid slug, which makes it a free catalogue lookup when you have fat-fingered a name.<\/p>\n<p>Note the empty case. When a valid slug has no board on a fixture, the response omits <code>bookmakerOdds<\/code> entirely rather than returning it empty. Use <code>.get(\"bookmakerOdds\", {})<\/code> or your loop dies on a <code>KeyError<\/code>.<\/p>\n<h2>Free Winamax Price History<\/h2>\n<p>Historical odds are on the free tier, which is the part competitors put behind an enterprise contract. Point <code>\/historical-odds<\/code> at the same fixture and you get every snapshot recorded since the board opened.<\/p>\n<pre class=\"wp-block-code\"><code>history = requests.get(f\"{BASE}\/historical-odds\", params={\n    \"apiKey\": API_KEY,\n    \"fixtureId\": FIXTURE,\n    \"bookmakers\": \"winamax.fr,winamax.de,pinnacle\",   # max 3 per call\n}).json()[\"bookmakers\"]\n\nfor slug, book in history.items():\n    market = book[\"markets\"][FULL_TIME_RESULT]\n    snapshots = market[\"outcomes\"][\"101\"][\"players\"][\"0\"]\n    snapshots.sort(key=lambda s: s[\"createdAt\"])\n    changes = sum(1 for a, b in zip(snapshots, snapshots[1:])\n                  if a[\"price\"] != b[\"price\"]) + 1\n    print(f\"{slug:12} {len(snapshots):>3} snapshots,\"\n          f\" {changes:>3} distinct home prices,\"\n          f\" first {snapshots[0]['createdAt'][:10]}\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>pinnacle       51 snapshots,  38 distinct home prices, first 2026-08-30\nwinamax.de     69 snapshots,   7 distinct home prices, first 2026-08-31\nwinamax.fr     26 snapshots,   6 distinct home prices, first 2026-08-31\n<\/code><\/pre>\n<p>Collapse consecutive identical prices before you count anything. The feed records a snapshot on a schedule whether or not the price moved, so 69 raw snapshots became 7 repricings. Skip that step and you will measure your own polling interval.<\/p>\n<p>The endpoint caps at three bookmakers per call, and one unreadable slug fails the whole batch. Loop in threes and retry a failed batch one slug at a time.<\/p>\n<h2>What This Costs You<\/h2>\n<p>Take the Rennes fixture and pull the best available price on each leg from the full 267-book board.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Leg<\/th>\n<th><code>winamax.fr<\/code><\/th>\n<th>Best on the board<\/th>\n<th>Posted by<\/th>\n<th>Difference<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Rennes<\/td>\n<td>2.10<\/td>\n<td>2.20<\/td>\n<td><code>balkanbet.rs<\/code>, <code>fanatics<\/code>, <code>pointsbet.com.au<\/code><\/td>\n<td>+4.8%<\/td>\n<\/tr>\n<tr>\n<td>Draw<\/td>\n<td>3.95<\/td>\n<td>4.04<\/td>\n<td><code>1xbet<\/code><\/td>\n<td>+2.3%<\/td>\n<\/tr>\n<tr>\n<td>Marseille<\/td>\n<td>2.90<\/td>\n<td>3.40<\/td>\n<td><code>betfair-ex<\/code> and four sharp exchanges<\/td>\n<td>+17.2%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Across all 69 fixtures, the three Winamax slugs posted the best price on zero of 207 legs. The books that did keep turning up are <code>wettarena<\/code> (42 legs), <code>bet3000<\/code> (39) and the sharp exchange cluster (33 each). That is what <a href=\"https:\/\/oddspapi.io\/blog\/line-shopping-python-best-odds\/\">line shopping across 350+ books<\/a> buys you over reading one national brand.<\/p>\n<p>One warning on that composite. The three best legs on this fixture sum to an implied 99.62%, which reads like free money and is not. Those prices come from four venues with four different liquidity profiles, and the exchange leg is a ladder level rather than a standing offer. Check <code>limit<\/code> and <code>exchangeMeta<\/code> before you believe a sub-100% composite, and treat it as a signal that your filter needs tightening.<\/p>\n<h2>A Working Checklist<\/h2>\n<ul>\n<li>Request all three Winamax slugs. <code>winamax.de<\/code> and <code>winamax.es<\/code> are one feed, so two reads cover the brand.<\/li>\n<li>Check <code>suspended<\/code> and <code>bookmakerIsActive<\/code> on the book, then <code>active<\/code> on the price. All three, every time.<\/li>\n<li>Filter <code>categoryName<\/code> on <code>\/fixtures<\/code>. Ligue 1 exists in France and in Algeria.<\/li>\n<li>Dedupe on the price tuple before any average. 267 books were 87 independent prices.<\/li>\n<li>Drop <code>pinnacle+<\/code> and <code>demo<\/code> slugs. They are internal test feeds and they will count Pinnacle twice.<\/li>\n<li>Probe a single slug when a book goes missing. 400 means the slug is wrong, 403 means gated, 200 with nothing means unpriced.<\/li>\n<li>Collapse consecutive identical historical prices before counting repricings.<\/li>\n<li>Never treat a regional suffix as cosmetic. It is the strongest single predictor of margin we measured.<\/li>\n<\/ul>\n<h2>FAQ<\/h2>\n<h3>Does Winamax have an official API?<\/h3>\n<p>No. Winamax publishes no developer portal and no documented endpoint. OddsPapi carries its prices as three slugs, <code>winamax.fr<\/code>, <code>winamax.es<\/code> and <code>winamax.de<\/code>, readable through the standard <code>\/odds<\/code> call with an API key on the query string.<\/p>\n<h3>Which Winamax slug should I use?<\/h3>\n<p>Read all three and keep the best price per leg. If you want one, <code>winamax.de<\/code> priced tighter than <code>winamax.fr<\/code> on 49 of 49 fixtures we measured on 8 September 2026, and it shares its numbers with <code>winamax.es<\/code> on 42 of 45.<\/p>\n<h3>Why do the three Winamax feeds quote different odds?<\/h3>\n<p>They run on separate pricing books under separate licences. <code>winamax.es<\/code> and <code>winamax.de<\/code> matched each other on 42 of 45 fixtures; <code>winamax.fr<\/code> matched neither one on any of the 49 and 42 fixtures where the comparison was readable.<\/p>\n<h3>Do other French bookmakers behave the same way?<\/h3>\n<p>Yes. Pairing each <code>.fr<\/code> slug against its own brand&#8217;s international feed on the same fixture gave a median gap of 3.28 percentage points across 247 paired reads, with the French feed wider on 245 of them.<\/p>\n<h3>Which competitions does Winamax cover?<\/h3>\n<p>All three slugs priced every fixture we sampled in the Premier League, LaLiga, Serie A, Bundesliga, 2. Bundesliga, Ligue 1 and Ligue 2, carrying 61 to 67 market IDs each. On French third-tier fixtures, <code>winamax.de<\/code> and <code>winamax.es<\/code> priced the board and <code>winamax.fr<\/code> returned no odds.<\/p>\n<h3>Can I get historical Winamax odds?<\/h3>\n<p>Yes, on the free tier. <code>\/historical-odds<\/code> returns every recorded snapshot per outcome for up to three bookmakers per call. On the Rennes fixture it returned 69 snapshots for <code>winamax.de<\/code> and 26 for <code>winamax.fr<\/code>, back to 31 August.<\/p>\n<h3>How many books can I compare Winamax against?<\/h3>\n<p>The catalogue held 357 bookmakers on 8 September 2026, and a single Ligue 1 fixture returned 281 of them in one payload. 267 quoted a complete active three-way.<\/p>\n<h2>Get the Feeds<\/h2>\n<p>One key, one endpoint, and every Winamax feed alongside 350+ other books on the same fixture. Free historical odds, native market structures including Asian handicaps, and a WebSocket stream when polling stops being enough.<\/p>\n<p><a href=\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/\">Start with the free tier<\/a>, then read <a href=\"https:\/\/oddspapi.io\/blog\/vig-calculator-python-sportsbook-margin\/\">the vig calculator<\/a> to turn these margins into a ranking of your own, and <a href=\"https:\/\/oddspapi.io\/blog\/no-vig-odds-api\/\">the no-vig guide<\/a> to strip the margin out before you compare a price to your model.<\/p>\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\"@type\":\"Question\",\"name\":\"Does Winamax have an official API?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Winamax publishes no developer portal and no documented endpoint. OddsPapi carries its prices as three slugs, winamax.fr, winamax.es and winamax.de, readable through the standard \/odds call with an API key on the query string.\"}},\n    {\"@type\":\"Question\",\"name\":\"Which Winamax slug should I use?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Read all three and keep the best price per leg. If you want one, winamax.de priced tighter than winamax.fr on 49 of 49 fixtures measured on 8 September 2026, and it shares its numbers with winamax.es on 42 of 45.\"}},\n    {\"@type\":\"Question\",\"name\":\"Why do the three Winamax feeds quote different odds?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"They run on separate pricing books under separate licences. winamax.es and winamax.de matched each other on 42 of 45 fixtures, while winamax.fr matched neither one on any of the 49 and 42 fixtures where the comparison was readable.\"}},\n    {\"@type\":\"Question\",\"name\":\"Do other French bookmakers behave the same way?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. Pairing each .fr slug against its own brand's international feed on the same fixture gave a median gap of 3.28 percentage points across 247 paired reads, with the French feed wider on 245 of them.\"}},\n    {\"@type\":\"Question\",\"name\":\"Which competitions does Winamax cover?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"All three slugs priced every fixture sampled in the Premier League, LaLiga, Serie A, Bundesliga, 2. Bundesliga, Ligue 1 and Ligue 2, carrying 61 to 67 market IDs each. On French third-tier fixtures, winamax.de and winamax.es priced the board.\"}},\n    {\"@type\":\"Question\",\"name\":\"Can I get historical Winamax odds?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes, on the free tier. \/historical-odds returns every recorded snapshot per outcome for up to three bookmakers per call. On the Rennes fixture it returned 69 snapshots for winamax.de and 26 for winamax.fr, back to 31 August.\"}},\n    {\"@type\":\"Question\",\"name\":\"How many books can I compare Winamax against?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"The catalogue held 357 bookmakers on 8 September 2026, and a single Ligue 1 fixture returned 281 of them in one payload. 267 quoted a complete active three-way.\"}}\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: winamax api\nSEO Title: Winamax API: The .fr Suffix Adds 3.3 Points to Four Brands\nMeta Description: Winamax ships three slugs and two price feeds. On 69 fixtures the .fr build ran wider than its own international parent in 245 of 247 paired reads.\nSlug: winamax-api-odds-access\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Winamax ships three slugs and two price feeds. On 69 fixtures the .fr build ran wider than its own international parent in 245 of 247 paired reads.<\/p>\n","protected":false},"author":2,"featured_media":3904,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[9,11,15,10,97],"class_list":["post-3903","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-odds-api","tag-python","tag-soccer","tag-sports-betting-api","tag-winamax"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Winamax API: The .fr Suffix Adds 3.3 Points to Four Brands | 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\/winamax-api-odds-access\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Winamax API: The .fr Suffix Adds 3.3 Points to Four Brands | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"Winamax ships three slugs and two price feeds. On 69 fixtures the .fr build ran wider than its own international parent in 245 of 247 paired reads.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-15T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/winamax-api-odds-access-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=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"Winamax API: The .fr Suffix Adds 3.3 Points to Four Brands\",\"datePublished\":\"2026-09-15T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/\"},\"wordCount\":1920,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/winamax-api-odds-access-scaled.webp\",\"keywords\":[\"Odds API\",\"Python\",\"Soccer\",\"Sports Betting API\",\"Winamax\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/\",\"name\":\"Winamax API: The .fr Suffix Adds 3.3 Points to Four Brands | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/winamax-api-odds-access-scaled.webp\",\"datePublished\":\"2026-09-15T10:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/winamax-api-odds-access-scaled.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/winamax-api-odds-access-scaled.webp\",\"width\":2560,\"height\":1429,\"caption\":\"Winamax API header image\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Winamax API: The .fr Suffix Adds 3.3 Points to Four Brands\"}]},{\"@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":"Winamax API: The .fr Suffix Adds 3.3 Points to Four Brands | 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\/winamax-api-odds-access\/","og_locale":"en_US","og_type":"article","og_title":"Winamax API: The .fr Suffix Adds 3.3 Points to Four Brands | OddsPapi Blog","og_description":"Winamax ships three slugs and two price feeds. On 69 fixtures the .fr build ran wider than its own international parent in 245 of 247 paired reads.","og_url":"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-09-15T10:00:00+00:00","og_image":[{"width":2560,"height":1429,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/winamax-api-odds-access-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":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"Winamax API: The .fr Suffix Adds 3.3 Points to Four Brands","datePublished":"2026-09-15T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/"},"wordCount":1920,"commentCount":1,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/winamax-api-odds-access-scaled.webp","keywords":["Odds API","Python","Soccer","Sports Betting API","Winamax"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/","url":"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/","name":"Winamax API: The .fr Suffix Adds 3.3 Points to Four Brands | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/winamax-api-odds-access-scaled.webp","datePublished":"2026-09-15T10:00:00+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/winamax-api-odds-access-scaled.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/winamax-api-odds-access-scaled.webp","width":2560,"height":1429,"caption":"Winamax API header image"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Winamax API: The .fr Suffix Adds 3.3 Points to Four Brands"}]},{"@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\/3903","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=3903"}],"version-history":[{"count":1,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3903\/revisions"}],"predecessor-version":[{"id":3905,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3903\/revisions\/3905"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/3904"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=3903"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=3903"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=3903"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}