Every change to endpoints, coverage, pricing and docs that a customer can see. 104 entries from 2026-03-01 to 2026-09-29.
Subscribe: JSON Feed · RSS · weekly write-up at the devlog
| Date | Change | Affected |
|---|---|---|
| 2026-09-29 | ||
| 2026-09-29 | New /v1/sports/{sport_key}/closing-lines (5 credits, on the plans that reach historical odds): one row per match with each bookmaker's last head-to-head price, handicap line and total before the start, and the consensus across books — the median closing price, the most common closing line and the median price at it. Sports odds history now stores the line with the price: `home_point` and `away_point` on /odds/history and /odds/movements, each side's handicap on the line market and the total on the totals market, where Over is the home side and Under the away side (rows before 29 September carry prices only). TAB's AFLW markets are collected from today, AFL and AFLW price history is kept permanently rather than for 90 days, and the two spellings every AFLW club had across bookmakers are one fixture again |
/v1/sports/{sport_key}/closing-lines, /v1/sports/{sport_key}/odds/history, /v1/sports/{sport_key}/odds/movements 5313b9f |
| 2026-09-29 | Meeting-level exotic dividends on /v1/racing/results: `dividends.multi_race` now carries the Quaddie, Early Quaddie, Giant 6 (the six-leg product TAB calls Big6) and daily doubles the source book declares, each attached to the race that is the product's final leg, with the legs, the winning selection and the dividend per $1 for each declared pool. Rows before 29 September have no `multi_race` key, so read it with `.get()`. The per-race exotics (quinella, exacta, trifecta, first four) under `dividends.exotics` are unchanged and have been on every settled result since 16 August. Like every dividend on this endpoint they fill in on the poll after the finishing order is published |
/v1/racing/results ffe6fd6 |
| 2026-09-28 | ||
| 2026-09-28 | New /v1/racing/form (3 credits): every runner in one race with its recent runs from our own settled results, in one call. The field comes from the live card (saddlecloth, barrier, jockey, trainer, weight; a scratched horse stays in it, marked) or, once the race has been run, from the settled result; under each runner its last runs with date, venue, distance, class, track condition, barrier, weight, position, margin and official SP, plus a starts/wins/places summary. Only runs before the race's own start are included, so a race already run answers with what was knowable at the jump. The results collector now keeps `weight_kg`, `carried_kg` and `race_class` on every thoroughbred runner it stores, served on /v1/racing/horses/runs and on the own-data answers of /v1/racing/horses/form; runs stored before 28 September carry them once that meeting's page has been re-read. The history collector now stores distance and track condition off Racing Australia's race header as well |
/v1/racing/form, /v1/racing/horses/runs, /v1/racing/horses/form, /v1/racing/results 389f919 |
| 2026-09-28 | Closing-line archive: runners the result marked scratched are flagged in a new last column, scratched, and left out of /v1/racing/closing-lines unless you pass include_scratched=true; 9,074 rows are flagged, 0.56% of the archive. Price paths keep them, with the flag, because a path is history; closing line value scores a scratched runner with reason=runner_scratched instead of against a price it never closed at; the coverage endpoint reports scratched_rows. The column is appended last, so positional readers are unaffected |
/v1/racing/closing-lines, /v1/racing/price-paths, /v1/racing/clv, /v1/racing/closing-lines/coverage aec389f |
| 2026-09-28 | BetDeluxe racing prices come from the racecard the BetDeluxe race page renders; checked against the live page, every runner matched on win and place. The closing-line archive holds BetDeluxe closes from 28 September 2026 |
/v1/racing/* (bookmaker betdeluxe), /v1/racing/closing-lines ff2e59c |
| 2026-09-28 | /v1/racing/horses/form answers from our own settled results when Racing Australia does not serve the horse's page. The answer says what it is: source.feed is puntersedge_results, source.note says what the runs cover, and profile and career are null because only Racing Australia has them; the 503 stands only when we hold nothing. New optional fields HorseRun.venue, HorseRun.origin and HorseSource.note. /v1/racing/horses/runs carries origin per run (results or history), reads coverage_from from the data, and now reaches before 15 August through runs collected from Racing Australia's published results |
/v1/racing/horses/form, /v1/racing/horses/runs 8f1d3d9 |
| 2026-09-28 | Email and password login for API accounts: POST /v1/login, POST /v1/password/forgot, POST /v1/password/reset, POST /v1/account/password and GET /v1/account. A password login returns the same 30-day console session as the emailed link; a reset link lasts 30 minutes and signs every other device out. POST /v1/signup takes an optional password on a free key, /v1/usage adds password_set and billing_attached, and GET /v1/billing/upgrade-link hands the signed-in console a link to the prorated upgrade page |
/v1/login, /v1/password/forgot, /v1/password/reset, /v1/account/password, /v1/account, /v1/usage, /v1/signup, /v1/billing/upgrade-link 7b81cfc |
| 2026-09-28 | Consent at signup: POST /v1/signup accepts terms_accepted and marketing_opt_in; GET /v1/account reports when the Terms were accepted and whether promotional email is on; POST /v1/account/marketing turns promotional email on or off. The promotional box is unticked by default on every form |
/v1/signup, /v1/account, /v1/account/marketing 7062905 |
| 2026-09-25 | ||
| 2026-09-25 | Yearly subscribers upgrade on the yearly price: /v1/billing/upgrade moves a yearly subscription to the same tier's yearly price and charges only the difference for the rest of the year, with the renewal date unchanged |
/v1/billing/upgrade 7394fad |
| 2026-09-25 | Every operation that returns JSON has a success example in the OpenAPI document, including team keys, widgets, referral, console login, closing line value, race markets and the bulk dataset list |
/openapi.json 02ef0b6 |
| 2026-09-24 | ||
| 2026-09-24 | Rate limits: Plus is 500 requests a minute (was 250) and Business 750 (was 300). Every key on those plans has the new limit |
all endpoints (Plus, Business) b5b56ee |
| 2026-09-24 | The race markets view is included for Standard keys issued before 20 September |
/v1/racing/markets 7d107f9 |
| 2026-09-24 | POST /v1/signup refuses a free-key address that cannot receive mail — a misspelt provider, a domain that does not exist, a domain with no mail server — with a 400 that suggests the fix. Nothing is created |
/v1/signup 3356f1d |
| 2026-09-24 | Every racing endpoint accepts both categories= and category=. An unknown value is a free 422 naming the three valid values, horse, greyhound and harness |
/v1/racing/* b9580d8 |
| 2026-09-24 | Acceptance fields (jockey, trainer, barrier, weight, form) are stored per race slot, so a horse engaged in two races on one day is enriched in both, and the enrichment checks the race number before filling a runner |
/v1/racing/next-to-go, /v1/racing/events, /v1/racing/acceptances 20a1e08 |
| 2026-09-23 | ||
| 2026-09-23 | /v1/racing/next-to-go and /v1/racing/events serve every country by default. Pass country=AU for Australian races with the full Australian bookmaker panel |
/v1/racing/next-to-go, /v1/racing/events aea5dbf |
| 2026-09-22 | ||
| 2026-09-22 | Next-to-go is priced by what it returns, for keys created from 22 September: 2 credits for up to 20 races, 3 for 21 to 60, 4 for 61 to 200. The default request costs what it always did, and keys created before then pay 2 at any size |
/v1/racing/next-to-go a35caf1 |
| 2026-09-22 | A tiered forward window on events and best odds: Free and Hobby reach 24 hours ahead, Standard 48, Plus and above seven days. A request past the ceiling is a free 403 naming the tier that reaches further. Both take hours_ahead and a date= alias |
/v1/racing/events, /v1/racing/best-odds e604680 |
| 2026-09-22 | The free tier is 3,000 credits a month, up from 1,500, and every paid plan can be bought yearly: ten months' price for twelve months, credits still resetting monthly. A promotion code cannot be applied to a yearly term |
all endpoints (free plan), /v1/signup e6781d4 |
| 2026-09-21 | ||
| 2026-09-21 | The race markets view: GET /v1/racing/markets returns every market on one race in a single call — win, place and the Same Race Multi legs Top 2, Top 3 and Top 4 — per bookmaker, with each book's market percentage, the best price per runner in each market, and the settled exotic dividends (quinella, exacta, trifecta, first four) once the race has been run. Top 2/3/4 are quoted by Sportsbet, Ladbrokes, Neds and PointsBet and by no other book in the feed, so an empty Top 3 is a fact about the market rather than a gap in ours. The place price and those legs used to exist only while a race was open — the live table is purged ten minutes after the jump and the closing-line archive carries the win price only — so a capture now stores the last price each book showed before the off, every minute, and a race that has already run is answered from that. Name the race with race_id, or venue + meeting_date + race_number. Two new bulk datasets come with it: `markets` (race × runner × bookmaker, from 21 September 2026) and `exotic_dividends` (race × dividend, backfilled to 15 August 2026). 2 credits; Plus and above | /v1/racing/markets, /v1/bulk/markets, /v1/bulk/exotic_dividends |
| 2026-09-21 | White-label odds widget for Platform: an embeddable live-odds frame that carries YOUR branding instead of ours — your colours, your title, your bookmaker or affiliate links, and no PuntersEdge credit anywhere on it. POST /v1/widgets creates one and hands back the iframe snippet; GET, PATCH and DELETE manage the set (ten per account, primary key only, all free). Each runner's best price links to the book quoting it through your own template — {url} is the book's page, percent-encoded — with per-bookmaker overrides, and we append nothing of our own to your links. Lock a widget to your own site with allowed_origins, and cap what it can cost with max_fills_per_hour. A fill costs 2 credits for racing or 1 for a sports market and is cached for 60 seconds per parameter set, so a page with ten thousand readers costs what a page with one reader costs. Platform and Enterprise only: this is the redistribution licence, not a volume feature, so Scale does not include it. The free credited widget at /widgets is unchanged and stays on every plan | /v1/widgets, /v1/widgets/{widget_id} |
| 2026-09-21 | A stable horse identity: every thoroughbred runner on /v1/racing/results (runners and placings), /v1/racing/next-to-go, /v1/racing/best-odds, /v1/racing/closing-lines, /v1/racing/price-paths (JSON, CSV and Parquet, last column), /v1/racing/horses/form, /v1/racing/horses/runs and the backfill results now carries `horse_ref` (`pe:<name>`), the same value everywhere and on every stored row. `runner_ref` (`ra:<code>`) is now documented as what it is: Racing Australia's code for that day's entry, which joins to that meeting's page and changes from meeting to meeting (measured: 1,450 of 1,452 horses with two or more runs). A name on /v1/racing/horses/form resolves to one horse, `pe:` refs are accepted everywhere a name is, and the form store is keyed by horse so a page read under one entry code serves every later lookup |
/v1/racing/results, /v1/racing/next-to-go, /v1/racing/best-odds, /v1/racing/closing-lines, /v1/racing/price-paths, /v1/racing/horses/form, /v1/racing/horses/runs, /v1/racing/horses/backfill ddb2614 |
| 2026-09-21 | Overage for Business and Platform: those two plans no longer stop dead at the monthly allowance. With overage on, calls keep being served up to 50% past it — 450,000 credits on Business, 2,250,000 on Platform — and the credits used beyond the allowance are invoiced with your next payment at A$0.60 per 1,000 on Business and A$0.30 on Platform, rounded up to whole thousands. The ceiling is the promise: at most A$90 and A$225 can be added to a month, and the 402 at the ceiling names it. Past the allowance every response carries X-Credits-Overage and X-Credits-Overage-Ceiling; /v1/usage and /v1/keys/info carry an `overage` object, and /v1/usage adds credits_remaining_with_overage beside the unchanged credits_remaining. New GET and POST /v1/billing/overage read and switch it (free, primary key only). It is ON by default for keys created from 22 September 2026 and OFF for every key issued before then — nothing changes for an existing key unless you switch it on. Every plan below Business keeps its hard stop | /v1/billing/overage, /v1/usage, /v1/keys/info |
| 2026-09-21 | Greyhound runners carry the measured columns the results pages print: `first_split_s`, `second_split_s`, `weight_kg`, `pir` (Victorian tracks) and `grade`, on /v1/racing/results runners and on every run from /v1/racing/greyhounds/form, null where the page printed none; /v1/racing/greyhounds/stats adds `avg_first_split_s`. Runs stored before 21 September keep their old shape. A dog racing under both registries (grv: and grsa:) is now one record from either ref, and a 90-day history of runs from the same pages is being added behind the live store, moving `source.coverage_from` back as it lands. A dead-man watch now pages if either greyhound collector or the hourly refresh stops |
/v1/racing/results, /v1/racing/greyhounds/form, /v1/racing/greyhounds/stats 070932f |
| 2026-09-21 | New /v1/racing/horses/runs (3 credits): every run we hold for one horse from our own settled thoroughbred results since the 1 September 2026 card — date, track, race, distance, saddlecloth, barrier, position, margin, official SP, jockey, trainer, field size, each joined to its results row — with a starts/wins/places summary and honest coverage dates on every response. Unknown horse is a free 404. The horse backfill job status now carries an `upstream` block that says when Racing Australia is serving its bot-protection challenge to fresh form reads, since when, and that nothing is lost or billed while it lasts |
/v1/racing/horses/runs, /v1/racing/horses/backfill/{job_id}, /v1/racing/horses/form 9a2bafe |
| 2026-09-21 | Per-key monthly caps on team keys. POST /v1/keys/team now takes an optional `monthly_cap`, and the new PATCH /v1/keys/team/{key_id} sets one, changes it, removes it (send null) or relabels the key. A cap is the most credits THAT key may spend in a period, hard, inside the shared pool — anything from 1 to your plan's own monthly allowance — so an agency or a tipping site can hand each client its own key and its own limit. A capped key refuses with 402 at its cap, naming the cap and the key's label, and the pool is not charged; X-Credits-Key-Used and X-Credits-Key-Cap ride beside the pool headers on every billed response. Caps reset with the pool on the 1st, only the primary key sets them, and GET /v1/keys/team and the key's own /v1/usage both report them. Free | /v1/keys/team, /v1/keys/team/{key_id}, /v1/usage |
| 2026-09-21 | Team keys for Business and above: POST /v1/keys/team mints another key on your account that draws on the same monthly credit pool and plan, with its own rate-limit bucket, IP whitelist and line in the usage breakdown; GET lists them with each key's calls and credits this period; DELETE revokes one and keeps its history. Keys per account, primary included: Business 3, Platform 5, Scale 10. /v1/usage and /v1/keys/info on any key of the pool now carry a `pool` / `team` object with the shared balance and each key's share. Free | /v1/keys/team, /v1/keys/team/{key_id}, /v1/usage, /v1/keys/info |
| 2026-09-21 | Runner-level betslip deep links are now a Plus feature: `betslip_win_url`, `betslip_place_url` and `betslip_app_only` on next-to-go legs and `betslip_url` on best-odds quotes are served on Plus and above, and Standard and Hobby keys issued before 21 September keep them. The race-page `source_url` stays on every plan. The same three fields now also ride on each `changed_runners` leg of /v1/racing/changes, so a poller gets the move and the slip link in one object. TAB links are back: the daily check had failed since 8 September because TAB blocks the VPS's browser, not because the route changed; it now runs from a box TAB serves |
/v1/racing/next-to-go, /v1/racing/best-odds, /v1/racing/changes 1b66411 |
| 2026-09-20 | ||
| 2026-09-20 | New bulk dataset files for the commercial tiers. GET /v1/bulk/datasets (no credits) lists five datasets — closing_lines, price_paths, results, acceptances, track_conditions — and every pre-built file that exists; GET /v1/bulk/{dataset}/{period} returns one whole Sydney meeting day (YYYY-MM-DD, Business and above, 20 credits) or one calendar month (YYYY-MM, Platform and above, 100 credits) as a single Parquet or gzip CSV file, with the same rows the paged endpoints serve. Files are rebuilt nightly at 02:30 Sydney for the previous three days and the current month; an unchanged file answers 304 for free when you send its sha256 in If-None-Match | /v1/bulk/datasets, /v1/bulk/{dataset}/{period} |
| 2026-09-20 | The ladder above Standard now has things to sell, for keys issued from today. Plus carries the model-builder set: the permanent closing-line archive, the /v1/racing/price-paths bulk export (CSV, Parquet, JSON), the new POST /v1/racing/clv closing-line value scorer, the paced form backfill and webhook subscriptions. Standard reads a rolling 90-day window of the archive (`window_days` is 90 and the response carries `X-Archive-Window-Days`), and keeps historical sports odds, movements and per-race price history. Business adds IP whitelisting. Every key issued before today keeps exactly what it was sold: the permanent archive, the export and webhooks stay on existing Standard keys, and `window_days` comes back null for them |
/v1/racing/closing-lines, /v1/racing/price-paths, /v1/webhooks, /v1/keys/ip-whitelist 1e2e864 |
| 2026-09-20 | New POST /v1/racing/clv (5 credits, Plus and above): score up to 200 bets against the closing line. Name each race by race_id or venue + meeting_date + race_number and each runner by runner_ref, saddlecloth number or name; send the price taken and optionally the bookmaker and stake. Per bet you get the named book's closing price or the market's best/median, `clv_pct`, `beat_close`, the result and flat-stake `pnl`; across the list the average and median CLV, beat-the-close rate, win rate and ROI. Bets that do not resolve say why and are left out of the averages |
/v1/racing/clv 1e2e864 |
| 2026-09-20 | Upgrading in place: choosing a higher tier on the pricing page or through /v1/signup while you already subscribe now emails you a link to the prorated upgrade instead of starting a second subscription. You pay only the difference for the rest of the month, your billing date does not move and your key is unchanged |
/v1/signup, /v1/billing/upgrade 5317747 |
| 2026-09-20 | Greyhound form and stats are back, on our own results: /v1/racing/greyhounds/form returns every run we hold for a dog (date, track, distance, box, position, time, winner's time, margin, official SP, trainer, field size, joined to its results row) and /v1/racing/greyhounds/stats splits that record by track, distance, box or any combination. The store is our settled greyhound results from the 13 September 2026 card, rebuilt hourly; nothing earlier exists, and `source.coverage_from` says so on every response. 3 credits; an unknown dog is a free 404. Identity is the dog's name, with grv:/grsa: registry refs listed and accepted as a filter |
/v1/racing/greyhounds/form, /v1/racing/greyhounds/stats 6bca308 |
| 2026-09-20 | Greyhound full-field results for every state from our own collection: /v1/racing/results rows for NSW, Queensland, SA, WA, Tasmanian and NT greyhound tracks carry the full `runners` array (position, box, time, margin, trainer) and the official `sp`, collected hourly by PuntersEdge from published results with `field_source: grsa`, from the 13 September card. Victorian tracks keep `field_source: fasttrack`. A field is written only when every placegetter in our own bookmaker-fed placings sits at the same position in the collected field; `field_status` says where each race is |
/v1/racing/results, /v1/racing/results/coverage c652125 |
| 2026-09-20 | Greyhound full-field results return for Victorian tracks from our own collection: /v1/racing/results rows for the 13 Victorian greyhound tracks carry the full `runners` array (position, box, time, margin, trainer) and the official `sp` again, collected hourly by PuntersEdge from published results with `field_source: fasttrack`, from the 13 September card. A greyhound race at a track outside Victoria reports `field_status: unsupported` with a note until its state has a collector |
/v1/racing/results, /v1/racing/results/coverage 9475676 |
| 2026-09-20 | Greyhound form and stats withdrawn: /v1/racing/greyhounds/form and /v1/racing/greyhounds/stats answer 410, charge nothing and are no longer in the schema. Greyhound results no longer carry the full-field `runners` array or an official `sp`: `field_status` on every AU greyhound result is `unsupported` with a note saying why, and `placings`, `deductions` and `dividends` are unchanged. The greyhound `grv:` runner_ref namespace is withdrawn from the closing-line and price-path archives. Reason: that data came from the GRV Topaz feed, which PuntersEdge holds no licence to republish. The box-statistics table has also been removed from the public greyhound results pages |
/v1/racing/greyhounds/form, /v1/racing/greyhounds/stats, /v1/racing/results, /v1/racing/closing-lines, /v1/racing/price-paths 74b7177 |
| 2026-09-06 | ||
| 2026-09-06 | /v1/racing/price-paths and /v1/racing/closing-lines export Parquet: `format=parquet` returns the same table typed, for `pd.read_parquet`. Abandoned, postponed and transferred meetings appear on /v1/racing/results as `status=abandoned` with `status_note` carrying Racing Australia's word, empty placings and null runners. /v1/racing/changes runner deltas carry the Top 2/3/4 legs |
/v1/racing/price-paths, /v1/racing/closing-lines, /v1/racing/results, /v1/racing/changes aaef189 |
| 2026-09-05 | ||
| 2026-09-05 | New /v1/racing/track-conditions (1 credit): per meeting, the current official track condition, weather and rail from Racing Australia, plus the day's change log — every transition observed, previous value beside the new one, when it was seen and which feed saw it. Bookmaker rows carry race_id; RA rows carry the rail |
/v1/racing/track-conditions 5d08459 |
| 2026-09-05 | Same Race Multi legs per runner and per book: `top2_price`, `top3_price` and `top4_price` on next-to-go and events (TAB, Ladbrokes, Neds, PointsBet; Sportsbet where its racecard offers them). Guaranteed win_price >= top2 >= top3 >= top4 > 1.0; a leg that breaks the order at the source is dropped rather than published |
/v1/racing/next-to-go, /v1/racing/events adc9d6f |
| 2026-09-05 | Scratchings carry the book's own stamp and flags: entries are {name, number, barrier, scratched_at, late, emergency}, merged across every reporting book and Racing Australia's official scratching sheet, visible from the moment a book reports one |
/v1/racing/events, /v1/racing/next-to-go d867c51 |
| 2026-09-05 | `runner_ref` is the last column on /v1/racing/closing-lines and /v1/racing/price-paths (`ra:<horsecode>` for thoroughbreds, `grv:<dogId>` for greyhounds), so archive rows join to live and results runners on a stable id instead of a name |
/v1/racing/closing-lines, /v1/racing/price-paths 26774d1 |
| 2026-09-04 | ||
| 2026-09-04 | Runner-level betslip deep links: `betslip_url` beside `source_url` on best_win and best_place quotes, for the books that publish a runner route; null where the book has none |
/v1/racing/best-odds 1b36c5c |
| 2026-09-03 | ||
| 2026-09-03 | New /v1/racing/horses/backfill: queue a list of horses for paced Racing Australia form collection instead of looping /v1/racing/horses/form. Free to submit, 3 credits per horse when delivered; unknown names come back in not_found, ambiguous ones with candidates. Plus and above |
/v1/racing/horses/backfill 5f8a879 |
| 2026-09-03 | The full day's card: /v1/racing/next-to-go looks 24 hours ahead instead of six, so an Australian morning pull returns the afternoon. Every race carries `refresh_tier` (live inside three hours of the jump, slower beyond), so a far-out price is declared stale rather than hidden. `books_quoting_win` and `books_quoting_place` are counted separately on /v1/racing/best-odds; `books_quoting` is retained and equals books_quoting_win |
/v1/racing/next-to-go, /v1/racing/events, /v1/racing/best-odds 29b5f14 |
| 2026-09-03 | Official starting price on /v1/racing/results: `sp` on every runner and placing, from Racing Australia for thoroughbreds and Topaz for greyhounds. Null while a result is interim |
/v1/racing/results cf30732 |
| 2026-09-03 | The active bookmaker catalogue is 14 Australian books. Six that had delivered no prices for more than 48 hours left the active list; their keys are still accepted in `bookmakers=` filters so nothing 422s | Coverage |
| 2026-09-02 | ||
| 2026-09-02 | New plans: Plus at A$49/month for 140,000 credits and Platform at A$199/month for 1,500,000 credits with redistribution rights — Platform is the only plan that permits redistribution. Upgrades are now in place and prorated: GET /v1/billing/upgrade with your key shows the options, you keep the same key and pay the difference for the rest of the period |
Pricing, /v1/billing/upgrade dc87419 |
| 2026-09-02 | The API says what the feed has carried all along: Australian and New Zealand racing. NZ thoroughbred and harness meetings are served on every racing endpoint; use `country=NZ`. There are no New Zealand greyhounds in the feed |
Coverage, /v1/racing/* d0edd5d |
| 2026-09-02 | One identity per track: `venue_id`, `venue_canonical` and `venue_site` on every racing response (Sandown Hillside and Lakeside, Pakenham Synthetic and the like resolve correctly), `track_name` gives Racing Australia's course name verbatim, and the new /v1/racing/venues (1 credit) is the measured venue directory. The raw `venue` string is unchanged |
/v1/racing/venues, /v1/racing/next-to-go, /v1/racing/events, /v1/racing/results, /v1/racing/closing-lines, /v1/racing/price-paths 23be36c |
| 2026-09-02 | New /v1/racing/jockeys/stats and /v1/racing/trainers/stats (2 credits): premiership top-20 tables, national and per state, split metro, provincial, country and picnic, current and previous season. Answers 503 while the store is still filling |
/v1/racing/jockeys/stats, /v1/racing/trainers/stats 47633de |
| 2026-09-02 | Greyhound form runs carry `grade_in` and `grade_out` and a second split where the track records one; horse form runs carry the trainer of that day, joined from the results archive (populated from 2026-09-01 onward, null before) |
/v1/racing/greyhounds/form, /v1/racing/horses/form c61985a |
| 2026-09-02 | `best_place` quotes on /v1/racing/best-odds carry `source_url`, matching best_win. Ladbrokes, Neds and Palmerbet place prices are now read. Sportsbet publishes its board price, not its mid-day promotional price. `age_seconds` reports the true age of a pushed price |
/v1/racing/best-odds, /v1/racing/next-to-go 8c71fd7 |
| 2026-09-01 | ||
| 2026-09-01 | New /v1/racing/horses/form (3 credits): last starts, career record, going splits and profile per thoroughbred from Racing Australia form pages, keyed by the same `ra:<horsecode>` runner_ref the live feed carries. Live surfaces carry Racing Australia race and meeting metadata |
/v1/racing/horses/form, /v1/racing/next-to-go, /v1/racing/events c4b5c88 |
| 2026-09-01 | New /v1/racing/changes (2 credits): everything that moved on the live racing board since a `since` cursor — one poll instead of re-downloading the card. At-least-once delivery; deduplicate on (race_id, name, bookmaker_key, updated_at). A `since` older than 30 minutes is a free 422 |
/v1/racing/changes 03cf4db |
| 2026-09-01 | New /v1/racing/greyhounds/form and /v1/racing/greyhounds/stats (3 credits each): form history per dog and track, distance, box and grade statistics from the official Topaz feed. /v1/racing/events serves scratchings, `market_status` and `inplay`, and box-vacancy placeholders collapse to one Vacant Box entry per box |
/v1/racing/greyhounds/form, /v1/racing/greyhounds/stats, /v1/racing/events 10be470 |
| 2026-09-01 | New /v1/racing/price-paths (5 credits JSON, 20 CSV): bulk export of the permanent price-movement archive, one row per observed price point, up to a seven-day window per call. /v1/racing/price-history serves races that have aged out of the ~45-day live store from the same archive, in the same response shape; `history_from` on the response is the floor (capture began 2026-08-04). Betfair prices are withheld pending a data licence |
/v1/racing/price-paths, /v1/racing/price-history 39f169f |
| 2026-09-01 | Webhook event `race.odds_open` fires once per race, the moment the first bookmaker prices land. Webhook subscriptions now start at Standard (they used to start at Business); legacy Starter keys qualify too. /v1/racing/next-to-go accepts `num_races` up to 200, so one call returns the whole priced card |
/v1/webhooks, /v1/racing/next-to-go a2b9dad |
| 2026-09-01 | Jockey, trainer, barrier and weight are consistent across every Australian thoroughbred meeting, filled from Racing Australia acceptances where no book supplies them. Results can be filtered by `country` |
/v1/racing/next-to-go, /v1/racing/events, /v1/racing/results f0784d2 |
| 2026-08-31 | ||
| 2026-08-31 | Official MCP server: `pip install puntersedge-mcp` (0.1.0). Ten read-only tools with the credit cost in every description and `credits_remaining` on every response. A self-serve cancel page at /v1/billing/cancel replaces the written request |
puntersedge-mcp, /v1/billing/cancel 0478e7a |
| 2026-08-31 | /v1/racing/results carries the full field: `runners` lists every starter with its finishing position, and every runner on results and on live prices carries `runner_ref`, a stable registry id (`ra:<horsecode>` for horses, `grv:<dogId>` for greyhounds) plus trainer and jockey. Join on runner_ref, never on the name |
/v1/racing/results, /v1/racing/next-to-go 299d546 |
| 2026-08-25 | ||
| 2026-08-25 | Self-serve key reissue: POST /v1/keys/resend mails a fresh key to the account's verified address, for keys that were shown once and lost. Unknown query parameters are rejected with a 422 before any credit is charged |
/v1/keys/resend, /v1/racing/best-odds, /v1/racing/results cc71613 |
| 2026-08-24 | ||
| 2026-08-24 | Tier names in the published spec and in 402/403 bodies now match the public ladder: Standard (was Racing) and Business (was Pro Plus). The promotions board and the `/v1/value/*` mug-betting markets are retired and answer 410 at no charge |
OpenAPI, /v1/value/* 9477e0d |
| 2026-08-23 | ||
| 2026-08-23 | /v1/racing/closing-lines accepts `date=` as a single-day alias for from/to; passing both is a free 422 |
/v1/racing/closing-lines bc1552a |
| 2026-08-23 | Python SDK 0.3.0 adds a racing arbitrage scanner: `puntersedge-arb scan --racing` backs one runner per leg across the whole field, book-vs-book, reading /v1/racing/best-odds. No exchange needed, and racing prices carry their own age so a racing-only scan costs 3 credits. Cross-book racing arbs are rare — most races are over-round across books and a scan finding nothing is the ordinary result. There is no racing back/lay support: /v1/arb/racing still returns 410 pending a Betfair data licence |
puntersedge 0.3.0, /v1/racing/best-odds cd13af5 |
| 2026-08-23 | EPL is served again — soccer_epl is active and queryable, correcting the 2026-08-18 entry below which said it 404s. soccer_apl stays unserved for a different reason than that entry gave: every event under it was UEFA Europa League, matched because the A-League test was a bare substring and "europa league" contains "a league". Those fixtures now sit under soccer_other and the connector test is word-bounded |
/v1/sports, /v1/arb/sports?sport_key= 02af243 |
| 2026-08-18 | ||
| 2026-08-18 | Racing next-to-go: foreign meetings are served where books quote them, and races with no country label are no longer treated as foreign and filtered out |
/v1/racing/next-to-go 75fe24a |
| 2026-08-18 | EPL, A-League and Super Rugby are no longer served: soccer_epl and soccer_apl are deactivated and 404, and rugby_union carries international tests only. Soccer is served under soccer_other (MLS, La Liga, the English Championship and others) | Coverage |
| 2026-08-17 | ||
| 2026-08-17 | A mistyped bookmaker key now returns a free 422 naming the valid keys, instead of a billed 200 with an empty list |
/v1/sports/{sport_key}/odds, /v1/best-odds/{sport_key} c5a7db9 |
| 2026-08-17 | Webhook subscriptions accept an event filter on creation, and the docs now describe what actually fires rather than a superset |
/v1/webhooks 592a251 |
| 2026-08-17 | API key rotation gained a grace window: the old key keeps working while you cut over, so rotating a key is no longer a self-inflicted outage |
/v1/keys/rotate c0c4629 |
| 2026-08-17 | A 402 over-quota response now names the tier that fixes it and links straight there, sized against your measured burn rate rather than the next tier up |
All metered endpoints 7a8b845 |
| 2026-08-17 | Subscribers can manage their own billing — card, invoices and cancellation — through a self-serve portal instead of emailing support |
Billing eb25673 |
| 2026-08-17 | The Postman collection is served at a public URL and ships runnable request bodies |
Docs, Postman collection 101e615 |
| 2026-08-17 | Demo endpoints reject an unknown bookmaker or sport with a 400 instead of returning an empty 200 that looks like a coverage gap |
/v1/demo/* 1cf1dd6 |
| 2026-08-17 | Rejected requests stopped consuming credits, and error responses stopped echoing fields from other customers' requests |
All endpoints 0473fc5 |
| 2026-08-17 | Racing paths are grouped under their own tag in the OpenAPI schema, so they are findable in generated clients and in the docs sidebar |
openapi.json, /docs 25c74e1 |
| 2026-08-17 | Free tier corrected to 1,500 credits per month on 47 generated landing pages that still said 500 — the rest of the estate, and the plan record itself, were already correct |
Pricing pages 5ef92a2 |
| 2026-08-17 | /api/status corrected: sports polling is six customer-visible Australian bookmakers every 900 seconds, not “continuous polling from 7”, and the racing refresh figure was wrong by 6x. The self-certifying “reviewed today” badge was replaced with a date that only moves when a person moves it |
/api/status edb1d8c |
| 2026-08-16 | ||
| 2026-08-16 | Security: the $0 key-mint path that could issue enterprise and pro_plus keys was closed, key rotation and /v1/keys/info were fixed, and the auth cache TTL moved from 20s to 65s |
/v1/keys/*, authentication 71314c3 |
| 2026-08-15 | ||
| 2026-08-15 | Public docs corrected against live measurement: price-history retention, results bookmaker attribution, tote product list, next-to-go flucs coverage, sports refresh cadence, free-tier allowance and per-minute rate limits. No API behaviour changed — only the claims made about it | Docs, /api/pricing, /developers/getting-started, /api/examples, llms.txt |
| 2026-08-15 | Pricing recorded: free tier is 1,500 credits/month (not the 500 stated at launch), the $29 tier is Starter (the name Pro belongs to a retired $299 tier), and Hobby ($9/7,500) and Racing ($19/40,000) are on sale. Credits reset on the 1st of each calendar month at 00:00 UTC, not on the subscription anniversary | Pricing |
| 2026-08-15 | Historical odds and price movements confirmed as Pro Plus / Unlimited only — Free, Hobby, Racing and Starter receive a 403. The pricing page previously listed “All endpoints” on three of those tiers | /v1/sports/{key}/odds/history, /movements |
| 2026-08-15 | Betfair Exchange data withheld from customer responses pending a Betfair commercial data licence. Fixed-odds prices from the Australian bookmakers are unaffected. The two Betfair-dependent endpoints now return 410 at zero credits rather than an empty list | /v1/racing/exchange, /v1/arb/racing |
| 2026-08-15 | Racing best-odds added: best win, place and tote price per runner across books, with the bookmaker offering it, a deep link, and the market percentage | /v1/racing/best-odds |
| 2026-08-15 | Market movers added: steamers and drifters since the market opened, with the per-bookmaker moves behind each consensus move | /v1/racing/movers |
| 2026-08-15 | Racing price history added: every price move per runner per bookmaker, with a real opening line and a true closing line for closing-line value. History starts 4 August 2026 and is retained 45 days, so the window was 11 days at launch and grows by a day each day until it reaches the full 45 | /v1/racing/price-history |
| 2026-08-15 | Settled race results added: finishing order with one bookmaker's settled win and place prices (BetRight), plus scratchings and their deductions. Deduction values are a fraction of the payout withheld — 0.34 = 34c in the dollar | /v1/racing/results |
| 2026-08-15 | Tote prices added on next-to-go and best-odds, keyed by product: PROV (indicative pre-race) and MIDDIV. RD+ and BT+SP are settled products and appear on /v1/racing/results only; SP is not returned anywhere | /v1/racing/next-to-go, /v1/racing/best-odds, /v1/racing/results |
| 2026-08-15 | next-to-go enriched on Australian meetings: jockey, trainer, barrier, weight, form, scratchings, track condition, distance and a deep link to the bookmaker's own race page. Opening price and flucs are carried inline for BetRight only — for every book's opening line and drift use /v1/racing/movers. Enrichment fields are null on international races | /v1/racing/next-to-go |
| 2026-08-15 | Sports odds gained a competition field and filter, so NRL and NRLW (and AFL and AFLW) are distinguishable | /v1/sports/{sport_key}/odds |
| 2026-08-15 | Odds-boost board retired: it could only ever return an empty list, because boosts are per-account tokens that appear in no public odds feed | /v1/value/boosts |
| 2026-06-18 | ||
| 2026-06-18 | Docs updated to cover arbitrage, value and historical endpoints with code examples and an endpoint matrix | /api-platform, /api/examples, /api/coverage |
| 2026-06-17 | ||
| 2026-06-17 | Racing back/lay arb gained verify=1 (live re-check of each leg against book + Betfair); data-quality summary endpoint added | /v1/arb/racing, /v1/data-quality/summary |
| 2026-06-17 | Value endpoint added: EV-ranked daily promo board | /v1/value/promos |
| 2026-06-16 | ||
| 2026-06-16 | Arbitrage endpoints added: sports surebets, spreads/totals line arb, racing back/lay vs Betfair, and best-prices comparison | /v1/arb/sports, /v1/arb/lines, /v1/arb/racing, /v1/arb/best-prices |
| 2026-06-16 | Historical odds snapshots and price-movement feed added (Pro+); racing events list, webhooks, usage analytics and key rotation added | /v1/sports/{key}/odds/history, /movements, /v1/racing/events, /v1/webhooks |
| 2026-06-02 | ||
| 2026-06-02 | API documentation rebuilt with accurate coverage, pricing, and code examples | All /api/* pages |
| 2026-06-02 | Segmented sitemaps added — /api/* pages now in sitemap-api.xml | SEO / sitemap |
| 2026-06-01 | ||
| 2026-06-01 | Trust/compliance documentation pages added (/api/status, /api/coverage) | Docs |
| 2026-04-22 | ||
| 2026-04-22 | AU Odds API v1.0.0 launched. Endpoints: /v1/sports, /v1/sports/{key}/odds, /v1/best-odds/{key}, /v1/racing/next-to-go, /v1/usage, /v1/health | All endpoints |
| 2026-04-22 | 11 Australian bookmakers connected: Sportsbet, TAB, TABtouch, Neds, Ladbrokes AU, Unibet, Betfair Exchange, PointsBet, Betr, BetRight, PlayUp | Coverage |
| 2026-04-22 | 10 sports active at launch: AFL, NRL, NBA, Tennis ATP/WTA, EPL, A-League, Super Rugby, Big Bash (Beta), Test Cricket (Beta) | Coverage |
| 2026-04-22 | 4 pricing tiers: Free (500cr), Pro ($29/20k cr), Pro Plus ($99/100k cr), Unlimited ($249/5M cr) | Pricing |
| 2026-03-01 | ||
| 2026-03-01 | Internal API development started | Internal |
Entries from 2026-08-16 cite the short commit SHA they were mined from, where one exists.
Breaking changes will be announced with ≥ 30 days notice where possible. No breaking changes have been made since launch.