PuntersEdge Developers
Live odds for AI agents, with nothing to install
A hosted Model Context Protocol server for the PuntersEdge racing and sports odds API. Give any MCP client or agent platform one URL and your API key, and it can read every bookmaker's live prices, the best price per runner, what is moving, results, form and the closing-line archive. Each call is billed exactly like the REST call behind it.
Endpoint
https://api.puntersedge.online/mcp
Authentication
X-API-Key: your API key
or Authorization: Bearer your API key
Transport
Streamable HTTP · POST · stateless
MCP 2026-07-28, 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05
odds_board: each bookmaker listed once, and every runner's prices lined up beneath it.| Grafton R1 · win | ladbrokes_au | sportsbet | tab | betright | unibet |
|---|---|---|---|---|---|
| 2 Fabulous Fiano | 7.00 | 7.50 | 8.00 | 7.00 | 6.00 |
| 3 Foxwedge Arrow | 46.00 | 41.00 | 51.00 | — | — |
| quote age, s | 11 | 9 | 6 | 14 | 12 |
The documented example race from the API reference, abridged to two runners. Live calls return every runner, place prices and every book quoting the race.
Connect your client
Every route passes your key as a header; nothing runs on your machine. A free key is 3,000 credits a month with no card. Connectors added through the claude.ai or ChatGPT settings screens sign in with OAuth, which this endpoint does not use, so connect through one of the routes below.
Claude Code
One command, from the project directory. Add -s user to use it in every project.
claude mcp add --transport http puntersedge https://api.puntersedge.online/mcp \
--header "X-API-Key: YOUR_KEY"
Claude API (MCP connector)
Claude connects to the server itself during the request; your code holds no tool logic.
import os
import anthropic
client = anthropic.Anthropic()
response = client.beta.messages.create(
model="claude-opus-5-5",
max_tokens=4096,
betas=["mcp-client-2025-11-20"],
mcp_servers=[{
"type": "url",
"url": "https://api.puntersedge.online/mcp",
"name": "puntersedge",
"authorization_token": os.environ["PUNTERSEDGE_API_KEY"],
}],
tools=[{"type": "mcp_toolset", "mcp_server_name": "puntersedge"}],
messages=[{"role": "user", "content": "Best price for every runner in the next race at Randwick?"}],
)
OpenAI Responses API
The key goes in the tool's authorization field. Every tool is read-only, so approval can be skipped.
import os
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="<your OpenAI model>",
tools=[{
"type": "mcp",
"server_label": "puntersedge",
"server_url": "https://api.puntersedge.online/mcp",
"authorization": os.environ["PUNTERSEDGE_API_KEY"],
"require_approval": "never",
}],
input="Which runners are firming across several bookmakers right now?",
)
Cursor
.cursor/mcp.json in the project, or ~/.cursor/mcp.json for every project:
{
"mcpServers": {
"puntersedge": {
"url": "https://api.puntersedge.online/mcp",
"headers": { "X-API-Key": "YOUR_KEY" }
}
}
}
VS Code and GitHub Copilot
.vscode/mcp.json. VS Code prompts for the key once and stores it, so it stays out of the file:
{
"inputs": [
{ "type": "promptString", "id": "puntersedge-key", "description": "PuntersEdge API key", "password": true }
],
"servers": {
"puntersedge": {
"type": "http",
"url": "https://api.puntersedge.online/mcp",
"headers": { "X-API-Key": "${input:puntersedge-key}" }
}
}
}
Claude Desktop
Claude Desktop's Connectors screen signs in with OAuth, so pass the key through the
mcp-remote bridge in claude_desktop_config.json (Settings → Developer →
Edit Config), then restart Claude Desktop. Needs Node.js.
{
"mcpServers": {
"puntersedge": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://api.puntersedge.online/mcp",
"--header", "X-API-Key:${PUNTERSEDGE_API_KEY}"],
"env": { "PUNTERSEDGE_API_KEY": "YOUR_KEY" }
}
}
}
Microsoft Copilot Studio
- In your agent, open Tools → Add a tool → New tool → Model Context Protocol.
- Server URL:
https://api.puntersedge.online/mcp. - Authentication: API key, sent as a header named
X-API-Key. - Create the connection with your key, then add the tools you want the agent to use.
n8n
- Add an MCP Client Tool node to your AI Agent.
- Endpoint:
https://api.puntersedge.online/mcp; transport: HTTP Streamable. - Authentication: Header Auth with the name
X-API-Keyand your key as the value.
LangChain and LangGraph
With langchain-mcp-adapters, the tools load like any other LangChain tools:
import os
from langchain_mcp_adapters.client import MultiServerMCPClient
client = MultiServerMCPClient({
"puntersedge": {
"transport": "streamable_http",
"url": "https://api.puntersedge.online/mcp",
"headers": {"X-API-Key": os.environ["PUNTERSEDGE_API_KEY"]},
}
})
tools = await client.get_tools()
Any HTTP client
Every request stands alone, so one POST is a complete tool call:
curl -s https://api.puntersedge.online/mcp \
-H "Content-Type: application/json" \
-H "X-API-Key: $PUNTERSEDGE_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"odds_board","arguments":{"num_races":3,"country":"AU"}}}'
Tools
All read-only. Each tool calls one endpoint and costs what that endpoint costs. A tool your plan does not include answers with the plans that do, and is not billed.
| Tool | What it returns | Credits | Plan |
|---|---|---|---|
odds_boardLive odds board |
The next races to run with EVERY bookmaker's current win and place price for every runner, as a compact matrix: each race lists its bookmakers (with the age of each book's quote) and each runner carries price arrays in that order. The fastest way to see the whole live market. For the best price per runner use best_odds; for one race in depth use race_odds. | 2 credits | Every plan |
race_oddsOne race, every bookmaker |
One upcoming race in full: every runner with every bookmaker's win, place and (where offered) top 2/3/4 price, each book's quote age, scratchings and race conditions. Give the venue plus race_number or race_id; with only a venue you get that venue's next race. The call is billed even when the race is not on the live board (already run or not yet priced); the reply then lists the races that are. | 2 credits | Every plan |
best_oddsBest price per runner |
The best available win and place price for every runner in upcoming races and which bookmaker has it, after PuntersEdge's guards (books pricing under 100%, quotes read before a scratching and placeholder prices never win). Also how many books quote each runner, the best-vs-worst spread, and each race's market percentage on best prices. | 3 credits | Every plan |
odds_changesPrices that changed since a cursor |
Only the racing prices that moved since your last call, so an agent or pipeline can follow the whole market cheaply. First call: omit cursor (covers the last 60 seconds). Every reply has next_cursor; pass it back as cursor on the next call, within 30 minutes. Delivery is at-least-once: de-duplicate on (race_id, runner number, bookmaker, updated_at). | 2 credits | Every plan |
market_moversFirming and drifting runners |
Runners whose price has moved across several bookmakers since they opened (steam and drift), with the consensus open and current price and how many books confirm the move. | 3 credits | Every plan |
race_cardRace card (no prices) |
Upcoming races without prices: race_id, venue, race number, start time, distance, track condition, status, runners and scratchings. The cheapest way to find race_ids for the other tools. | 1 credit | Every plan |
race_marketsAll markets for one race |
Every bookmaker's prices for one race across win, place and top 2/3/4, plus exotic dividends once settled. Live prices before the jump, each book's closing price after it. Give race_id, or venue + meeting_date + race_number. | 2 credits | Plus and above |
| Tool | What it returns | Credits | Plan |
|---|---|---|---|
consensus_priceMargin-free consensus price |
Each runner's consensus probability and fair price for one race, built by removing every bookmaker's margin and combining the books, with the books included and excluded and why. | 3 credits | Every plan |
race_intelligenceRace market intelligence |
A one-race market read: consensus at each mark, how the market has moved, which books lead or lag, and the signals PuntersEdge derives from them. | 3 credits | Every plan |
price_historyPrice history for one race |
Every bookmaker's price path for each runner in one race: open, close, high and low, and optionally the time series. Give race_id, or venue + race_number + date. | 5 credits | Every plan for races in the last 24 hours; Standard and above for older races |
market_summarySettled market summary |
Per-runner market summary for past races: opening and closing consensus, the move between them and its signal class (strong_firm, firm, steady, drift, strong_drift). | 5 credits | Standard and above (last 90 days); Plus and above for the full archive |
closing_linesClosing prices archive |
Each bookmaker's closing price per runner from the archive, for model building, CLV and settlement checks. Closing-only rows by default (last quote within 5 minutes of the jump). | 5 credits | Standard and above (last 90 days); Plus and above for the full archive |
evaluate_clvClosing line value for your bets |
Grade up to 200 bets against the closing line: for each bet, the closing price (that book's, or the market best/median), CLV percent and P&L line. Name each race by race_id or venue + meeting_date + race_number, and each runner by runner_number or runner_name. | 5 credits per request | Plus and above |
| Tool | What it returns | Credits | Plan |
|---|---|---|---|
race_resultsRace results |
Settled results: placings with settled prices, starting prices where published, and dividends. Use date for a past day or hours_back for the latest. | 2 credits | Every plan |
race_formForm for a whole field |
Recent runs and form stats for every runner in one race. Give race_id, or venue + meeting_date + race_number. | 3 credits | Every plan |
horse_formOne horse's form |
A thoroughbred's recent starts and statistics, by name or the pe:/ra: reference other tools return. | 3 credits | Every plan |
track_conditionsTrack conditions |
Track rating, rail, weather and every logged change for a meeting day (defaults to today). | 1 credit | Every plan |
acceptancesAcceptances and fields |
Accepted fields for upcoming Australian meetings: runners, barriers, jockeys, trainers and weights, before the markets open. | 2 credits | Every plan |
| Tool | What it returns | Credits | Plan |
|---|---|---|---|
sports_listSports covered |
Every sport and league with live odds, its sport_key and how many events and bookmakers it has. | 1 credit | Every plan |
sports_oddsSports odds by bookmaker |
Every bookmaker's head-to-head, line and total prices for a sport's upcoming events. | 1 credit per market requested | Every plan |
sports_best_oddsBest sports prices |
The best price for each outcome of a sport's upcoming events and which bookmaker has it. | 3 credits | Every plan |
sports_movementsSports price movements |
How a sport's prices have moved since a time (default the last 24 hours), per bookmaker and outcome. | 5 credits | Standard and above |
| Tool | What it returns | Credits | Plan |
|---|---|---|---|
account_statusYour plan, credits and limits |
This API key's plan, credits used and remaining this month, burn rate, projected run-out date, requests-per-minute limit and the endpoints using the most credits. Call it before a large job. | 0 credits | Every plan |
feed_healthBookmaker feed health |
Live health of every bookmaker feed: seconds since its last good poll, whether it is stale or degraded. For operations teams deciding whether to trust a price right now. | 1 credit | Every plan |
bulk_datasetsBulk dataset catalogue |
The downloadable Parquet/CSV datasets (closing lines, price paths, results) and which days and months exist. Files are downloaded over REST with your key, never through MCP: GET https://api.puntersedge.online/v1/bulk/{dataset}/{period} (20 credits per day file, 100 per month file). | 0 credits | Business and above |
racing_sampleLive racing sample (no key) |
A small live sample of the next races with a few bookmakers' win prices, to see the data before you connect a key. | 0 credits | No key needed |
Follow the whole market for a few credits a minute
odds_changes returns only the prices that moved since your last call. Call it once
without a cursor, then pass each reply's next_cursor back. Delivery is at-least-once,
so de-duplicate on race, runner number, bookmaker and updated_at. A cursor older than
30 minutes is refused without charge; call odds_board to start again.
{"name": "odds_changes", "arguments": {"country": "AU"}}
→ {"next_cursor": "2026-10-22T05:06:08Z", "change_count": 41, "races": [...]}
{"name": "odds_changes", "arguments": {"country": "AU", "cursor": "2026-10-22T05:06:08Z"}}
Billing, limits and control
- One tool call is one API call. Same credits, same per-minute limit, one request against it. REST and MCP draw on the same allowance.
- Every result says what it cost. The last line reads like
cost 2 credits · 138,000 credits left this month · 498/500 requests left this minute, and_meta["online.puntersedge/usage"]carries the same figures plus arequest_idto quote to support. - Refusals are free. A malformed argument, a tool your plan does not include, or an empty answer costs nothing.
- Check before a big job.
account_status(free) returns the plan, credits left, burn rate and projected run-out date. - IP allowlists apply. A key restricted to listed addresses keeps that restriction. Hosted agent platforms call from their own addresses, so list theirs or use a separate key.
- Read-only. No tool places a bet, changes billing or touches keys, and the key never appears in tool output.
Hosted or local?
| Hosted (this page) | Local package | |
|---|---|---|
| Install | Nothing: a URL and a header | pip install puntersedge-mcp, Python 3.10+ |
| Runs | On PuntersEdge's servers | On your machine, next to the client |
| Works with | Agent platforms and IDEs: the Claude API, the OpenAI Responses API, Copilot Studio, n8n, LangChain, Claude Code, Cursor, VS Code | MCP hosts that start a local process: Claude Desktop, Claude Code, Cursor |
| Output | Typed results (structuredContent with an output schema) plus a compact text form | JSON text |
| Billing | Identical: each tool call costs what its endpoint costs | |
Protocol details
| Endpoint | https://api.puntersedge.online/mcp |
|---|---|
| Transport | Streamable HTTP. Clients POST JSON-RPC and get JSON back; GET answers 405. |
| Protocol versions | 2026-07-28, 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05. Clients that open with initialize and clients that send the version on every request are both served. |
| Sessions | None. Every request stands alone, so a reconnect costs nothing. |
| Resources | puntersedge://reference/plans, puntersedge://reference/tools, puntersedge://reference/data-dictionary, puntersedge://reference/licence. Free to read. |
| Prompts | pre_race_market_brief, trading_desk_sheet, steam_watch, clv_review |
| Manifest | https://api.puntersedge.online/mcp/manifest.json (no key needed) |
Using the data
What you may do with PuntersEdge data, including showing prices to your own users, depends on your plan and is set out in section 8.1 of the Terms. Read it before an agent's output reaches anyone outside your business.