API

Every price. The model. By key.

Everything the app shows, as JSON: every major book's prices on every race and NBA game, every move, the form, the results. The model engine: win, place to any depth, exotics and multis, the NBA's lines and props and the what-if, priced on request. And an MCP server, included in every tier, so you can ask in words.

See the tiersMCPThe referenceA key per subscription. Billed monthly, cancel any time.
The pricesEvery major book, win and place, every move from first sight to the jump.
The modelWin, place to any depth, exotics, same-race and cross-race multis, and the NBA.
LivePriced on request, as the race stands.
MCP, includedAsk Claude, ChatGPT or Cursor in words. Every tier.
Tiers

Pick a tier.

Starter

$49 / month
or $490 a year. No trial. The companion app key is Free.
  • Current prices, fields, form, results, offers, the movers
  • Today's price history
  • The model: win, place, top-N
  • The NBA: games, every book's lines and props, the model and its picks
  • Our own markets, racing's and the NBA's, come with Pro and Business
  • MCP server included
  • Push your own model's prices, graded against Betfair SP
  • racing.com's gear, claims, sectionals and race times
  • Prices and the model only: no bookmaker access
  • A Free companion app key. The API key itself stays an API key. Pro and Business include the app's Pro plan
  • 60 calls a minute, 20,000 a day
Monthly Yearly
Most complete

Pro

$149 / month
or $1,490 a year
  • Everything in Starter
  • 90 days of price history
  • Exotics, same-race and cross-race multis, the extra markets
  • Our own NBA markets: every line, props no book has posted, doubles and quarters
  • The books' SRM and exotic prices, the tote pools with estimated dividends
  • Markets value finds, winning margin and race time markets
  • The NBA's same game multi prices, what-if and arbs
  • Live prices, streamed
  • Price a race as it stood
  • Bulk day exports
  • Place bets through your own MarketMover agent
  • Everything in the Pro app plan: the web app and the Community, placing, AutoBet, the alerts
  • An app key for the Mac and iPhone apps, beside the API key
  • MCP server included
  • 300 calls a minute, 200,000 a day
Monthly Yearly

Business

$499 / month
or $4,990 a year
  • Everything in Pro, the Pro app plan and its app key included
  • All the history there is
  • A million draws for the deepest questions
  • Place bets through your own MarketMover agent
  • MCP server included
  • 1,200 calls a minute, 2,000,000 a day
  • Same-day support
Monthly Yearly
What each tier includesStarter$49 / moPro$149 / moBusiness$499 / mo
The data
Every major book's win and place, as the race stands✓✓✓
Tote and Betfair lay prices, matched volume✓✓✓
Meetings, fields, barriers, scratchings✓✓✓
Form, results and dividends✓✓✓
The books' offers bound to each race, and the day's market movers✓✓✓
Price history, every move from first sightToday90 daysAll
Live prices as they move, streamed–✓✓
Bulk day exports, every race's whole history in one file–✓✓
racing.com's data on Australian gallops: gear, claims, track and weather, sectionals, race times, margins (GET /v1/races/{race}/racing, and in the form, the result and the race)✓✓✓
The race products
The books' own same-race multi and fixed exotic prices, every book that quotes without a login–✓✓
The tote pools with an estimated dividend per combination–✓✓
Markets value: the day's finds per market kind, and the SRM value lists–✓✓
The model
Win and place for every runner, with the market weight and band✓✓✓
Top 2, top 3, top 4, to the field✓✓✓
Fair, your own margin, or the market's✓✓✓
Exacta, quinella, trifecta, first four; boxes and standouts–✓✓
Same-race multis and multis across races–✓✓
The extra markets: head to heads, Without, Money Back, groups, meeting specials, the Extra SRM, settling–✓✓
The winning margin and race time markets–✓✓
Price a race as it stood at any past moment–✓✓
Sampling budget for the deepest questionsDefault200,000 draws1,000,000 draws
The picks and the model's graded record✓✓✓
Arbs and the NBA
Racing's arbs and middles across the books, as they stand (GET /v1/arbs)–✓✓
NBA games and cards: every book's lines and player props, flucs, results, news, injuries and Stats, and in-play prices (shown, never placed online)✓✓✓
The model's NBA prices, picks, and where one book stands apart✓✓✓
Our own NBA markets: every line, props no book has posted, doubles and quarters–✓✓
The live Model on every in-play NBA price, and its graded record✓✓✓
NBA same game multis and multis priced at every book that sells them–✓✓
NBA game specials, each game's and each day's, and their settling–✓✓
What-if on any game to come, news impacts, books behind the news, SGM value–✓✓
NBA arbs, middles and alt-line value–✓✓
The NBA card streamed as it moves–✓✓
Your model
Push your model's prices per race (PUT /v1/me/ratings/{race}, and an MCP tool); they show on your card once your app key is linked in Settings✓✓✓
A private record of your model against Betfair SP, graded as ours is (GET /v1/me/record, and the my_record tool)✓✓✓
Your bookmakers
Which of your books are logged in, with balances, as your own MarketMover agent reports them (GET /v1/me/books); your logins never leave your device–✓✓
Quote and place bets, racing's and the NBA's, through your agent, under the limits you set in it (POST /v1/me/bets/quote, /confirm, /place; POST /v1/sports/nba/bets/quote, /place)–✓✓
Everything in the Pro app plan
The web app and the Community with your key, as on the Pro app plan–✓✓
Placing from the web app, the extension and the Windows app: singles, each way, multis, same race multis, exotics, the tote; your accounts' balances, bets and history–✓✓
AutoBet's auto bettors and the price alerts, on the live board–✓✓
An app key for the Mac and iPhone apps, shown beside your API key: the apps take the app key, the web app either–✓✓
MCP
The MCP server, every tool, in Claude, ChatGPT, Cursor and the rest✓✓✓
Limits
Calls a minute603001,200
Calls a day20,000200,0002,000,000
Free trial–––
Support
Email✓Within a daySame day

In-play prices are shown, never placed online: online in-play bets are banned in Australia, so you bet in play by phone with your book.

Australian dollars, renewing until cancelled. The key arrives on the page after payment and in the receipt; on Pro and Business the app key is beside it.

Reference

Every route. Every tool.

Every data route is also an MCP tool, named beside it, with the plan that opens it: racing and the NBA, the model, the books' products, the arbs and the what-if. The streams, the export files, a member's own rows and placing are routes only. The key goes in Authorization: Bearer mm_api_…. Full detail at api.marketmover.net/v1/docs.

DataEverything the collector collects
GET /v1/meetingsmeetingsEvery API plan; app Free and up

Today's meetings and races, or a Sydney date's: each race's key, number, start, status, distance and class.

dateyyyy-MM-dd
sample response
{date, meetings:[{venue, code, country, races:[{key, raceNo, start, status, distance, raceClass, placesPaid}]}]}
GET /v1/races/{key}raceEvery API plan; app Free and up

A race as it stands: the field, and every book's latest win, place, tote and lay; and, where known, the track's facts: the rail in metres out from true, the way round, a harness circuit and a greyhound track's run to the first turn, each with its source.

keystring
sample response
{key, venue, raceNo, start, status, placesPaid, runners:[{number, name, barrier, scratched}], books:[{book, at, overround, matched, prices:[{number, win, place, toteWin, totePlace, layWin}]}], trackFacts:{rail:{text, metres}, direction:{value, source}, circumference:{metres, source}, firstTurn:{value, metres, source}}}
GET /v1/races/{key}/valuerace_valueEvery API plan; app Plus and up

Every runner's chance by the Model and what each takeable price is worth against it: the best book's, the exchange's after commission, and each offer on the race.

keystring
sample response
{race, runners:[{number, name, chance, best:{book, price, edge}, exchange:{price, edge}, offers:[{book, kind, edge}]}]}
GET /v1/races/{key}/convertbonus_convertEvery API plan; app Plus and up

Where a bonus bet converts to cash best on this race: the share a lay at the exchange's price locks in now, and the lay price a limit order must get to keep `keep` of the face value.

keystringbonusdollarskeepfraction
sample response
{race, bonus, runners:[{number, name, back, lay, keeps, layFor}]}
GET /v1/races/{key}/historyrace_historyEvery API plan; app Free and up

Every price move from first sight: ticks per book and runner, and each book's boards. Large, and counts as five calls.

keystring
sample response
{key, runners, boards:[{book, at, status, overround, priced, matched}], ticks:[{book, number, at, win, place, toteWin, totePlace, layWin}], events}
GET /v1/races/{key}/formrace_formEvery API plan; app Free and up

Each runner's past starts as the books publish them, with racing.com's speed block on each past run it has.

keystring
sample response
{key, runners, forms:[{book, at, runners:[{n, r:[[position, starters, date, venue, distance, class, margin, trial]]}]}], speed?, credit?}
GET /v1/races/{key}/form/fullrace_form_fullEvery API plan; app Free and up

