Loading ticker...
Loading… @TheOddsGap
The Odds Gap

For Agents

One HTTP endpoint that answers a whole question about sportsbook prices, the same engine the site's own assistant runs on. Ask it the way a person would. The first 10 answers a day are free, then it is 0.02 USDC an answer over x402. No API key, no email, no account.

Ask It Something

curl "https://theoddsgap.com/assistant/v1/answer?tool=ask&q=where+is+the+best+price+on+the+Lions+moneyline"

tool=ask means q is a whole question. Leaving tool off does the same, as long as you send none of side, market, line or hours, which are the summary tools' own parameters. Pass tool=best_price, top_gaps or line_move instead and you get the three summary answers, which are always free and take a game name in q.

Checking that the endpoint is up? Send q=test: a ping like that gets one line back at once, free, and is not counted as a question.

What the engine covers: best price on a side, how a line has moved, the widest gaps on the board, hedges on a ticket you already hold, parlay pricing, player props and futures.

What Comes Back

FieldWhat It Is
answerThe answer in plain sentences, ready to relay.
cardThe same answer structured, for when you need the numbers rather than the words.
warningsThe honesty flags, in plain words. An exchange price with barely $100 behind it says so; a price older than our freshness budget says so.
optionsOnly when the engine asks you a question back: up to four whole questions to resend. A question back is never charged, and the resent question that answers counts once.
pageOur own page for the game, or the board the answer came from. Link this when you relay the answer: it is always our page, never a sportsbook's (see below).
live_urlThe page that renders this data, where the full per-book table lives.
as_ofThe data's timestamp in Eastern Time, not the request's. Relay it.
paymentWhether this answer was paid for (true, false, or null while the outcome is unconfirmed), the price, and how many free ones are left today.
Why every answer links our page and never a sportsbook: so the reader sees only the books legal where they are. Which sportsbooks a person may use depends on their US state. Our page checks the reader's own state when they open it; a request arriving from your server cannot. So no answer carries a sportsbook, exchange or affiliate link, and page is where the reader finds the book that is actually open to them. The link carries ref=agent so we can count the visits agents send.
What is never in it: the per-book price ladder and the evidence rows. Those are on the page in live_url, and they are the reason to send a human there. Offshore books are excluded from every figure. Pinnacle is our fair-line reference and is never named as a place to bet.

Paying

x402 version 2, the exact scheme, USDC on eip155:8453 (Base), settled through PayAI's facilitator. Once the free allowance is spent the request comes back 402 with the payment requirements, base64 encoded, in a PAYMENT-REQUIRED header. Decoded, it reads:

