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.
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.
| Field | What It Is |
|---|---|
answer | The answer in plain sentences, ready to relay. |
card | The same answer structured, for when you need the numbers rather than the words. |
warnings | The honesty flags, in plain words. An exchange price with barely $100 behind it says so; a price older than our freshness budget says so. |
options | Only 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. |
page | Our 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_url | The page that renders this data, where the full per-book table lives. |
as_of | The data's timestamp in Eastern Time, not the request's. Relay it. |
payment | Whether this answer was paid for (true, false, or null while the outcome is unconfirmed), the price, and how many free ones are left today. |
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.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.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"
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.| Setting | Value |
|---|---|
| Price | 0.02 USDC per answer |
| Free allowance | 10 answers per caller per day, Eastern |
| Network | eip155:8453 |
| Asset | 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913 |
| Pay to | 0xa0d190daA6AA0839a86192d37fc388CA8E60302d |
| Settled through | PayAI'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.
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.
503 and says so. It never returns a cheaper answer that might be wrong, and you are never charged for one.as_of and link live_url: an undated price is usually wrong by the time it is read.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].