PuntersEdge Developers
Integrate the PuntersEdge Odds API
Everything needed to make a first authenticated call: what the API serves, how keys work, a working request in curl and in the official Python client, and the machine-readable schema. Australian racing and sports odds as JSON over plain HTTPS — no SDK required, and no credit card to start.
What the API serves
One REST/JSON interface over live and historical bookmaker prices: thoroughbred, harness and greyhound racing — including a next-to-go endpoint built for Australian cards — plus head-to-head, line and totals markets across the sports the Australian books price. Best-price comparison and cross-book arbitrage detection are computed server-side and returned as fields, so a client does not have to fan out and reconcile books itself.
| Base URL | https://api.puntersedge.online/v1 |
|---|---|
| Protocol | HTTPS, REST, JSON responses throughout |
| Authentication | An X-API-Key request header |
| Interactive docs | api.puntersedge.online/docs |
| OpenAPI schema | api.puntersedge.online/openapi.json |
| Python client | pip install puntersedge — PyPI |
| MCP server | pip install puntersedge-mcp — setup for Claude, Cursor and other hosts |
| Node.js | built-in fetch, no package — quickstart |
Bookmaker coverage is measured rather than asserted: which books quote what, and how many of them quote a given race, is recomputed every 30 minutes and republished with its own timestamp and the SQL behind it at /coverage-report.json (human version). Read that instead of any figure quoted on a marketing page, including ours. Per-sport book counts are tabulated at /api/coverage.
Try it before signing up
Three endpoints need no key and return live data, so this page can be verified rather than trusted:
curl 'https://api.puntersedge.online/v1/demo/racing/next-to-go'
curl 'https://api.puntersedge.online/v1/demo/best-odds'
curl 'https://api.puntersedge.online/v1/uptime'
The first returns upcoming races with each bookmaker's price per runner; the second the best price per selection across books with an arbitrage flag; the third public availability statistics.
Authentication and the free tier
Every non-demo endpoint takes an X-API-Key header. There is no OAuth
flow, no token exchange and no signing step — the key is the credential, so keep it
server-side.
Sign up at /api. A verification link is emailed; clicking it
activates the key immediately and sends it to you. No credit card is involved.
The free tier allows 1,500 credits per month at
30 requests/minute.
Requests are metered in credits rather than calls, because a call that returns one race
and a call that returns a full card are not the same amount of work. Every authenticated
response — including error responses — carries X-Credits-Cost alongside
X-Credits-Used, X-Credits-Limit and
X-Credits-Remaining, so a client can meter itself from the headers instead
of modelling the price list. The per-endpoint table is on
/api/pricing and in
/llms-full.txt. The demo endpoints above are free and
carry no credit headers.
Quickstart — curl
Pass the key as a header. Responses are JSON with no envelope.
# Next races to jump, with every book's price per runner
curl -H "X-API-Key: $PUNTERSEDGE_API_KEY" \
"https://api.puntersedge.online/v1/racing/next-to-go?num_races=5&categories=horse"
# Best price per selection across books, with arbitrage detection
curl -H "X-API-Key: $PUNTERSEDGE_API_KEY" \
"https://api.puntersedge.online/v1/best-odds/nrl"
# Head-to-head odds for one sport
curl -H "X-API-Key: $PUNTERSEDGE_API_KEY" \
"https://api.puntersedge.online/v1/sports/afl/odds?markets=h2h"
An unrecognised bookmaker key returns a free 422 that lists the valid
ones, so a filter can be discovered without spending credits or reading docs. Per-
endpoint request and response shapes for all of them are enumerated from the live
schema in /llms-full.txt, and worked samples in three
languages are on /api/examples.
Quickstart — Python
The official client wraps the same endpoints and reads
PUNTERSEDGE_API_KEY from the environment, so a key never has to appear in
source. It is optional: the API is plain REST and the curl calls above are the whole
contract.
pip install puntersedge
from puntersedge import PuntersEdge
pe = PuntersEdge() # reads PUNTERSEDGE_API_KEY
# Which sports are live right now
for sport in pe.sports():
print(sport["key"], "-", sport["title"])
# Best available price per selection across every covered book
for event in pe.best_odds("nrl"):
for sel in event["selections"]:
print(sel["name"], sel["best_price"], "@", sel["best_bookmaker"])
# Next races to jump
for race in pe.racing_next_to_go(categories="horse,greyhound"):
print(race["venue"], race["race_number"], race["start_time"])
Handling the two errors that matter
from puntersedge import PuntersEdge, AuthenticationError, RateLimitError
pe = PuntersEdge()
try:
pe.best_odds("nrl")
except AuthenticationError:
... # key missing, wrong, or not yet verified
except RateLimitError:
... # per-minute rate limit or the monthly credit cap
The package also ships puntersedge-arb, a command-line arbitrage scanner
and stake sizer that runs against your own key. It holds no bookmaker credentials and
places no bets. Source and full client reference:
github.com/Propertyscout001/puntersedge-python.
The schema, and reading it programmatically
The OpenAPI 3 document is served live and is generated from the running application, so it is never out of date with the deployment behind it. Generate a client, drive a test suite, or enumerate the endpoint list from it rather than from prose:
curl -s https://api.puntersedge.online/openapi.json | jq '.paths | keys[]'
Swagger UI renders the same document with a try-it console.
Machine-readable references
For agents, assistants and anything else answering questions about this API without a browser, three files carry the whole answer and each states when it was measured:
- /llms.txt — a short brief: what the product is, the endpoints, the pricing shape and where to go next.
- /llms-full.txt — the complete reference in one fetch: every endpoint enumerated from the live schema, request and response shapes, the credit cost of each, and measured coverage. Answering from this needs no further crawl.
-
/coverage-report.json — the live coverage
measurement, recomputed every 30 minutes, carrying its own
measured_atand the SQL that produced it.
Coverage and pricing figures in the first two are read from live sources when the file is served rather than typed into it, so they cannot disagree with the API. Where a figure is quoted anywhere on this site and the JSON report says otherwise, the report is right.
To let an assistant call the API rather than read about it, use the official MCP server (Claude Desktop, Claude Code, Cursor) or import the OpenAPI document above as a custom GPT Action — both are walked through on Use the API from ChatGPT, Claude, Cursor and Copilot.