The full form guide by runner where a book gave one: breeding, prize money, the record by track, going, distance and class, every past start in full. About 100 KB; counts as five calls.

keystring
sample response
{key, book, runners:[{number, name, age, sex, sire, dam, record, starts:[…]}]}
GET /v1/races/{key}/racingrace_racingEvery API plan; app Free and up

racing.com's data on an Australian gallop, on every tier: the meeting's track, rail, weather, straight, inspection line and stewards' report; the race's record, class and prize money; each runner's jockey, trainer, weight, barrier, claim, gear changes, last gear, comment and opening price (the declared ones from the morning's field read until the race's form is read); the rail's figure in metres; the official result with every runner's SP, sectionals against standard and stewards' comments; and the events.

keystring
sample response
{available, credit, meeting, race, runners, result, events}
GET /v1/meetings/{key}/racingmeeting_racingEvery API plan; app Free and up

racing.com's meeting in one read, on every tier: the meeting document with its rating changes and stewards' report, and every race's status, flags and whether its result is official.

keymeeting key, R:flemington:2026-10-03 (or M:R:…, -2 for a second card)
sample response
{available, credit, meetingKey, meetCode, meeting, races:[{raceNo, key, name, class, status, start, final, hasResults, hasSectionals, hasStewards}]}
GET /v1/runners/{horse}/racingrunner_racingEvery API plan; app Free and up

A horse's racing.com runs, newest first, by racing.com's horse code or its name: each run's speed (time, sectionals, differences from standard, positions, stewards, gear) and the runner's row (jockey, trainer, weight, barrier, SP, finish).

horseracing.com horse code or namelimit1-100beforeyyyy-MM-dd
sample response
{available, credit, horse, name, horses:[{code, tag}], runs:[{date, venue, raceNo, key, number, speed, runner}]}
GET /v1/races/{key}/speedmaprace_speedmapEvery API plan; app Free and up

racing.com's speed map, on every tier: each runner's place 1-12 (Leader, On Pace, Midfield, Off Pace, Backmarker), its barrier and the race's tempo.

keystring
sample response
{available, credit, tempo, runners:{number:{value, position, barrier, name}}, positions:{Leader:[numbers]}, at}
GET /v1/races/{key}/tipsrace_tipsEvery API plan; app Free and up

racing.com's expert tips, on every tier: the form analyst's overview, suggested bet and selections by going, each tipster's picks with comments.

keystring
sample response
{available, credit, tempo, bestBets:{overview, suggestedBet, tipster, selections:{good:[numbers]}}, tipsters:[{tipster, lead, picks:[{position, runner, name, bet, comment}]}]}
GET /v1/races/{key}/statsrace_statsEvery API plan; app Free and up

Each runner's records as racing.com has them, on every tier: track, distance, both, with this jockey, at this class, first and second up, by going, the last ten, career; its profile and latest trials.

keystring
sample response
{available, credit, runners:{number:{stats:{track:{starts, wins, seconds, thirds}}, profile, handicapRating, trials}}}
GET /v1/meetings/{key}/scratchingsmeeting_scratchingsEvery API plan; app Free and up

Each race of a meeting with its scratched runners and emergencies as racing.com has them, on every tier.

keymeeting key, R:flemington:2026-11-05
sample response
{available, credit, meetingKey, races:[{raceNo, key, scratched:[{number, name}], emergencies:[{number, name, emergency}]}]}
GET /v1/runners/{horse}/trialsrunner_trialsEvery API plan; app Free and up

A horse's barrier trials and jump-outs as racing.com has them, newest first, on every tier: date, venue, heat, distance, finish, margin, starters, time.

horseracing.com horse code or namelimit1-100beforeyyyy-MM-dd
sample response
{available, horse, name, runs:[{date, venue, raceNo, number, distance, runner:{finish, margin}, trial:{jumpOut, name, starters, time}}]}
GET /v1/races/{key}/stewardsrace_stewardsEvery API plan; app Free and up

Racing Victoria's stewards' report on a VIC race, on every tier: each runner's paragraph with its tags and the horses it names, the race's own paragraphs, its raceday summary lines and the meeting's header.

keystring
sample response
{available, credit, race:{name, distance}, meeting:{header, url, fetchedAt}, runners:{number:{name, text, tags, mentions}}, unmatched, other, summary:[{label, text, tags}]}
GET /v1/races/{key}/followupsrace_followupsEvery API plan; app Free and up

Racing Victoria's stewards' follow-ups on a race's runners from their earlier starts, and those raised on the race, on every tier.

keystring
sample response
{available, credit, runners:{number:[{date, venue, raceNo, type, comment, status, outcome}]}, thisRace}
GET /v1/runners/{horse}/stewardsrunner_stewardsEvery API plan; app Free and up

A horse's paragraphs in Racing Victoria's stewards' reports, newest first, on every tier: date, venue, race, text and tags.

horsenamelimit1-100beforeyyyy-MM-dd
sample response
{available, credit, horse, incidents:[{date, venue, raceNo, key, number, text, tags, mentions}]}
GET /v1/runners/{horse}/followupsrunner_followupsEvery API plan; app Free and up

Racing Victoria's stewards' follow-ups of a horse, newest first, on every tier: type, the stewards' comment and the trainer's explanation.

horsename
sample response
{available, credit, horse, followUps:[{date, venue, raceNo, type, comment, status, outcome}]}
GET /v1/races/{key}/resultrace_resultEvery API plan; app Free and up

A run race's placings and every dividend the book published.

keystring
sample response
{key, venue, raceNo, placings:[[2],[1],[7]], dividends:[{p, s, a}]}
GET /v1/resultsresultsEvery API plan; app Free and up

Every resulted race on a Sydney date, with placings and dividends.

dateyyyy-MM-dd
sample response
{date, results:[{key, venue, raceNo, start, placings, dividends}]}
GET /v1/runnersrunnersEvery API plan; app Free and up

The day's fields: runner names by race.

dateyyyy-MM-dd
sample response
{date, races:[{key, venue, raceNo, start, runners:[{n, name, scr}]}]}
GET /v1/booksbooksEvery API plan; app Free and up

The bookmakers the prices come from, and which carry tote or lay.

no parameters
sample response
{books:[{id, name, tote, lay}]}
GET /v1/promospromosEvery API plan; app Free and up

Every book's public racing offers, each bound to the races it is for: boosts first, no sign-up inducements.

dateyyyy-MM-ddstateNSW | VIC | …bookstab,neds,…
sample response
{date, promos:[{book, kind, title, blurb, races:[key], ends}]}
GET /v1/visionvisionEvery API plan; app Free and up

TAB's open Sky channels: code, name, audio or video, and the stream.

no parameters
sample response
{channels:[{code, name, kind, url, ok}]}
GET /v1/newsnewsOpen, no key

Racing news posts, newest first, each matched to its race where we can. Open: no key needed.

codeR | H | Gregionaunz | intsinceISO timematchedOnlybooleanlimitinteger
sample response
{at, posts:[{id, author, handle, text, created, link, code, region, race:{key, label, runner, confidence}}]}
GET /v1/races/{key}/newsnewsOpen, no key

The news posts matched to one race, newest first. Open: no key needed.

keystring
sample response
{at, posts:[…as /v1/news…]}
GET /v1/races/{key}/poolspoolsAPI Pro and Business; app Plus and up

The race's tote pools with an estimated dividend per combination, or TAB's approximate for a quinella or exacta. Never a price to bind.

keystringproducttrifecta | first4 | quaddie …combos4-7-2,4-2-7limitinteger
sample response
{race, at, pools:[{product, label, kind, pool, poolKnown, jackpot, take, estimate:{"4-7-2": x} | approximate:{"4-7": x}}]}
GET /v1/exportsexportsEvery API plan; app Free and up

The day exports on disk: one file a day, every race's whole history on a line, gzipped.

no parameters
sample response
{exports:[{date, bytes, writtenAt}], keep}
GET /v1/exports/{date}API Pro and Business

The day's export as a file (route only: a file is no tool's answer).

dateyyyy-MM-dd
sample response
marketmover-2026-09-26.jsonl.gz
GET /v1/races/{key}/streamAPI Pro and Business; app Free and up