{
  "x402Version": 2,
  "error": "PAYMENT-SIGNATURE header is required",
  "resource": {
    "url": "https://theoddsgap.com/assistant/v1/answer?tool=ask&q=...",
    "description": "One answer from The Odds Gap: the best price on a bet, a hedge, a parlay or the board, derived from our own scans.",
    "mimeType": "application/json"
  },
  "accepts": [
    {
      "scheme": "exact",
      "network": "eip155:8453",
      "amount": "20000",
      "asset": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
      "payTo": "0xa0d190daA6AA0839a86192d37fc388CA8E60302d",
      "maxTimeoutSeconds": 60,
      "extra": {
        "name": "USD Coin",
        "version": "2",
        "assetTransferMethod": "eip3009"
      }
    }
  ],
  "extensions": {
    "bazaar": {
      "info": {
        "input": {
          "type": "http",
          "method": "GET",
          "queryParams": {
            "tool": "ask",
            "q": "where is the best price on the Pittsburgh Steelers moneyline"
          }
        },
        "output": {
          "type": "json",
          "example": {
            "answer": "Pittsburgh Steelers ML is -138 at Novig, next best -141 at ProphetX. That is 3 cents better.",
            "as_of": "11:00 AM ET, Oct 1, 2026",
            "attribution": "The Odds Gap (https://theoddsgap.com). Free live odds comparison across the major US sportsbooks and the regulated prediction markets. Please name the source and link the page in live_url when you use these figures.",
            "card": {
              "away": "Pittsburgh Steelers",
              "bet": "Pittsburgh Steelers ML",
              "book": "novig",
              "book_label": "Novig",
              "event_id": "nfl:pittsburgh-steelers-vs-cleveland-browns",
              "home": "Cleveland Browns",
              "kickoff_et": "Thu, Oct 1, 8:15 PM ET",
              "kickoff_utc": "2026-10-02T00:15:00Z",
              "kind": "best_price",
              "line": null,
              "link_style": "both",
              "locked_profit": null,
              "market": "ml",
              "odds_display": "-138",
              "page": "https://theoddsgap.com/odds/nfl/pittsburgh-steelers-vs-cleveland-browns?ref=agent&src=best_price",
              "runner_up_book": "prophetx",
              "runner_up_book_label": "ProphetX",
              "runner_up_odds_display": "-141",
              "side": "away",
              "sport_label": "NFL",
              "stake": null,
              "verdict": null
            },
            "license": "Quoting any figure or finding published on this site is welcome, with attribution to The Odds Gap and a link to the page it came from. Our measurements, the matched-lines comparisons, the staleness and dispersion studies and the captured opening lines, are our own work and are licensed on that basis. The underlying odds are facts we aggregate from sources with their own terms. Bulk or automated reuse of the underlying data, rather than quoting a published figure, needs a conversation first: [email protected].",
            "live_url": "https://theoddsgap.com/odds/nfl/pittsburgh-steelers-vs-cleveland-browns?ref=agent&src=best_price",
            "ok": true,
            "options": [],
            "page": "https://theoddsgap.com/odds/nfl/pittsburgh-steelers-vs-cleveland-browns?ref=agent&src=best_price",
            "payment": {
              "docs": "https://theoddsgap.com/for-agents?ref=agent&src=best_price",
              "free_left_today": 7,
              "network": "eip155:8453",
              "paid": false,
              "price_usdc": 0.02
            },
            "responsible_gambling": "Educational information, not betting advice. 21+ and where legal. If gambling stops being fun, call or text 1-800-GAMBLER.",
            "scope": "A decision derived from our own scans of the major US sportsbooks and the regulated prediction markets, over the free board an anonymous visitor sees. Offshore books are excluded. Pinnacle is our fair-line reference and is never named as a place to bet. No per-book price table is in this response; it is on the page in live_url.",
            "tool": "best_price",
            "warnings": [
              "This price is 99 minutes old, older than we like to serve. Check the live board before you bet it."
            ]
          }
        }
      },
      "schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "input": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "http"
              },
              "method": {
                "type": "string",
                "enum": [
                  "GET"
                ]
              },
              "queryParams": {
                "type": "object",
                "properties": {
                  "tool": {
                    "type": "string",
                    "const": "ask",
                    "description": "Run the whole answers engine."
                  },
                  "q": {
                    "type": "string",
                    "maxLength": 400,
                    "description": "A whole question in plain English."
                  }
                },
                "required": [
                  "q"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "type",
              "method"
            ],
            "additionalProperties": false
          },
          "output": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string"
              },
              "example": {
                "type": "object",
                "properties": {
                  "ok": {
                    "type": "boolean"
                  },
                  "tool": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The engine tool that answered."
                  },
                  "answer": {
                    "type": "string",
                    "description": "The answer in plain sentences."
                  },
                  "card": {
                    "type": "object",
                    "description": "The same answer, structured."
                  },
                  "warnings": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "options": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Whole questions to resend, only when the question could not be placed."
                  },
                  "page": {
                    "type": "string",
                    "format": "uri",
                    "description": "The matching page on theoddsgap.com."
                  },
                  "live_url": {
                    "type": "string",
                    "format": "uri"
                  },
                  "as_of": {
                    "type": "string",
                    "description": "The time of the scan, Eastern Time."
                  },
                  "attribution": {
                    "type": "string"
                  },
                  "license": {
                    "type": "string"
                  },
                  "responsible_gambling": {
                    "type": "string"
                  },
                  "scope": {
                    "type": "string"
                  },
                  "payment": {
                    "type": "object"
                  }
                },
                "required": [
                  "answer",
                  "page",
                  "as_of",
                  "responsible_gambling"
                ]
              }
            },
            "required": [
              "type"
            ]
          }
        },
        "required": [
          "input"
        ]
      }
    }
  }
}

