PuntersEdge Developers
Getting Started with the PuntersEdge API
PuntersEdge API delivers live and historical odds from Australian bookmakers — 15 on racing, 6 on sports. Start with a free key, make your first call in under two minutes.
1. Get a free API key
Sign up at the API Platform page to request your free API key. We email a verification link — click it and your key is active immediately and emailed to you. The free tier provides 3,000 credits per month, capped at 30 requests per minute — enough for exploration and lightweight integrations.
2. Your first odds request
Pass your API key in the X-API-Key header. All responses are JSON.
# Next races — every covered bookmaker's price per runner
curl -H "X-API-Key: YOUR_KEY" \
"https://api.puntersedge.online/v1/racing/next-to-go?num_races=5&country=AU"
# Racing — best price per runner only
curl -H "X-API-Key: YOUR_KEY" \
"https://api.puntersedge.online/v1/racing/best-odds?categories=horse&country=AU"
# Sports use the same header and shape
curl -H "X-API-Key: YOUR_KEY" \
"https://api.puntersedge.online/v1/sports/nrl/odds?markets=h2h"
# Horses only, and more of them
curl -H "X-API-Key: YOUR_KEY" \
"https://api.puntersedge.online/v1/racing/next-to-go?num_races=10&categories=horse&country=AU"
Keep country=AU on racing calls while you are getting started: without it the next races to jump are often overseas meetings priced by a single bookmaker, which is not what the API is for and not what the plan cards describe.
The same first request from Python and JavaScript, nothing to install beyond requests:
# Python 3 — pip install requests
import requests
r = requests.get(
"https://api.puntersedge.online/v1/racing/next-to-go",
params={"num_races": 5, "country": "AU"},
headers={"X-API-Key": "YOUR_KEY"},
timeout=15,
)
r.raise_for_status()
for race in r.json():
print(race["venue"], "R%s" % race["race_number"], race["category"])
for runner in race["runners"][:3]:
quoted = [b for b in runner["bookmakers"] if b.get("win_price")]
if quoted:
best = max(quoted, key=lambda b: b["win_price"])
print(" ", runner["name"], best["win_price"], "@", best["key"])
// JavaScript — Node 18+, Deno, Bun or a browser (fetch is built in)
const res = await fetch(
"https://api.puntersedge.online/v1/racing/next-to-go?num_races=5&country=AU",
{ headers: { "X-API-Key": "YOUR_KEY" } },
);
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
for (const race of await res.json()) {
console.log(race.venue, `R${race.race_number}`, race.category);
for (const runner of race.runners.slice(0, 3)) {
const quoted = runner.bookmakers.filter((b) => b.win_price);
if (quoted.length) {
const best = quoted.reduce((a, b) => (b.win_price > a.win_price ? b : a));
console.log(" ", runner.name, best.win_price, "@", best.key);
}
}
}
Prefer a typed client? pip install puntersedge (Python guide) or npm install puntersedge (TypeScript client), and the MCP server puts the same endpoints inside Claude and Cursor with no code at all.
3. Supported workflows
- Live odds polling — Racing polling is per book and it is not uniform. Measured over the trailing 7 days to 2026-10-06 through the 10:00–21:00 AEST card, the median age of a connector's last successful read is 8–17s for fourteen of the fifteen served books, 74s for bet365. There is no single racing poll interval to quote: the slowest served book is 9x the fastest, so any blanket figure is wrong for a named book. Every quote carries its own age_seconds — that is the number to gate on.
- Sports polling — sports markets move far more slowly than racing, and every market carries a
qualityobject with its ownage_seconds. Gate a refetch on that age rather than on a fixed interval, or you spend credits on an unchanged payload. - Best-price detection — use
/best-odds/{sport}to get the top price per outcome across all covered bookmakers, plus an arb flag. - Racing next-to-go — horses, greyhounds and harness across the 15 Australian fixed-odds books. Betfair Exchange and Pinnacle are ingested for internal reference and withheld from customer responses, so a customer key never receives those keys.
- Historical data — see Historical Odds API for past prices and results. The two sports history endpoints are on Standard and above; Free and Hobby get a
403.
4. Coverage summary
Measured 2026-10-06 over a trailing 7-day window, 15 Australian bookmakers quoted racing prices a customer key can read. 16 connectors quoted at all: the difference is Betfair Exchange and Pinnacle, ingested for internal reference and withheld from customer responses. Quote the served figure unless you mean the other one.
Full matrix at Australian Bookmakers Coverage.
- Racing — 15 books: Sportsbet, BetDeluxe, BetGold, BoostBet, TAB, BetRight, PointsBet, TABtouch, Palmerbet, Betr, Unibet, NextBet (formerly PlayUp), Ladbrokes, Neds and bet365. Horses, greyhounds, harness.
- Sports — 6 books across 20 queryable sport keys. Measured 2026-10-06 over the trailing 7 days, Rugby Union, NBA, NRL, NFL, College Football, AFLW, WNBA, Super League, NHL and EPL carry more than one customer-served bookmaker on the majority of fixtures; on Tennis ATP, Tennis WTA, MLB, NRLW, Soccer (Other Competitions), Basketball (Other Competitions), Cricket (Other Competitions), MMA/UFC and Test Cricket you are usually looking at a single price. The rule is one line — a sport is multi_book when at least 50% of its quoted fixtures in the window carried two or more customer-served bookmakers, single_book when it is below that, seasonal when no served book quoted any fixture, and not_queryable when the API 404s the key — so a sport is in exactly one of those lists. A-League (1 books, 11 fixtures) is ingested and quoted by a served bookmaker but is not reachable: the API 404s the key. It is measured here and excluded from the coverage table rather than counted as coverage. Check the live coverage map before you build on a single sport.
5. Pricing plans
- Free: 3,000 credits/month — no card required
- Hobby: 7,500 credits/month — $9 AUD/month
- Standard: 75,000 credits/month — $29 AUD/month
- Plus: 140,000 credits/month — $49 AUD/month
- Business: 300,000 credits/month — $99 AUD/month
- Platform: 1.5M credits/month — $199 AUD/month
- Scale: 5M credits/month — $249 AUD/month
Calls cost 0–100 credits depending on the endpoint — /v1/usage and /v1/health are free, /v1/sports/{key}/odds costs 1 per market type, the history and price-history endpoints cost 5 credits, and the ceiling is a bulk CSV export of /v1/racing/closing-lines. See the full credit table. Upgrade at any time on the platform page.
API reference for the endpoints in this guide
Hit something the API can't do yet? An endpoint, a bookmaker, a market — ask for it. Requests from people mid-integration are the ones that get built.