Live prices as they move, as server-sent events: a snapshot, then only the rows that moved, the status, the end. Ends after four hours; reconnect for a fresh snapshot (route only: a stream is no tool's answer).

keystringintervalseconds
sample response
event: snapshot {…race…}  event: prices {moved:[{book, number, win, place, layWin}], gone}  event: status {status}  event: end
GET /v1/liveAPI Pro and Business; app Free and up

The live board AutoBet and the price alerts watch: every race starting within `within` seconds as server-sent events, cut to the key's books, the model's prices on plans with the model (route only: a stream).

withinseconds
sample response
event: snapshot {races, model, modelPlace, modelTop}  event: prices {moved, gone, status}  event: races {came, went}
GET /v1/public/booksbooks_reportOpen, no key

The Bookmakers report over the last 7 or 30 finished days: each book's best prices, margins, coverage, speed and reliability, ranked best for punters. Open: no key needed.

days7 | 30
sample response
{days, from, to, races, books:[{book, rank, score, best, margin, coverage, speed, reliability, …}]}
GET /v1/public/moversmoversOpen, no key

The day's biggest firmers and drifters across racing, from the first price seen to now; today or one of the last few days. Open: no key needed.

dateyyyy-MM-dd
sample response
{date, at, firmers:[{race, number, name, open, now, move, …}], drifters:[…]}
GET /v1/public/movers/{key}/{number}moverOpen, no key

One runner's moves: its prices at every book from first sight, the race and the runner. Open: no key needed.

keyrace keynumberrunner number
sample response
{race, runner, books:[{book, open, now, points:[[at, price]]}], …}
POST /v1/races/{key}/srmsrm_priceAPI Pro and Business; app Plus and up

Any same race multi: each book's own price where it quotes without a login, and on Pro the Model's price and each book's edge. Never a bet.

legs[{runner, top}]books[tab, …]marginfraction | market | betfair
sample response
{valid, legs, books:[{book, price, edge, margin}], best:{book, price}, model:{probability, fairPrice, marked}}
GET /v1/races/{key}/srm/featuredsrm_featuredAPI Pro and Business; app Plus and up

The books' own pre-built SRMs priced at every other book and by the model, and three SRMs the model builds.

keystringmarginfraction | market | betfair
sample response
{popular:[{source, title, legs, books, best, model}], model:[{title, target, legs, books, best, model}], windows}
POST /v1/races/{key}/exoticsbook_exoticsAPI Pro and Business; app Plus and up

Any exotic by positions or box: every combination's fixed price at the books that quote one, the tote's approximate, and the Model's price of each. Never a bet.

kindexacta | quinella | trifecta | first4positions[[4], [1, 7], [1, 7, 9]]box[1, 4, 7, 9]
sample response
{valid, kind, positions, combinations:[{runners, probability, fairPrice}], books:[{book, type, combinations}]}
GET /v1/markets/valuemarkets_valueAPI Pro and Business; app Pro

The day's value finds across every market kind, each kind's record, level, threshold and whether its marks are earned.

dateyyyy-MM-ddkindh2h | without | winnerIn | moneyBack | topN | exotic
sample response
{date, kinds:{kind:{label, threshold, level, record, earned}}, value:[find], valueEarned}
GET /v1/srm/valuesrm_valueAPI Pro and Business; app Pro

The SRM value scanner's finds for a Sydney day, with their results once settled and its record.

dateyyyy-MM-dd
sample response
{date, threshold, value:[{race, venue, raceNo, legs, probability, fairPrice, books}], record, flagsEarned}
GET /v1/races/{key}/srm/valuesrm_valueAPI Pro and Business; app Pro

The SRM value scanner's finds on one race.

keystring
sample response
{race, value:[…as /v1/srm/value…], flagsEarned}
GET /v1/public/products/accuracyproducts_accuracyOpen, no key

How our same race multi, fixed exotic, extra market and own market prices compare with the results and the books', by product. Open: no key needed.

no parameters
sample response
{at, srm:{…}, exotics:{…}, markets:{…}, ours:{…}}
GET /v1/public/products/recentproducts_accuracyOpen, no key

The race products' most recent settled quotes beside their results, the rows the accuracy report is made from. Open: no key needed.

no parameters
sample response
{at, items:[{race, product, price, result, …}]}
GET /v1/races/{key}/modelmodel_pricesEvery API plan; app Pro

Win and place for every runner as the race stands, with the market weight and the band. `at` prices the race as it stood (asAt).

keystringmarginfraction | market | betfairatISO time
sample response
{race, model, pricedAt, minutesToJump, booksQuoting, marketOverround, weight, band, margin, placesPaid, runners:[{number, name, win, winPrice, price, market, place, placePrice}]}
GET /v1/races/{key}/model/placemodel_placeEvery API plan; app Pro

Each runner's chance to finish in the first N. Any depth, to the field.

keystringpositionsintegermarginfraction | market | betfairatISO time
sample response
{race, positions, runners:[{number, name, probability, fairPrice, price, method}]}
GET /v1/races/{key}/model/seriesmodel_seriesEvery API plan; app Pro

The model's win price at about three dozen moments from first sight to the off: the line on the flucs chart.

keystringmarginfraction | market | betfair
sample response
{race, points:[{at, prices:{number: price}}]}
GET /v1/races/{key}/model/exoticsexoticAPI Pro and Business; app Pro

Exacta, quinella, trifecta or first four: straight, boxed, or with a standout. No runners: the most likely combinations.

keystringtypeexacta | quinella | trifecta | first4runners4,7,9firstintegerboxbooleanlimitintegermarginfraction | market | betfair
sample response
{race, type, runners, box, probability, fairPrice, price, method} or {combinations:[{runners, probability, fairPrice, price}]}
POST /v1/model/queryqueryEvery API plan; app Pro

Any multi: legs in one race are a same-race multi, legs across races multiply. More than one leg needs the exotics.

legs[{race, runner | runners, top | positions}]marginfraction | market | betfairatISO time
sample response
{probability, fairPrice, price, margin, method, legs:[{race, runners, positions, probability}], byRace:[{race, probability, weight, band, booksQuoting}]}
POST /v1/races/{key}/model/marketsrace_marketsAPI Pro and Business; app Pro

Our own markets on the race, priced by the model: head to heads, Without, Money Back, runner sets, odds v evens, each way, the groups, winning margins and race times (the last two need margins).

keystringmarkets[{kind, …}]marginfraction | market | betfair
sample response
{race, markets:[{kind, label, selections:[{label, probability, fairPrice, price}]}]}
POST /v1/races/{key}/model/comborace_comboAPI Pro and Business; app Pro

The Extra SRM: our own combination of 2 to 6 extra-market selections in one race, priced by the model.

keystringlegs[selection]marginfraction | market | betfair
sample response
{race, legs, probability, fairPrice, price, method}
POST /v1/races/{key}/model/settlerace_settleAPI Pro and Business; app Pro

Each extra-market selection settled from the race's result: won, lost, void or unknown, with why.

keystringselections[selection]
sample response
{race, order, settled:[{selection, result, why}]}
POST /v1/meetings/{meeting_key}/model/specialsmeeting_specialsAPI Pro and Business; app Pro

The meeting's specials priced by the model: favourites that win, a $10+ winner, the favourites quaddie, jockey and trainer doubles and challenges.

meeting_keyM:R:randwick:2026-09-26marginfraction | market | betfair
sample response
{meeting, specials:[{kind, label, selections:[{label, probability, fairPrice, price}]}]}
POST /v1/meetings/{meeting_key}/model/specials/settlemeeting_specials_settleAPI Pro and Business; app Pro

Meeting specials settled from the stored results: won, lost, void or unknown, with why.

meeting_keystringselections[selection]
sample response
{meeting, settled:[{selection, result, why}]}
GET /v1/model/pickspicksEvery API plan; app Pro

Runners whose best price is longer than the model's beyond the band, across every race still to run.

no parameters
sample response
{at, model, races, picks:[{race, venue, raceNo, number, name, pWin, modelPrice, bestPrice, book, prices}]}
GET /v1/model/disagreedisagreeEvery API plan; app Free and up

Every bookmaker price past the consensus of the rest, margins taken out: where one book stands apart from the market.

no parameters
sample response
{at, items:[{race, number, name, book, price, consensus, edge}]}
GET /v1/model/gradesgradesEvery API plan; app Free and up

The model's record against the market on its held-out week, by horizon and by code.

no parameters
sample response
{model, gradedAt, races, horizons:{-1h:{logLoss, marketLogLoss, clv, formTest}}, byCode:{R, G, H}}
GET /v1/modelmodel_fileEvery API plan; app Pro

The model file in force: the place powers per code, the market weight, the prior.

no parameters
sample response
{version, trainedAt, placePowers, maturity, prior, curves, band}
GET /v1/public/recordrecordOpen, no key

The model's public record: racing's picks graded every night, the NBA's tips record and the live Model's record in play. Open: no key needed.

no parameters
sample response
{at, racing:{…}, tips:{…}, nba:{…}, live:{…}}
GET /v1/arbsarbsAPI Pro and Business; app Punter and Pro

Every racing arb and middle the scanner finds now across the key's books: back at one book, lay or back the other side at another, with the stakes that lock the profit.

codeR | H | Gregionaunz | intkindstringminPctpercentmaxMinutesminutesbookstab,neds,…
sample response
{at, stake, items:[{race, kind, pct, legs:[{book, number, side, price, stake}], profit}]}
GET /v1/sportssportsEvery API plan; app Free and up

The sports open to this key. The NBA answers once it is open to the key's audience.

no parameters
sample response
{sports:{nba:{open, released}}}
GET /v1/sports/{sport}/gamesnba_gamesEvery API plan; app Free and up

A Sydney day's games (today by default): each one's header, injuries, every book's headline head to head, line and total, and the best of each; the days around for a date strip. On Pro each game to come carries the Model's head to head, line and total (model, at the margin asked: the card's own prices, at the line most books have, else the model's own; model.noBooks where no book prices the game), or modelPending while it is being made.

dateyyyy-MM-ddbookstab,neds,…marginfraction | market | betfair
sample response
{date, today, days:[{date, games}], games:[{key, home, away, tipOff, injuries, lines:{book:{ml, spread, total}}, best, books, model:{ml, spread, total}}]}
GET /v1/sports/{sport}/games/{key}nba_gameEvery API plan; app Free and up

The game card: every book's main lines and team totals (every period, every line), each player's headline props, the injuries, and on Pro the model's prices. A game no book has priced yet carries the model's own head to head, line, total, team totals and periods (each side modelOnly, each lined market at the model's own modelLine), said by noBooks.

keygame key, B:nba:bos@det:2026-10-20bookstab,neds,…marginfraction | market | betfair
sample response
{game, books, markets:[{id, kind, period, participant, stat, lines, modelLine?}], props, players, injuries, form, model, fairPrices:{available, noBooks?, ...}, steam}
GET /v1/sports/{sport}/games/{key}/comparenba_game_compareEvery API plan; app Free and up

One market group at every line across every book, the best marked, with the Model's price on Pro.

keygame key, B:nba:bos@det:2026-10-20marketstringbookstab,neds,…marginfraction | market | betfair
sample response
{game, market, markets:[{id, kind, lines}], books, fairPrices}
GET /v1/sports/{sport}/games/{key}/livenba_game_liveEvery API plan; app Free and up

The game in play: the score, the clock, the box score and every book's in-play prices.

keygame key, B:nba:bos@det:2026-10-20bookstab,neds,…playsstringmarginfraction | market | betfair
sample response
{game, inPlay, markets, books, inPlayBooks, box}
GET /v1/sports/{sport}/games/{key}/live/modelnba_live_modelEvery API plan; app Pro

A game in play's live Model prices: each in-play selection the live model prices (the game's head to head, line, total and team totals, each quarter's and the first half's), its chance and its price at your margin, with the score and clock it was priced at. Shown only: in-play bets are by phone with your book.

keygame key, B:nba:bos@det:2026-10-20marginfraction | market | betfair
sample response
{game, live, version, priorFrom, elapsed, margin, prices:{sel:{chance, price}}}
GET /v1/sports/{sport}/games/{key}/streamAPI Pro and Business; app Free and up

The game card as it moves, as server-sent events: the card first, then only what changed, until the game is final (route only: a stream).

keygame key, B:nba:bos@det:2026-10-20bookstab,neds,…marginfraction | market | betfairintervalseconds
sample response
event: snapshot {…card…}  event: patch {…}  event: end {state}
GET /v1/sports/{sport}/games/{key}/flucsnba_game_flucsEvery API plan; app Free and up

Each selection's price history at every book, from first sight.

keygame key, B:nba:bos@det:2026-10-20marketstringbookstab,neds,…inplayboolean
sample response
{game, market, sels:{sel:{book:[[at, price]]}}, truncated}
GET /v1/sports/{sport}/games/{key}/resultnba_game_resultEvery API plan; app Free and up

A final game: the line score, team stats, leaders, and how the main lines settled at the key's books.

keygame key, B:nba:bos@det:2026-10-20bookstab,neds,…
sample response
{final, game, lineScore, teamStats, leaders, held, winProbability, settled:[{kind, line, market, sides}]}
GET /v1/sports/{sport}/games/{key}/contentnba_game_contentEvery API plan; app Free and up

The game's preview, key stats, both lineups (the model's on Pro), the what-if presets and each book's previews and tips.

