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.
Pick a tier.
Starter
- 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
Pro
- 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
| What each tier includes | Starter$49 / mo | Pro$149 / mo | Business$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 sight | Today | 90 days | All |
| 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 questions | Default | 200,000 draws | 1,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 minute | 60 | 300 | 1,200 |
| Calls a day | 20,000 | 200,000 | 2,000,000 |
| Free trial | – | – | – |
| Support | |||
| ✓ | Within a day | Same 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.
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.
GET /v1/meetingsmeetingsEvery API plan; app Free and upToday's meetings and races, or a Sydney date's: each race's key, number, start, status, distance and class.
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 upA 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.
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 upEvery 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.
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 upWhere 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.
sample response
{race, bonus, runners:[{number, name, back, lay, keeps, layFor}]}GET /v1/races/{key}/historyrace_historyEvery API plan; app Free and upEvery price move from first sight: ticks per book and runner, and each book's boards. Large, and counts as five calls.
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 upEach runner's past starts as the books publish them, with racing.com's speed block on each past run it has.
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 upThe 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.
sample response
{key, book, runners:[{number, name, age, sex, sire, dam, record, starts:[…]}]}GET /v1/races/{key}/racingrace_racingEvery API plan; app Free and upracing.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.
sample response
{available, credit, meeting, race, runners, result, events}GET /v1/meetings/{key}/racingmeeting_racingEvery API plan; app Free and upracing.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.
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 upA 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).
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 upracing.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.
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 upracing.com's expert tips, on every tier: the form analyst's overview, suggested bet and selections by going, each tipster's picks with comments.
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 upEach 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.
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 upEach race of a meeting with its scratched runners and emergencies as racing.com has them, on every tier.
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 upA 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.
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 upRacing 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.
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 upRacing Victoria's stewards' follow-ups on a race's runners from their earlier starts, and those raised on the race, on every tier.
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 upA horse's paragraphs in Racing Victoria's stewards' reports, newest first, on every tier: date, venue, race, text and tags.
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 upRacing Victoria's stewards' follow-ups of a horse, newest first, on every tier: type, the stewards' comment and the trainer's explanation.
sample response
{available, credit, horse, followUps:[{date, venue, raceNo, type, comment, status, outcome}]}GET /v1/races/{key}/resultrace_resultEvery API plan; app Free and upA run race's placings and every dividend the book published.
sample response
{key, venue, raceNo, placings:[[2],[1],[7]], dividends:[{p, s, a}]}GET /v1/resultsresultsEvery API plan; app Free and upEvery resulted race on a Sydney date, with placings and dividends.
sample response
{date, results:[{key, venue, raceNo, start, placings, dividends}]}GET /v1/runnersrunnersEvery API plan; app Free and upThe day's fields: runner names by race.
sample response
{date, races:[{key, venue, raceNo, start, runners:[{n, name, scr}]}]}GET /v1/booksbooksEvery API plan; app Free and upThe bookmakers the prices come from, and which carry tote or lay.
sample response
{books:[{id, name, tote, lay}]}GET /v1/promospromosEvery API plan; app Free and upEvery book's public racing offers, each bound to the races it is for: boosts first, no sign-up inducements.
sample response
{date, promos:[{book, kind, title, blurb, races:[key], ends}]}GET /v1/visionvisionEvery API plan; app Free and upTAB's open Sky channels: code, name, audio or video, and the stream.
sample response
{channels:[{code, name, kind, url, ok}]}GET /v1/newsnewsOpen, no keyRacing news posts, newest first, each matched to its race where we can. Open: no key needed.
sample response
{at, posts:[{id, author, handle, text, created, link, code, region, race:{key, label, runner, confidence}}]}GET /v1/races/{key}/newsnewsOpen, no keyThe news posts matched to one race, newest first. Open: no key needed.
sample response
{at, posts:[…as /v1/news…]}GET /v1/races/{key}/poolspoolsAPI Pro and Business; app Plus and upThe race's tote pools with an estimated dividend per combination, or TAB's approximate for a quinella or exacta. Never a price to bind.
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 upThe day exports on disk: one file a day, every race's whole history on a line, gzipped.
sample response
{exports:[{date, bytes, writtenAt}], keep}GET /v1/exports/{date}API Pro and BusinessThe day's export as a file (route only: a file is no tool's answer).
sample response
marketmover-2026-09-26.jsonl.gz
GET /v1/races/{key}/streamAPI Pro and Business; app Free and upLive 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).
sample response
event: snapshot {…race…} event: prices {moved:[{book, number, win, place, layWin}], gone} event: status {status} event: endGET /v1/liveAPI Pro and Business; app Free and upThe 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).
sample response
event: snapshot {races, model, modelPlace, modelTop} event: prices {moved, gone, status} event: races {came, went}GET /v1/public/booksbooks_reportOpen, no keyThe 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.
sample response
{days, from, to, races, books:[{book, rank, score, best, margin, coverage, speed, reliability, …}]}GET /v1/public/moversmoversOpen, no keyThe 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.
sample response
{date, at, firmers:[{race, number, name, open, now, move, …}], drifters:[…]}GET /v1/public/movers/{key}/{number}moverOpen, no keyOne runner's moves: its prices at every book from first sight, the race and the runner. Open: no key needed.
sample response
{race, runner, books:[{book, open, now, points:[[at, price]]}], …}POST /v1/races/{key}/srmsrm_priceAPI Pro and Business; app Plus and upAny 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.
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 upThe books' own pre-built SRMs priced at every other book and by the model, and three SRMs the model builds.
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 upAny 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.
sample response
{valid, kind, positions, combinations:[{runners, probability, fairPrice}], books:[{book, type, combinations}]}GET /v1/markets/valuemarkets_valueAPI Pro and Business; app ProThe day's value finds across every market kind, each kind's record, level, threshold and whether its marks are earned.
sample response
{date, kinds:{kind:{label, threshold, level, record, earned}}, value:[find], valueEarned}GET /v1/srm/valuesrm_valueAPI Pro and Business; app ProThe SRM value scanner's finds for a Sydney day, with their results once settled and its record.
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 ProThe SRM value scanner's finds on one race.
sample response
{race, value:[…as /v1/srm/value…], flagsEarned}GET /v1/public/products/accuracyproducts_accuracyOpen, no keyHow 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.
sample response
{at, srm:{…}, exotics:{…}, markets:{…}, ours:{…}}GET /v1/public/products/recentproducts_accuracyOpen, no keyThe race products' most recent settled quotes beside their results, the rows the accuracy report is made from. Open: no key needed.
sample response
{at, items:[{race, product, price, result, …}]}GET /v1/races/{key}/modelmodel_pricesEvery API plan; app ProWin and place for every runner as the race stands, with the market weight and the band. `at` prices the race as it stood (asAt).
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 ProEach runner's chance to finish in the first N. Any depth, to the field.
sample response
{race, positions, runners:[{number, name, probability, fairPrice, price, method}]}GET /v1/races/{key}/model/seriesmodel_seriesEvery API plan; app ProThe model's win price at about three dozen moments from first sight to the off: the line on the flucs chart.
sample response
{race, points:[{at, prices:{number: price}}]}GET /v1/races/{key}/model/exoticsexoticAPI Pro and Business; app ProExacta, quinella, trifecta or first four: straight, boxed, or with a standout. No runners: the most likely combinations.
sample response
{race, type, runners, box, probability, fairPrice, price, method} or {combinations:[{runners, probability, fairPrice, price}]}POST /v1/model/queryqueryEvery API plan; app ProAny multi: legs in one race are a same-race multi, legs across races multiply. More than one leg needs the exotics.
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 ProOur 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).
sample response
{race, markets:[{kind, label, selections:[{label, probability, fairPrice, price}]}]}POST /v1/races/{key}/model/comborace_comboAPI Pro and Business; app ProThe Extra SRM: our own combination of 2 to 6 extra-market selections in one race, priced by the model.
sample response
{race, legs, probability, fairPrice, price, method}POST /v1/races/{key}/model/settlerace_settleAPI Pro and Business; app ProEach extra-market selection settled from the race's result: won, lost, void or unknown, with why.
sample response
{race, order, settled:[{selection, result, why}]}POST /v1/meetings/{meeting_key}/model/specialsmeeting_specialsAPI Pro and Business; app ProThe meeting's specials priced by the model: favourites that win, a $10+ winner, the favourites quaddie, jockey and trainer doubles and challenges.
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 ProMeeting specials settled from the stored results: won, lost, void or unknown, with why.
sample response
{meeting, settled:[{selection, result, why}]}GET /v1/model/pickspicksEvery API plan; app ProRunners whose best price is longer than the model's beyond the band, across every race still to run.
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 upEvery bookmaker price past the consensus of the rest, margins taken out: where one book stands apart from the market.
sample response
{at, items:[{race, number, name, book, price, consensus, edge}]}GET /v1/model/gradesgradesEvery API plan; app Free and upThe model's record against the market on its held-out week, by horizon and by code.
sample response
{model, gradedAt, races, horizons:{-1h:{logLoss, marketLogLoss, clv, formTest}}, byCode:{R, G, H}}GET /v1/modelmodel_fileEvery API plan; app ProThe model file in force: the place powers per code, the market weight, the prior.
sample response
{version, trainedAt, placePowers, maturity, prior, curves, band}GET /v1/public/recordrecordOpen, no keyThe 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.
sample response
{at, racing:{…}, tips:{…}, nba:{…}, live:{…}}GET /v1/arbsarbsAPI Pro and Business; app Punter and ProEvery 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.
sample response
{at, stake, items:[{race, kind, pct, legs:[{book, number, side, price, stake}], profit}]}GET /v1/sportssportsEvery API plan; app Free and upThe sports open to this key. The NBA answers once it is open to the key's audience.
sample response
{sports:{nba:{open, released}}}GET /v1/sports/{sport}/gamesnba_gamesEvery API plan; app Free and upA 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.
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 upThe 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.
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 upOne market group at every line across every book, the best marked, with the Model's price on Pro.
sample response
{game, market, markets:[{id, kind, lines}], books, fairPrices}GET /v1/sports/{sport}/games/{key}/livenba_game_liveEvery API plan; app Free and upThe game in play: the score, the clock, the box score and every book's in-play prices.
sample response
{game, inPlay, markets, books, inPlayBooks, box}GET /v1/sports/{sport}/games/{key}/live/modelnba_live_modelEvery API plan; app ProA 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.
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 upThe 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).
sample response
event: snapshot {…card…} event: patch {…} event: end {state}GET /v1/sports/{sport}/games/{key}/flucsnba_game_flucsEvery API plan; app Free and upEach selection's price history at every book, from first sight.
sample response
{game, market, sels:{sel:{book:[[at, price]]}}, truncated}GET /v1/sports/{sport}/games/{key}/resultnba_game_resultEvery API plan; app Free and upA final game: the line score, team stats, leaders, and how the main lines settled at the key's books.
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 upThe game's preview, key stats, both lineups (the model's on Pro), the what-if presets and each book's previews and tips.
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 upThe game's insights and our tips, each with its numbers and the record.
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 ProOur 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).
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 ProWhat-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.
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 upOne 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).
sample response
{ok, book, game, sel, handle, ref, price} or {ok:false, code, why}POST /v1/sports/{sport}/bets/quoteAPI Pro and BusinessAn 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).
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 BusinessAn 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).
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 ProThe value SGMs the scanner found on a game: the best book's price at least 15% over the model's.
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 upAny 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.
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 upLegs 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.
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 ProGame 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.
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 ProGame specials settled on the final box score: won, lost, void or unknown, with why; with no selections, the specials kept before tip-off, settled.
sample response
{game, final, selections:[{selection, result, why}]}POST /v1/sports/{sport}/model/specialsnba_slate_specialsAPI Pro and Business; app ProThe 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.
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 ProThe 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.
sample response
{date, games, gameKeys, over, final, selections:[{selection, result, why}]}GET /v1/sports/{sport}/sgm/valuenba_sgm_valueAPI Pro and Business; app ProThe value SGMs of a Sydney day, with their results once settled and the record.
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 upThe 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.
sample response
{player, game, props, logs, form, model, fairPrices}GET /v1/sports/{sport}/teams/{team_id}nba_teamEvery API plan; app Free and upThe team sheet: the roster, the form, the injuries and the next games.
sample response
{team, roster, form, injuries, next}GET /v1/sports/{sport}/newsnba_newsEvery API plan; app Free and upThe NBA's news: injury reports, lineups and corroborated posts, each tied to its game and player.
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 ProWhat 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.
sample response
{game, person, name, dir, impact:{own, benefits, line, total}, stale:[…]}GET /v1/sports/{sport}/injuriesnba_injuriesEvery API plan; app Free and upThe 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).
sample response
{games:[{key, home, away, tipOff, teams, modelLocked, impactLocked}], impacts}GET /v1/sports/{sport}/stalenba_stale_booksAPI Pro and Business; app ProBooks 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.
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 upHow fast each book moves after news, and the stale-book flags' record.
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 upThe 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.
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 upThe books' NBA offers, each tied to its games.
sample response
{promos:[{book, kind, blurb, games, ends, link}], games}GET /v1/sports/{sport}/arbsnba_arbsAPI Pro and Business; app Punter and ProEvery NBA arb and middle across the key's books: the main lines, team totals and every player prop, with the stakes.
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 ProAlt-line value: alternate lines priced against the market's main lines, the biggest edge first.
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 upThe NBA's movers: prices that moved 10% or more from the open, and steam (several books moving together).
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 ProThe NBA model's document: its version, the band, the props' and the SGM's numbers, and which families' value marks are earned.
sample response
{version, band, families, earned}GET /v1/sports/{sport}/model/gradesnba_gradesEvery API plan; app Free and upThe NBA model's record against the books: by market family and horizon, each book's margins, and the availability model's accuracy.
sample response
{version, families, books, nights, availability}GET /v1/sports/{sport}/model/sgmnba_sgm_recordEvery API plan; app Free and upHow 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.
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 ProThe what-if's accuracy on each news event, and its own moves.
sample response
{events:[{at, game, name, dir, moved, accuracy}]}GET /v1/sports/{sport}/model/picksnba_picksEvery API plan; app ProThe model's NBA picks: every price longer than the model's beyond the band, with the family's record.
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 upEvery NBA bookmaker price past the consensus of the rest, margins taken out.
sample response
{at, items:[{game, sel, book, price, consensus, edge}]}GET /v1/sports/{sport}/factsnba_factsEvery API plan; app Free and upThe 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.
sample response
{at, games:{key:{state, startersConfirmed, players}}}GET /v1/sports/{sport}/news-alertsAPI Pro and Business; app Free and upWhether the NBA's major news is pushed to this member with MarketMover closed, and their choices (route only: a member's own setting).
sample response
{on, prefs:{major, followedOnly, muted}}PUT /v1/sports/{sport}/news-alertsAPI Pro and Business; app Plus and upTurns the NBA's news alerts on with the member's choices, or off (route only).
sample response
{on, prefs}GET /v1/sports/{sport}/statsnba_statsEvery API plan; app Free and upThe Stats tab's index: the seasons, the areas and the views it holds.
sample response
{seasons, areas:[{id, views}]}GET /v1/sports/{sport}/stats/tablenba_statsEvery API plan; app Free and upA stats table: players or teams, any view and season, filtered, sorted and paged.
sample response
{view, season, columns, rows:[…], total}GET /v1/sports/{sport}/stats/leadersnba_statsEvery API plan; app Free and upThe league leaders by stat.
sample response
{season, leaders:[{stat, rows}]}GET /v1/sports/{sport}/stats/standingsnba_statsEvery API plan; app Free and upThe standings by conference.
sample response
{season, conferences:[{name, teams}]}GET /v1/sports/{sport}/stats/resultsnba_statsEvery API plan; app Free and upA day's results with box score links.
sample response
{date, games:[…]}GET /v1/sports/{sport}/stats/injuriesnba_statsEvery API plan; app Free and upThe injury report for a day.
sample response
{date, teams:[{teamId, players}]}GET /v1/sports/{sport}/stats/comparenba_statsEvery API plan; app Free and upPlayers or teams side by side over their last games.
sample response
{kind, stat, items:[{id, name, values}]}GET /v1/sports/{sport}/stats/players/{person_id}nba_statsEvery API plan; app Free and upA player's season.
sample response
{player, season, averages, totals}GET /v1/sports/{sport}/stats/players/{person_id}/gamesnba_statsEvery API plan; app Free and upA player's game log, filtered.
sample response
{player, games:[…]}GET /v1/sports/{sport}/stats/players/{person_id}/seriesnba_statsEvery API plan; app Free and upA player's stat game by game with its rolling average and a line's hit rate.
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 upA player's splits.
sample response
{player, splits:[…]}GET /v1/sports/{sport}/stats/players/{person_id}/shotsnba_statsEvery API plan; app Free and upA player's shot chart.
sample response
{player, shots:[…], zones}GET /v1/sports/{sport}/stats/players/{person_id}/careernba_statsEvery API plan; app Free and upA player's career by season.
sample response
{player, seasons:[…]}GET /v1/sports/{sport}/stats/players/{person_id}/bionba_statsEvery API plan; app Free and upA player's bio.
sample response
{player, bio}GET /v1/sports/{sport}/stats/players/{person_id}/newsnba_statsEvery API plan; app Free and upA player's news.
sample response
{player, items:[…]}GET /v1/sports/{sport}/stats/players/{person_id}/morenba_statsEvery API plan; app Free and upA player's other numbers: hustle, tracking, defence.
sample response
{player, sets:[…]}GET /v1/sports/{sport}/stats/teams/{team_id}nba_statsEvery API plan; app Free and upA team's season.
sample response
{team, season, averages}GET /v1/sports/{sport}/stats/teams/{team_id}/gamesnba_statsEvery API plan; app Free and upA team's game log.
sample response
{team, games:[…]}GET /v1/sports/{sport}/stats/teams/{team_id}/seriesnba_statsEvery API plan; app Free and upA team's stat game by game.
sample response
{team, stat, points:[…]}GET /v1/sports/{sport}/stats/teams/{team_id}/splitsnba_statsEvery API plan; app Free and upA team's splits.
sample response
{team, splits:[…]}GET /v1/sports/{sport}/stats/teams/{team_id}/shotsnba_statsEvery API plan; app Free and upA team's shot chart.
sample response
{team, shots:[…]}GET /v1/sports/{sport}/stats/games/{ref}nba_statsEvery API plan; app Free and upA game's box score, plays, rotations and shots, as held.
sample response
{game, box, plays, rotation, shots}GET /v1/sports/{sport}/stats/savedAPI Pro and Business; app Plus and upThe key's saved Stats views and its comparison (route only: a member's own rows).
sample response
{views:[{name, ui}], compare}PUT /v1/sports/{sport}/stats/savedAPI Pro and Business; app Plus and upReplaces the saved views or the comparison (route only).
sample response
{views, compare}GET /v1/memeEvery API plan; app Free and upThe key's plan, what it allows, and its usage this minute and today.
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 upThe free plan's two chosen books, kept under the key.
sample response
{books}GET /v1/me/ratingsEvery API plan; app Free and upEvery race you have pushed ratings or prices for.
sample response
{races:[{race, source, at}]}GET /v1/me/ratings/{race_key}Every API plan; app Free and upYour ratings and prices on one race.
sample response
{race, runners:{number:{rating, price, source}}}PUT /v1/me/ratings/{race_key}push_pricesEvery API plan; app Free and upPush your own ratings or your model's prices on a race (`source: model`), graded against Betfair SP.
sample response
{race, runners}DELETE /v1/me/ratings/{race_key}Every API plan; app Free and upRemoves your ratings on a race.
sample response
{ok}GET /v1/me/columnsmy_columnsEvery API plan; app Free and upYour custom columns from your own files (name, kind, decimals, shown, order) and the import formats you saved. App Pro and every API plan.
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 upRenames, hides, shows or orders your custom columns; `dropFormats` forgets saved import formats.
sample response
{columns, formats, max}DELETE /v1/me/columns/{column_id}Every API plan; app Free and upDeletes a custom column and every value of it.
sample response
{deleted}DELETE /v1/me/columns/valuesEvery API plan; app Free and upClears the imported values on one race (`race`) or on every race (`all` true). The column definitions are kept. App Pro and every API plan.
sample response
{cleared}POST /v1/me/columns/resolveEvery API plan; app Free and upPlaces 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.
sample response
{sets:[{date, track, race, status, key, options}]}POST /v1/me/columns/importimport_columnsEvery API plan; app Free and upAny 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.
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 upYour model's private record against Betfair SP.
sample response
{summary, byCode, byHorizon, rows}GET /v1/me/linkEvery API plan; app Free and upUnder an API key: every app licence linked to it, whether it consented to placing, and the agents it runs.
sample response
{links:[{label, placing, linkedAt, devices:[{device, name, platform, reportedAt}]}], linked, api, placing}POST /v1/me/linkEvery API plan; app Free and upLinks an app licence to an API key (the app's Settings sends it).
sample response
{linked, placing}DELETE /v1/me/linkEvery API plan; app Free and upUnlinks the key's own link.
sample response
{ok}DELETE /v1/me/link/{label}Every API plan; app Free and upTurns a linked licence's placing off.
sample response
{ok}GET /v1/healthOpen, no keyOpen. Whether the service is up and which model file it prices with.
sample response
{ok, version, model, keys, mcp}POST /v1/me/sessionEvery API plan; app Free and upOpens 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.
sample response
{ok, bound, device, devices, mode, token, catalog}GET /v1/me/devicesEvery API plan; app Free and upHow many devices this app key has activated, and whether a screen is live. An API key is not bound.
sample response
{bound, mode, devices, live, limit}POST /v1/me/devices/deactivateEvery API plan; app Free and upDrops one device from this app key so another can activate. An API key has nothing to drop.
sample response
{ok, devices}POST /v1/me/live/holdEvery API plan; app Free and upKeeps or takes the one live screen. Another device is told to take it back. Log mode does not refuse.
sample response
{ok, bound, holder, yours, mode}GET /v1/me/betsAPI Pro and Business; app Free and upThe bet ledger under the key's subscription.
sample response
{bets:[{id, race, runner, book, betType, stake, price, status, payout, fair}]}GET /v1/me/bets/summaryAPI Pro and Business; app Free and upThe ledger by bet type, against the Model's price and the close.
sample response
{byType:[{type, bets, staked, returned, clv}]}PUT /v1/me/betsAPI Pro and Business; app Free and upMerges bets into the ledger.
sample response
{bets}DELETE /v1/me/bets/{bet_id}Every API plan; app Free and upRemoves a bet from the ledger.
sample response
{ok}GET /v1/me/blackbookAPI Pro and Business; app Free and upThe blackbook.
sample response
{entries:[{id, code, name, note, lastFinish, runs}]}PUT /v1/me/blackbookAPI Pro and Business; app Free and upMerges blackbook entries.
sample response
{entries}DELETE /v1/me/blackbook/{entry_id}Every API plan; app Free and upRemoves a blackbook entry.
sample response
{ok}GET /v1/me/watchlistAPI Pro and Business; app Free and upMy racing: the starred meetings and pinned races.
sample response
{venues, races}PUT /v1/me/watchlistAPI Pro and Business; app Free and upMerges my racing.
sample response
{venues, races}DELETE /v1/me/watchlist/{kind}/{item_id}Every API plan; app Free and upRemoves a star or a pin.
sample response
{ok}GET /v1/push/keyAPI Pro and Business; app Free and upThe web push key a browser subscribes with.
sample response
{key}PUT /v1/me/pushAPI Pro and Business; app Free and upA browser's push subscription under the key.
sample response
{ok}DELETE /v1/me/pushEvery API plan; app Free and upRemoves a browser's push subscription.
sample response
{ok}PUT /v1/me/apnsAPI Pro and Business; app Free and upA Mac's or iPhone's push token under the key.
sample response
{ok}DELETE /v1/me/apns/{token}Every API plan; app Free and upRemoves a device's push token.
sample response
{ok}POST /v1/me/relay/eventAPI Pro and Business; app Free and upA device tells the member's other devices something happened (an alert, a bet).
sample response
{ok}PUT /v1/me/relay/statusAPI Pro and Business; app Free and upA device says whether its auto bettors run.
sample response
{ok}GET /v1/me/relay/statusAPI Pro and Business; app Free and upEvery device's auto bettors, running or not.
sample response
{devices:[{device, running, at}]}DELETE /v1/me/relay/status/{device}Every API plan; app Free and upForgets a device.
sample response
{ok}POST /v1/me/relay/commandAPI Pro and Business; app Free and upSends a command to a device (stop every auto bettor).
sample response
{id}GET /v1/me/relay/commandsAPI Pro and Business; app Free and upThe commands waiting for a device.
sample response
{commands:[…]}POST /v1/me/relay/answerAPI Pro and Business; app Free and upA device answers a command it collected.
sample response
{ok}GET /v1/me/picks-alertsAPI Pro and Business; app Free and upWhether new picks are pushed to the key's browsers, and the filter.
sample response
{on, filter}PUT /v1/me/picks-alertsAPI Pro and Business; app ProTurns picks alerts on with a filter, or off.
sample response
{on, filter}GET /v1/me/remindersAPI Pro and Business; app Free and upRace reminders.
sample response
{reminders:[{race, minutes}]}PUT /v1/me/remindersAPI Pro and Business; app Free and upReplaces the race reminders.
sample response
{reminders}GET /v1/me/booksAPI Pro and BusinessEach 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.
sample response
{agent, agents:[device], books:[{book, name, loggedIn, state, balance, currency, reason, checkedAt, reportedAt, device}]}GET /v1/me/agentAPI Pro and BusinessWhether 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.
sample response
{connected, agents:[{device, name, platform, reportedAt, ageSeconds, loggedIn:[book]}]}POST /v1/me/bets/quoteAPI Pro and BusinessA 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.
sample response
{ok, agent, quote:{id, price, minStake, balance, quotedAt, expiresAt, …}} or {ok:false, failure:{code, message}}POST /v1/me/bets/confirmAPI Pro and BusinessPlaces 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.
sample response
{state: placed | rejected | unresolved | failed, bookBetID, acceptedPrice, stake, balance, agent, ledgerId, ledger}POST /v1/me/bets/placeplace_betAPI Pro and BusinessQuote 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).
sample response
{state, quote, bookBetID, acceptedPrice, stake, agent, ledgerId, ledger}GET /v1/me/bets/asks/{ask_id}API Pro and BusinessA placing command you queued and its answer once your agent posts one: the way back after a 504 or a dropped connection.
sample response
{askId, command, device, at, clientRef, answered, answer}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.
model_prices{
"name": "model_prices",
"arguments": {"key": "R:randwick:7:2026-09-26"}
}{
"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.
disagree{
"name": "disagree",
"arguments": {}
}{
"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.
nba_games{
"name": "nba_games",
"arguments": {"date": "2026-10-21"}
}{
"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.
nba_what_if{
"name": "nba_what_if",
"arguments": {"key": "B:nba:bos@det:2026-10-20", "changes": [{"person": 1628369, "set": "out"}]}
}{
"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.
nba_stats{
"name": "nba_stats",
"arguments": {"what": "player_series", "id": "1630595", "params": {"stat": "points", "line": 24.5}}
}{
"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.
nba_live_model{
"name": "nba_live_model",
"arguments": {"key": "B:nba:bos@det:2026-10-20"}
}{
"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_…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)
}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.
MarketMover