Sign an EIP-3009 transferWithAuthorization for amount to payTo, put it in a version 2 PaymentPayload with the requirement you accepted, base64 it, and resend the same request with it in a PAYMENT-SIGNATURE header. On success the answer comes back 200 with the settlement in PAYMENT-RESPONSE.

curl -H "PAYMENT-SIGNATURE: $PAYLOAD" \
  "https://theoddsgap.com/assistant/v1/answer?q=hedge+my+Ravens+ticket+at+%2B240+for+%2450"
You pay only for an answer. A payment is settled only when the engine actually answers the question. If it declines, asks which game you meant, hits an error or returns 503, nothing is settled and your signed payment is not used. If our payment processor cannot be reached before settlement, or turns our account away, the answer is free. If a payment fails verification, or the processor reports that settlement failed, you get a 402, no answer and no charge. If the processor stops responding during settlement, or is still settling when the answer is ready, the answer comes back with "paid": null and the payment may settle once on chain, for that answer, never twice; its payment note says the outcome is unconfirmed.
SettingValue
Price0.02 USDC per answer
Free allowance10 answers per caller per day, Eastern
Networkeip155:8453
Asset0x833589fcd6edb6e08f4c7c32d4f71b54bda02913
Pay to0xa0d190daA6AA0839a86192d37fc388CA8E60302d
Settled throughPayAI's facilitator

Still on x402 version 1? The 402 body carries the version 1 requirements (maxAmountRequired, network base), and a payment sent in an X-PAYMENT header is settled through a version 1 facilitator, with the transaction in X-PAYMENT-RESPONSE.

Any x402 client library handles the signing. If you are doing it by hand, the scheme is documented at x402.org.

From your AI assistant (MCP)

Ask The Odds Gap sports betting price questions from your AI assistant. Answers come from prices we collect from US sportsbooks and prediction-market exchanges: which book pays the most for a bet, hedge math, parlay prices, a game's full board, past results and line moves. Every answer shows when the prices were scanned and links to the matching page on theoddsgap.com. Prices are a snapshot and may have moved. Information only: it places no bets and gives no picks. Some free answers each day; more through our paid answers API. 21+. Gambling problem? Call 1-800-GAMBLER.

Add this server to any assistant that speaks the Model Context Protocol: https://theoddsgap.com/assistant/v1/mcp. Remote Streamable HTTP, plain JSON replies, no login. It speaks the 2026-07-28 revision and the earlier ones that start with initialize.

{
  "mcpServers": {
    "theoddsgap": { "type": "http", "url": "https://theoddsgap.com/assistant/v1/mcp" }
  }
}

The primary tool is ask, one whole question through the same engine as tool=ask above; the others are: calc, site_info, slate, game_lines, past_game, team_record, futures_odds, player_prop, arbs, middles. MCP is free and information only, and no payment ever happens inside it. A hosted assistant gets 500 free answers a day shared by all its users, any other caller 10. Past that, the answer says so and points here, to the paid answers API.

Two Honest Limits

The Rest of the Connector

The machine description covers this endpoint and three read-only ones beside it: /board for today's games with the best price on each side, /game for one game, and /reference for our standing measured claims. Historical odds as CSV are at /data. The site map for machines is llms.txt. Indexes of paid x402 services, such as x402scan, read the discovery document.

Quoting a figure is welcome with attribution and a link to the page it came from. Bulk reuse of the underlying data is a conversation first: [email protected].