keygame key, B:nba:bos@det:2026-10-20bookstab,neds,…
sample response
{game, preview, keyStats, lineups:{confirmed, teams}, presets:[{changes, words, why}], books:[{book, previews, tips}], facts}
GET /v1/sports/{sport}/games/{key}/insightsnba_game_insightsEvery API plan; app Free and up

The game's insights and our tips, each with its numbers and the record.

keygame key, B:nba:bos@det:2026-10-20
sample response
{game, groups, insights:[{id, group, text, numbers, bets}], tips:[{bet, kind, reason, result}], record}
GET /v1/sports/{sport}/games/{key}/model-marketsnba_model_marketsAPI Pro and Business; app Pro

Our own markets on the game, priced by the model: the main lines at every line, team totals, every player's props and ladders (players no book has posted too), doubles, triples and the quarters and halves. Racing's own markets' plan: never API Starter. kinds, stat and player ask for less (a whole game runs to 1.5 MB).

keygame key, B:nba:bos@det:2026-10-20marginfraction | market | betfairperiodgame | q1 … q4 | h1 | h2kindsml,spread,…,player,oursstatpoints | rebounds | …playerperson id
sample response
{game, version, markets:[{kind, period, participant, stat, lines:[{line, sides:[{side, p, fair, price, best}]}]}], oursLocked}
POST /v1/sports/{sport}/games/{key}/scenarionba_what_ifAPI Pro and Business; app Pro

What-if: change a player's status (out, or back in), minutes or who starts, up to 12 changes, and every market the model prices moves with it: each affected player first, then the team totals and the game's lines, with the best price and its edge. A game that has tipped off is a 409.

keygame key, B:nba:bos@det:2026-10-20changes[{person, set: out | in} | {person, minutes} | {person, start, for}]bookstab,neds,…
sample response
{game, kitAt, changes, base:{h2hHome, lineHome, total}, scenario:{h2hHome, lineHome, total}, players:[{personId, name, chance, minutes, means, markets}], main:[{kind, line, side, fair, best, edge}]}
GET /v1/sports/{sport}/games/{key}/placeEvery API plan; app Free and up

One selection's ids at one book, for the member's own browser or app to place an NBA single. Never a bet (route only: placing is your own agent's).

keygame key, B:nba:bos@det:2026-10-20bookstringselselection keysideback | lay
sample response
{ok, book, game, sel, handle, ref, price} or {ok:false, code, why}
POST /v1/sports/{sport}/bets/quoteAPI Pro and Business

An NBA single, same game multi or multi quoted by the book through your own agent, built from the board's own ids for each selection as the web app builds it. In play, a kind the book doesn't take and the line bets your agent leaves to you are refused before anything is asked. A lay is placed only at its price or lower. The stake is dollars; a lay's stake is the backer's stake, and its liability is stake × (price − 1). displayedPrice must be the card's or the quote's price as given (a lower number lets a worse price through). Confirm with POST /v1/me/bets/confirm (route only: nba_place quotes and places in one call).

kindsingle | sgm | multibookstringgamegame key (a single, an SGM)selselection key (a single)sideback | lay (a lay: Betfair's single)legs[selection key] (an SGM) | [{game, sel} | {game, sgm:[sel], price}] (a multi)stakedollarsdisplayedPricedecimal
sample response
{ok, agent, quote:{id, price, minStake, balance, quotedAt, expiresAt, …}} or {ok:false, failure:{code, message}}; 409 {detail:{code, message}}
POST /v1/sports/{sport}/bets/placenba_placeAPI Pro and Business

An NBA bet quoted and confirmed in one call through your own agent, with a clientRef so a retry never places twice. Placed only when the book's price is the same as or better than displayedPrice, a lay's the same or lower; a worse one comes back with the quote, unconfirmed. The stake is dollars; a lay's stake is the backer's stake, and its liability is stake × (price − 1). displayedPrice must be the card's or the quote's price as given (a lower number lets a worse price through).

kindsingle | sgm | multibookstringgamegame key (a single, an SGM)selselection key (a single)sideback | lay (a lay: Betfair's single)legs[selection key] (an SGM) | [{game, sel} | {game, sgm:[sel], price}] (a multi)stakedollarsdisplayedPricedecimalclientRefstring
sample response
{state: placed | rejected | unresolved | failed, quote, bookBetID, acceptedPrice, stake, agent, ledgerId, ledger}
GET /v1/sports/{sport}/games/{key}/sgm/valuenba_sgm_valueAPI Pro and Business; app Pro

The value SGMs the scanner found on a game: the best book's price at least 15% over the model's.

keygame key, B:nba:bos@det:2026-10-20
sample response
{game, value:[{legs, label, probability, fairPrice, best, books}], flagsEarned}
POST /v1/sports/{sport}/sgm/quotenba_sgm_priceAPI Pro and Business; app Plus and up

Any same game multi priced by every book whose own SGM pricer answers, beside its legs multiplied, and the Model's price on Pro. A leg may be the model's own (a player no book prices, a double or triple double, the model's own line, from model-markets); where no book prices the legs whole, modelOnly is true and the Model's price stands alone. Never a bet.

gamegame keylegs[selection key]books[tab, …]marginfraction | market | betfair
sample response
{valid, game, legs, books:[{book, price, multiplied, lift}], best:{book, price}, modelOnly, model:{fair, price}}
POST /v1/sports/{sport}/multi/quotenba_multi_priceAPI Pro and Business; app Plus and up

Legs of different games as a multi, priced at every book by its own rule, beside the Model's price and each leg's on Pro. A leg is a selection or an SGM of its game, so a multi of SGMs across games is one quote; one leg is a single's or an SGM's price. Two legs of one game are an SGM: priced there instead. modelOnly: the Model's price alone, no book asked.

legs[{game, sel} | {game, sgm:[sel]}]modelOnlytrue | falsebooks[tab, …]marginfraction | market | betfair
sample response
{valid, legs:[{game, sel | sgm, prices, chance, model, each}], books:[{book, price}], best:{book, price}, model:{chance, fair, price}}
POST /v1/sports/{sport}/games/{key}/model/specialsnba_game_specialsAPI Pro and Business; app Pro

Game specials priced by the Model from its own simulation of the game: the winning margin bands, overtime, the total's odd or even and wire to wire with the books' prices beside the Model's, the highest scoring half, total bands, either team 40+ in a quarter, first quarter and game winner, ahead at every break, any player 40+ and 50+, two players both 25+ and 30+, teammates both 20+, a double double with his team's win. The highest scoring quarter and both teams N+ are Our markets' and named in inOurMarkets. What isn't priced and why.

keyB:nba:bos@det:2026-10-20marginfraction | market | per family
sample response
{game, home, away, markets:[{kind, label, group, selections:[{key, label, probability, fairPrice, price, margin, sel?, books?, best?, bestBook?, edge?, valueOn?}]}], inOurMarkets:[{kind, label, ours}], open:[{kind, label, why}], books, booksWhy, margin:{key, words}, draws, version}
POST /v1/sports/{sport}/games/{key}/model/specials/settlenba_game_specials_settleAPI Pro and Business; app Pro

Game specials settled on the final box score: won, lost, void or unknown, with why; with no selections, the specials kept before tip-off, settled.

keygame keyselections[special key]
sample response
{game, final, selections:[{selection, result, why}]}
POST /v1/sports/{sport}/model/specialsnba_slate_specialsAPI Pro and Business; app Pro

The day's specials priced by the Model: favourites that win, any player 50+, games to overtime, the day's highest scoring game, a margin double; closed at the day's first tip-off.

dateYYYY-MM-DD (Sydney)teams[team id, team id]marginfraction | market | per family
sample response
{date, games, priced, favourites:{game: team}, markets:[{kind, label, selections:[{key, label, probability, fairPrice, price}]}], closed?, margin}
POST /v1/sports/{sport}/model/specials/settlenba_slate_specials_settleAPI Pro and Business; app Pro

The day's specials settled on its games' final box scores: over the games the day's specials were priced over, with the favourites kept then where they were kept (over: kept), else every game of the day. Won, lost, void or unknown, with why.

dateYYYY-MM-DD (Sydney)selections[special key]
sample response
{date, games, gameKeys, over, final, selections:[{selection, result, why}]}
GET /v1/sports/{sport}/sgm/valuenba_sgm_valueAPI Pro and Business; app Pro

The value SGMs of a Sydney day, with their results once settled and the record.

dateyyyy-MM-dd
sample response
{date, threshold, value:[…], record:{found, settled, won, roi, clv}}
GET /v1/sports/{sport}/players/{person_id}nba_playerEvery API plan; app Free and up

The player sheet: his props across books at every line for the game, his form and logs, and on Pro his chance of playing and minutes.

person_idintegergamegame keybookstab,neds,…marginfraction | market | betfair
sample response
{player, game, props, logs, form, model, fairPrices}
GET /v1/sports/{sport}/teams/{team_id}nba_teamEvery API plan; app Free and up

The team sheet: the roster, the form, the injuries and the next games.

team_idinteger
sample response
{team, roster, form, injuries, next}
GET /v1/sports/{sport}/newsnba_newsEvery API plan; app Free and up

The NBA's news: injury reports, lineups and corroborated posts, each tied to its game and player.

sinceISO timelimitinteger
sample response
{at, items:[{id, at, kind, name, personId, game, status, reason, source, major, lateScratch}], games}
GET /v1/sports/{sport}/news/impactnba_news_impactAPI Pro and Business; app Pro

What a news item does: the player's chance and minutes, who benefits, the game's lines moved, and the books still on their old line.

gamegame keypersonintegeratISO time
sample response
{game, person, name, dir, impact:{own, benefits, line, total}, stale:[…]}
GET /v1/sports/{sport}/injuriesnba_injuriesEvery API plan; app Free and up

The injuries board: every listed player with his status, and on Pro his chance of playing and minutes; with `game`, what an out would do (Pro).

gamegame key
sample response
{games:[{key, home, away, tipOff, teams, modelLocked, impactLocked}], impacts}
GET /v1/sports/{sport}/stalenba_stale_booksAPI Pro and Business; app Pro

Books behind the news: a book still on its line after the others moved on news, the side worth taking at its price, and the record.

bookstab,neds,…
sample response
{items:[{book, game, sel, side, price, line, others, news, earned}], record, games}
GET /v1/sports/{sport}/books/lagnba_books_lagEvery API plan; app Free and up

How fast each book moves after news, and the stale-book flags' record.

no parameters
sample response
{leaderboard:[{book, events, medianMin, within15, suspended}], stale:{flags, beaten, rate, earned}}
GET /v1/sports/{sport}/books/reportnba_books_reportEvery API plan; app Free and up

The Bookmakers report on the NBA's finished games: each book's best prices, margins by market, coverage, prices over the market, speed after news and reads answered, ranked best for punters.

days7 or 30 (7)
sample response
{days, games, weights, books:[{book, rank:{place, score, parts}, bestPrice, margin, coverage, opportunity, speed, reliability}]}
GET /v1/sports/{sport}/promosnba_promosEvery API plan; app Free and up

The books' NBA offers, each tied to its games.

stateNSW | VIC | …bookstab,neds,…
sample response
{promos:[{book, kind, blurb, games, ends, link}], games}
GET /v1/sports/{sport}/arbsnba_arbsAPI Pro and Business; app Punter and Pro

Every NBA arb and middle across the key's books: the main lines, team totals and every player prop, with the stakes.

bookstab,neds,…onlytab,neds
sample response
{stake, items:[{game, kind, market, line, pct, legs, stakes, profit}], games, books}
GET /v1/sports/{sport}/valuenba_alt_valueAPI Pro and Business; app Punter and Pro

Alt-line value: alternate lines priced against the market's main lines, the biggest edge first.

bookstab,neds,…onlytab,neds
sample response
{items:[{game, book, sel, line, price, fair, edge, chance}], rule:{minBooks, minEdge}}
GET /v1/sports/{sport}/moversnba_moversEvery API plan; app Free and up

The NBA's movers: prices that moved 10% or more from the open, and steam (several books moving together).

bookstab,neds,…
sample response
{items:[{game, book, sel, open, now, move, dir}], steam:[{game, sel, books, move, at}]}
GET /v1/sports/{sport}/modelnba_modelEvery API plan; app Pro

The NBA model's document: its version, the band, the props' and the SGM's numbers, and which families' value marks are earned.

no parameters
sample response
{version, band, families, earned}
GET /v1/sports/{sport}/model/gradesnba_gradesEvery API plan; app Free and up

The NBA model's record against the books: by market family and horizon, each book's margins, and the availability model's accuracy.

no parameters
sample response
{version, families, books, nights, availability}
GET /v1/sports/{sport}/model/sgmnba_sgm_recordEvery API plan; app Free and up

How the NBA's SGMs came out: each book's SGM pricing (asked, priced, under the Model, against its legs), our SGM chances against the results; the SGM scanner's record on Pro tools (proTools) only.

days7, 30 or 90 (30)
sample response
{days, books:[{book, asked, priced, margin, lift, said, landed}], ours, scanner (proTools)}
GET /v1/sports/{sport}/model/newsnba_model_newsEvery API plan; app Pro

The what-if's accuracy on each news event, and its own moves.

no parameters
sample response
{events:[{at, game, name, dir, moved, accuracy}]}
GET /v1/sports/{sport}/model/picksnba_picksEvery API plan; app Pro

The model's NBA picks: every price longer than the model's beyond the band, with the family's record.

marginfraction | market | betfair
sample response
{at, version, margin, picks:[{game, kind, sel, line, chance, fair, book, price, edge, earned}], earned}
GET /v1/sports/{sport}/model/disagreenba_disagreeEvery API plan; app Free and up

Every NBA bookmaker price past the consensus of the rest, margins taken out.

no parameters
sample response
{at, items:[{game, sel, book, price, consensus, edge}]}
GET /v1/sports/{sport}/factsnba_factsEvery API plan; app Free and up

The facts the what-if presets fire on, per game (at most 20): its state, whether the starters are confirmed, and each player's official word or corroborated news.

gamesgame key,game key
sample response
{at, games:{key:{state, startersConfirmed, players}}}
GET /v1/sports/{sport}/news-alertsAPI Pro and Business; app Free and up

Whether the NBA's major news is pushed to this member with MarketMover closed, and their choices (route only: a member's own setting).

no parameters
sample response
{on, prefs:{major, followedOnly, muted}}
PUT /v1/sports/{sport}/news-alertsAPI Pro and Business; app Plus and up

Turns the NBA's news alerts on with the member's choices, or off (route only).

onbooleanprefs{major, followedOnly, muted}
sample response
{on, prefs}
GET /v1/sports/{sport}/statsnba_statsEvery API plan; app Free and up

The Stats tab's index: the seasons, the areas and the views it holds.

no parameters
sample response
{seasons, areas:[{id, views}]}
GET /v1/sports/{sport}/stats/tablenba_statsEvery API plan; app Free and up

A stats table: players or teams, any view and season, filtered, sorted and paged.

viewplayers.traditional | teams.advanced | …season2025-26perPerGame | Totalssortcolumnlimitinteger
sample response
{view, season, columns, rows:[…], total}
GET /v1/sports/{sport}/stats/leadersnba_statsEvery API plan; app Free and up

The league leaders by stat.

season2025-26ninteger
sample response
{season, leaders:[{stat, rows}]}
GET /v1/sports/{sport}/stats/standingsnba_statsEvery API plan; app Free and up

The standings by conference.

season2025-26
sample response
{season, conferences:[{name, teams}]}
GET /v1/sports/{sport}/stats/resultsnba_statsEvery API plan; app Free and up

A day's results with box score links.

dateyyyy-MM-dd
sample response
{date, games:[…]}
GET /v1/sports/{sport}/stats/injuriesnba_statsEvery API plan; app Free and up

The injury report for a day.

dateyyyy-MM-dd
sample response
{date, teams:[{teamId, players}]}
GET /v1/sports/{sport}/stats/comparenba_statsEvery API plan; app Free and up

Players or teams side by side over their last games.

ids1630595,1628369kindplayer | teamstatpointslastinteger
sample response
{kind, stat, items:[{id, name, values}]}
GET /v1/sports/{sport}/stats/players/{person_id}nba_statsEvery API plan; app Free and up

A player's season.

person_idintegerseason2025-26
sample response
{player, season, averages, totals}
GET /v1/sports/{sport}/stats/players/{person_id}/gamesnba_statsEvery API plan; app Free and up

A player's game log, filtered.

person_idintegerlastintegerlochome | away
sample response
{player, games:[…]}
GET /v1/sports/{sport}/stats/players/{person_id}/seriesnba_statsEvery API plan; app Free and up

A player's stat game by game with its rolling average and a line's hit rate.

person_idintegerstatpointslinenumber
sample response
{stat, window, points:[{date, opp, home, v, min}], rolling, distribution, line, hits:{games, over, push, under, rate}}
GET /v1/sports/{sport}/stats/players/{person_id}/splitsnba_statsEvery API plan; app Free and up

A player's splits.

person_idintegergroupgeneral | …
sample response
{player, splits:[…]}
GET /v1/sports/{sport}/stats/players/{person_id}/shotsnba_statsEvery API plan; app Free and up

A player's shot chart.

person_idinteger
sample response
{player, shots:[…], zones}
GET /v1/sports/{sport}/stats/players/{person_id}/careernba_statsEvery API plan; app Free and up

A player's career by season.

person_idinteger
sample response
{player, seasons:[…]}
GET /v1/sports/{sport}/stats/players/{person_id}/bionba_statsEvery API plan; app Free and up

A player's bio.

person_idinteger
sample response
{player, bio}
GET /v1/sports/{sport}/stats/players/{person_id}/newsnba_statsEvery API plan; app Free and up

A player's news.

person_idinteger
sample response
{player, items:[…]}
GET /v1/sports/{sport}/stats/players/{person_id}/morenba_statsEvery API plan; app Free and up

A player's other numbers: hustle, tracking, defence.

person_idinteger
sample response
{player, sets:[…]}
GET /v1/sports/{sport}/stats/teams/{team_id}nba_statsEvery API plan; app Free and up

A team's season.

team_idintegerseason2025-26
sample response
{team, season, averages}
GET /v1/sports/{sport}/stats/teams/{team_id}/gamesnba_statsEvery API plan; app Free and up

A team's game log.

team_idinteger
sample response
{team, games:[…]}
GET /v1/sports/{sport}/stats/teams/{team_id}/seriesnba_statsEvery API plan; app Free and up

A team's stat game by game.

team_idintegerstatpoints
sample response
{team, stat, points:[…]}
GET /v1/sports/{sport}/stats/teams/{team_id}/splitsnba_statsEvery API plan; app Free and up

A team's splits.

team_idinteger
sample response
{team, splits:[…]}
GET /v1/sports/{sport}/stats/teams/{team_id}/shotsnba_statsEvery API plan; app Free and up

A team's shot chart.

team_idinteger
sample response
{team, shots:[…]}
GET /v1/sports/{sport}/stats/games/{ref}nba_statsEvery API plan; app Free and up

A game's box score, plays, rotations and shots, as held.

refgame key or NBA game id
sample response
{game, box, plays, rotation, shots}
GET /v1/sports/{sport}/stats/savedAPI Pro and Business; app Plus and up

The key's saved Stats views and its comparison (route only: a member's own rows).

no parameters
sample response
{views:[{name, ui}], compare}
PUT /v1/sports/{sport}/stats/savedAPI Pro and Business; app Plus and up

Replaces the saved views or the comparison (route only).

views[{name, ui}]compare{kind, items}
sample response
{views, compare}
GET /v1/memeEvery API plan; app Free and up

The key's plan, what it allows, and its usage this minute and today.

no parameters
sample response
{tier, plan, subscription, expires, allows:{historyDays, exotics, asAt, draws, bulk, stream, model, pools, markets, margins, products, placing, member, proTools}, usage:{minute:{used, limit}, day:{used, limit}}}
PUT /v1/me/booksEvery API plan; app Free and up

The free plan's two chosen books, kept under the key.

books[tab, neds]
sample response
{books}
GET /v1/me/ratingsEvery API plan; app Free and up

Every race you have pushed ratings or prices for.

no parameters
sample response
{races:[{race, source, at}]}
GET /v1/me/ratings/{race_key}Every API plan; app Free and up

Your ratings and prices on one race.

keystring
sample response
{race, runners:{number:{rating, price, source}}}
PUT /v1/me/ratings/{race_key}push_pricesEvery API plan; app Free and up

Push your own ratings or your model's prices on a race (`source: model`), graded against Betfair SP.

keystringrunners{number:{rating, price}}sourcemodel
sample response
{race, runners}
DELETE /v1/me/ratings/{race_key}Every API plan; app Free and up

Removes your ratings on a race.

keystring
sample response
{ok}
GET /v1/me/columnsmy_columnsEvery API plan; app Free and up

Your custom columns from your own files (name, kind, decimals, shown, order) and the import formats you saved. App Pro and every API plan.

no parameters
sample response
{columns:[{id, name, kind, decimals, show, position}], formats:[{name, signature, roles, dateFormat, answers, myPrice}], max}
PUT /v1/me/columnsEvery API plan; app Free and up

Renames, hides, shows or orders your custom columns; `dropFormats` forgets saved import formats.

columns[{id, name, show, position, decimals}]dropFormats[signature]
sample response
{columns, formats, max}
DELETE /v1/me/columns/{column_id}Every API plan; app Free and up

Deletes a custom column and every value of it.

column_idstring
sample response
{deleted}
DELETE /v1/me/columns/valuesEvery API plan; app Free and up

Clears the imported values on one race (`race`) or on every race (`all` true). The column definitions are kept. App Pro and every API plan.

racerace keyalltrue
sample response
{cleared}
POST /v1/me/columns/resolveEvery API plan; app Free and up

Places your file's (date, track, race, code) sets on races: each matched to a race key, a suggestion to confirm, a pick list of the day's meetings, or no such race.

sets[{date, track, race, code}]answers{track: R:belmont | skip}
sample response
{sets:[{date, track, race, status, key, options}]}
POST /v1/me/columns/importimport_columnsEvery API plan; app Free and up

Any CSV or pasted text onto the card as your own columns (up to 10): roles guessed from the headers, anything uncertain asked, nothing written until answered; `race` for one race's card, `myPrice` to write a column as your price too.

textthe fileracerace keyroles{header: role}dateFormatdmy | mdy | isoanswers{track: R:belmont | skip}myPricecolumn namedryRuntruesaveFormatname
sample response
{ok, questions, columns, myPriceOffer, summary:{rows, matched, scratched, noRunner, noRace, skipped, otherRaces}, races, written}
GET /v1/me/recordmy_recordEvery API plan; app Free and up

Your model's private record against Betfair SP.

daysinteger
sample response
{summary, byCode, byHorizon, rows}
GET /v1/me/linkEvery API plan; app Free and up

Under an API key: every app licence linked to it, whether it consented to placing, and the agents it runs.

no parameters
sample response
{links:[{label, placing, linkedAt, devices:[{device, name, platform, reportedAt}]}], linked, api, placing}
POST /v1/me/linkEvery API plan; app Free and up

Links an app licence to an API key (the app's Settings sends it).

apiKeystringplacingboolean
sample response
{linked, placing}
DELETE /v1/me/linkEvery API plan; app Free and up

Unlinks the key's own link.

no parameters
sample response
{ok}
DELETE /v1/me/link/{label}Every API plan; app Free and up

Turns a linked licence's placing off.

labelstring
sample response
{ok}
GET /v1/healthOpen, no key

Open. Whether the service is up and which model file it prices with.

no parameters
sample response
{ok, version, model, keys, mcp}
POST /v1/me/sessionEvery API plan; app Free and up

Opens a short session for this device. An API key is not bound to a device. In log mode a third device is recorded and still allowed.

devicestring
sample response
{ok, bound, device, devices, mode, token, catalog}
GET /v1/me/devicesEvery API plan; app Free and up

How many devices this app key has activated, and whether a screen is live. An API key is not bound.

no parameters
sample response
{bound, mode, devices, live, limit}
POST /v1/me/devices/deactivateEvery API plan; app Free and up

Drops one device from this app key so another can activate. An API key has nothing to drop.

devicestring
sample response
{ok, devices}
POST /v1/me/live/holdEvery API plan; app Free and up

Keeps or takes the one live screen. Another device is told to take it back. Log mode does not refuse.

devicestringtakeBackboolean
sample response
{ok, bound, holder, yours, mode}
GET /v1/me/betsAPI Pro and Business; app Free and up

The bet ledger under the key's subscription.

daysinteger
sample response
{bets:[{id, race, runner, book, betType, stake, price, status, payout, fair}]}
GET /v1/me/bets/summaryAPI Pro and Business; app Free and up

The ledger by bet type, against the Model's price and the close.

daysinteger
sample response
{byType:[{type, bets, staked, returned, clv}]}
PUT /v1/me/betsAPI Pro and Business; app Free and up

Merges bets into the ledger.

bets[bet]
sample response
{bets}
DELETE /v1/me/bets/{bet_id}Every API plan; app Free and up

Removes a bet from the ledger.

bet_idstring
sample response
{ok}
GET /v1/me/blackbookAPI Pro and Business; app Free and up

The blackbook.

no parameters
sample response
{entries:[{id, code, name, note, lastFinish, runs}]}
PUT /v1/me/blackbookAPI Pro and Business; app Free and up

Merges blackbook entries.

entries[entry]
sample response
{entries}
DELETE /v1/me/blackbook/{entry_id}Every API plan; app Free and up

Removes a blackbook entry.

entry_idstring
sample response
{ok}
GET /v1/me/watchlistAPI Pro and Business; app Free and up

My racing: the starred meetings and pinned races.

no parameters
sample response
{venues, races}
PUT /v1/me/watchlistAPI Pro and Business; app Free and up

Merges my racing.

venues[…]races[…]removed[…]
sample response
{venues, races}
DELETE /v1/me/watchlist/{kind}/{item_id}Every API plan; app Free and up

Removes a star or a pin.

kindvenue | raceitem_idstring
sample response
{ok}
GET /v1/push/keyAPI Pro and Business; app Free and up

The web push key a browser subscribes with.

no parameters
sample response
{key}
PUT /v1/me/pushAPI Pro and Business; app Free and up

A browser's push subscription under the key.

endpointurlkeys{p256dh, auth}
sample response
{ok}
DELETE /v1/me/pushEvery API plan; app Free and up

Removes a browser's push subscription.

endpointurl
sample response
{ok}
PUT /v1/me/apnsAPI Pro and Business; app Free and up

A Mac's or iPhone's push token under the key.

tokenstringdevicestringtopicstring
sample response
{ok}
DELETE /v1/me/apns/{token}Every API plan; app Free and up

Removes a device's push token.

tokenstring
sample response
{ok}
POST /v1/me/relay/eventAPI Pro and Business; app Free and up

A device tells the member's other devices something happened (an alert, a bet).

kindstringtitlestringdevicestring
sample response
{ok}
PUT /v1/me/relay/statusAPI Pro and Business; app Free and up

A device says whether its auto bettors run.

devicestringrunningboolean
sample response
{ok}
GET /v1/me/relay/statusAPI Pro and Business; app Free and up

Every device's auto bettors, running or not.

no parameters
sample response
{devices:[{device, running, at}]}
DELETE /v1/me/relay/status/{device}Every API plan; app Free and up

Forgets a device.

devicestring
sample response
{ok}
POST /v1/me/relay/commandAPI Pro and Business; app Free and up

Sends a command to a device (stop every auto bettor).

commandstringdevicestring
sample response
{id}
GET /v1/me/relay/commandsAPI Pro and Business; app Free and up

The commands waiting for a device.

devicestring
sample response
{commands:[…]}
POST /v1/me/relay/answerAPI Pro and Business; app Free and up

A device answers a command it collected.

idintegerdevicestringresult{…}
sample response
{ok}
GET /v1/me/picks-alertsAPI Pro and Business; app Free and up

Whether new picks are pushed to the key's browsers, and the filter.

no parameters
sample response
{on, filter}
PUT /v1/me/picks-alertsAPI Pro and Business; app Pro

Turns picks alerts on with a filter, or off.

onbooleanfilter{hours, codes, minEdge, …}
sample response
{on, filter}
GET /v1/me/remindersAPI Pro and Business; app Free and up

Race reminders.

no parameters
sample response
{reminders:[{race, minutes}]}
PUT /v1/me/remindersAPI Pro and Business; app Free and up

Replaces the race reminders.

reminders[{race, minutes}]
sample response
{reminders}
GET /v1/me/booksAPI Pro and Business

Each of your bookmakers as your own MarketMover agent last reported it: logged in or not, the balance, when. Your logins stay on your device; the API never holds one.

no parameters
sample response
{agent, agents:[device], books:[{book, name, loggedIn, state, balance, currency, reason, checkedAt, reportedAt, device}]}
GET /v1/me/agentAPI Pro and Business

Whether an agent of yours is connected: the extension host, the Windows app or the Mac app, logged in to your books on your own machine.

no parameters
sample response
{connected, agents:[{device, name, platform, reportedAt, ageSeconds, loggedIn:[book]}]}
POST /v1/me/bets/quoteAPI Pro and Business

A quote from the book through your agent, for a single (runner and displayedPrice) or a race product (product and legs in their place), answered within 20 s. Without an agent: 409, never a bet. Your agent runs one call at a time: a second while one is unanswered is 429.

bookstringracekeyrunnernumberlegwin | placesideback | laystakedollarsdisplayedPricedecimalproductcodelegs[{runners, positions}]
sample response
{ok, agent, quote:{id, price, minStake, balance, quotedAt, expiresAt, …}} or {ok:false, failure:{code, message}}
POST /v1/me/bets/confirmAPI Pro and Business

Places the quoted bet within its window; your agent re-checks your limits and places once. The same clientRef twice is one bet. Unanswered in 20 s: 504 with the askId to read later.

quoteIdstringclientRefstring
sample response
{state: placed | rejected | unresolved | failed, bookBetID, acceptedPrice, stake, balance, agent, ledgerId, ledger}
POST /v1/me/bets/placeplace_betAPI Pro and Business

Quote and confirm in one call, each step within 20 s, with a clientRef so a retry never places twice. Placed only when the book's price is the same as or better than displayedPrice, a lay's the same or lower; a worse one comes back with the quote, unconfirmed. The stake is dollars; a lay's stake is the backer's stake, and its liability is stake × (price − 1). displayedPrice must be the card's or the quote's price as given (a lower number lets a worse price through).

bookstringracekeyrunnernumberstakedollarsdisplayedPricedecimalclientRefstring
sample response
{state, quote, bookBetID, acceptedPrice, stake, agent, ledgerId, ledger}
GET /v1/me/bets/asks/{ask_id}API Pro and Business

A placing command you queued and its answer once your agent posts one: the way back after a 504 or a dropped connection.

ask_idinteger
sample response
{askId, command, device, at, clientRef, answered, answer}
MCP · included in every tier

Ask in words.

The same API is an MCP server. Add it to Claude, ChatGPT, Cursor or any MCP client with your key, and the assistant has a tool for each data route: racing's prices, form, results and the Model, and the NBA's games, Stats, picks, same game multis, the live Model and the what-if, each on the plan its route is on. Two tools place real bets with real money, on API Pro and Business: place_bet for racing and nba_place for the NBA, through your own MarketMover agent and under its limits, each with your own ref; the server tells the assistant to place only when you ask in your own words.

Racing · model_prices
What does the Model make of Randwick race 7?
The call
{
 "name": "model_prices",
 "arguments": {"key": "R:randwick:7:2026-09-26"}
}
What comes back (cut short)
{
 "race": "R:randwick:7:2026-09-26",
 "minutesToJump": 41,
 "booksQuoting": 5,
 "weight": 0.68,
 "runners": [{"number": 4, "name": "Sea Glass", "win": 0.31, "winPrice": 3.2, "market": 0.29, "place": 0.66, "placePrice": 1.52}, {"number": 7, "name": "Delacroix", "win": 0.18, "winPrice": 5.55, "market": 0.2, "place": 0.49, "placePrice": 2.04}]
}

Randwick R7 jumps in 41 minutes with 5 books quoting. The Model has Sea Glass at $3.20, a 31% chance against the market's 29%; Delacroix at $5.55, 18% against the market's 20%. The Model's record is at grades if you want to weigh it.

Racing · disagree
Where does one book stand apart from the rest today?
The call
{
 "name": "disagree",
 "arguments": {}
}
What comes back (cut short)
{
 "at": "2026-09-26T04:10:00Z",
 "items": [{"race": "R:flemington:6:2026-09-26", "number": 3, "name": "Harbour Light", "book": "pointsbet", "price": 6.5, "consensus": 5.1, "edge": 0.27}]
}

PointsBet's $6.50 on Harbour Light in Flemington R6 is 27% past the rest of the market, margins taken out, which has it at $5.10. That is the books against each other, not the Model.

The NBA · nba_games
What are tonight's NBA prices?
The call
{
 "name": "nba_games",
 "arguments": {"date": "2026-10-21"}
}
What comes back (cut short)
{
 "date": "2026-10-21",
 "games": [{"key": "B:nba:bos@det:2026-10-20", "tipOff": "2026-10-20T23:00:00Z", "home": {"tricode": "DET"}, "away": {"tricode": "BOS"}, "lines": {"tab": {"ml": {"away": 1.92, "home": 1.88}}, "sportsbet": {"ml": {"away": 1.9, "home": 1.9}}}, "best": {"ml": {"away": {"price": 1.92, "books": ["tab"]}, "home": {"price": 1.9, "books": ["sportsbet"]}}}}]
}

Boston at Detroit tips off at 10 am Sydney time. The best head to head: Boston $1.92 at TAB, Detroit $1.90 at Sportsbet. Every book's line and total are in the same answer.

The NBA · nba_what_if
If Tatum sits, what moves?
The call
{
 "name": "nba_what_if",
 "arguments": {"key": "B:nba:bos@det:2026-10-20", "changes": [{"person": 1628369, "set": "out"}]}
}
What comes back (cut short)
{
 "changes": [{"person": 1628369, "set": "out"}],
 "base": {"h2hHome": 0.477, "lineHome": 0.49, "total": 221.6},
 "scenario": {"h2hHome": 0.546, "lineHome": 0.552, "total": 219.8},
 "main": [{"kind": "ml", "side": "home", "fair": [2.1, 1.83], "best": 1.9, "bestBooks": ["sportsbet"], "edge": [-0.095, 0.038]}]
}

With Tatum out, the Model has Detroit's chance from 47.7% to 54.6%, its price from $2.10 to $1.83, so Sportsbet's $1.90 on Detroit is now 3.8% past it. The total drops nearly two points, and Boston's players' props move with his minutes. The Model's view, not advice. On Pro.

The NBA · nba_stats
How often has Cunningham gone over 24.5 points lately?
The call
{
 "name": "nba_stats",
 "arguments": {"what": "player_series", "id": "1630595", "params": {"stat": "points", "line": 24.5}}
}
What comes back (cut short)
{
 "stat": "points",
 "window": 5,
 "points": [{"date": "2026-10-14", "opp": "CLE", "home": true, "v": 28, "min": 36.2}],
 "line": 24.5,
 "hits": {"games": 10, "over": 7, "push": 0, "under": 3, "rate": 0.7}
}

Over 24.5 points in 7 of his last 10 games, his five-game average 27.4. Stats are on every plan.

The NBA · nba_live_model
The game's under way: is any book past the live Model?
The call
{
 "name": "nba_live_model",
 "arguments": {"key": "B:nba:bos@det:2026-10-20"}
}
What comes back (cut short)
{
 "game": {"key": "B:nba:bos@det:2026-10-20", "state": "live", "period": 3, "clock": "PT05M12.00S", "home": 71, "away": 66},
 "live": true,
 "elapsed": 0.66,
 "prices": {"ml:game:-:-:-:home": {"chance": 0.71, "price": 1.41}}
}

Detroit by 5 in the third: the live Model has them at $1.41 (a 71% chance); nba_game_live has the books' in-play prices beside it. In-play prices are shown, never placed online: online in-play bets are banned in Australia, so you bet in play by phone with your book.

Worked calls, racing's and the NBA's: the tool and its arguments as the assistant sends them, the answer cut short, then the assistant's words. The numbers are illustrative; the shapes are the routes' own (each tool is in the reference above with its plan).

Add it in a minute

Claude Code

One line in the terminal.

claude mcp add --transport http marketmover https://api.marketmover.net/mcp   --header "Authorization: Bearer mm_api_…"

Claude Desktop, Cursor, Windsurf

In the app's MCP settings, as JSON.

{"mcpServers": {"marketmover": {
  "url": "https://api.marketmover.net/mcp",
  "headers": {"Authorization": "Bearer mm_api_…"}
}}}

ChatGPT and the rest

Any client that speaks streamable HTTP: the URL and the bearer.

URL      https://api.marketmover.net/mcp
Header   Authorization: Bearer mm_api_…
Clients

Python and Swift, ready made.

Thin clients over the routes, in the repository, racing and the NBA: the race card, the model, racing's arbs, same race multis, value, news and the books disagreeing; the NBA's games and cards, the Model's prices and our own markets, what-if, same game multi and multi quotes, picks, arbs, value, news, injuries, live games, Stats, results and the Bookmakers report. Any other route is one generic get or post away. Or curl; the reference above is all there is to it.

Python

No dependencies. clients/python

pip install "git+https://github.com/DanielTomaro13/MarketMover.git#subdirectory=clients/python"

from marketmover import MarketMover
mm = MarketMover("mm_api_…")
mm.model("R:randwick:7:2026-09-26", margin="market")
games = mm.nba_games()
mm.nba_what_if("B:nba:bos@det:2026-11-04", [{"person": 1630595, "set": "out"}])
mm.get("/v1/sports/nba/injuries", game="B:nba:bos@det:2026-11-04")
for event, data in mm.stream("R:randwick:7:2026-09-26"):
    print(event, data)

Swift

URLSession, async. clients/swift

let mm = MarketMover(key: "mm_api_…")
let race = try await mm.model("R:randwick:7:2026-09-26", margin: "market")
let games = try await mm.nbaGames()
let arbs = try await mm.call("GET", "/v1/sports/nba/arbs")
for try await event in mm.stream("R:randwick:7:2026-09-26") {
    print(event.name, event.data)
}
Your usage

What your key has used.

Paste your key. It stays in this browser and goes only to the API.

The key is kept in this browser only, so you need not paste it next time. Forget removes it.

Questions

Where do the prices come from?

From each book's own public card, read the way the app reads it, as often as the app does.

How fresh is a price?

Prices refresh in real time as the books move them, the same feed the app reads.

Is the model any good?

Its record against the market is at /v1/model/grades, whole week and by code, every night. Read it before you lean on it.

What happens when I go over?

A 429 with Retry-After. Every response carries what is left of the minute and the day. A race's full history counts as five calls; everything else is one.

Why two keys on Pro and Business?

API Pro and Business have everything in the Pro app plan. The web app and the Community take your API key; the Mac and iPhone apps take an app key, which is shown beside the API key on the page after payment. Both are the one subscription, and each renews on its own.

Can I share a key?

No. A key is one subscription's. If it leaks, rotate it from the billing portal, which opens with your app key or the welcome link, never with the API key itself.

Is MCP extra?

No. It is in every tier, the same key, the same quotas.

Is the NBA in the API?

Yes. Every tier reads the games, every book's lines and props, the news, Stats, the Model's prices, its picks and the live Model in play; Pro and Business add the books' same game multi prices, the what-if, news impacts and the arbs. Each route and its tool is in the reference above with its plan. In-play prices are shown, never placed: online in-play bets are banned in Australia.

How does my key place bets?

On Pro and Business, through your own MarketMover agent: turn on "Let your API key place bets" in the Mac app's Settings (API placing, with your app key), the Windows app or the extension (with the app key or the API key itself), and enter the API key. Bets your code asks for are placed there, with your limits; logins never leave that device, and you can turn it off at any time.