Sportsbet AU Scraper ๐ Sports Odds & Racing Prices
Pricing
from $1.40 / 1,000 odds rows
Sportsbet AU Scraper ๐ Sports Odds & Racing Prices
Scrape sportsbet.com.au odds: events, markets, selections and prices for AFL, NRL, soccer, cricket, tennis and more, plus horse, greyhound and harness racing with runners, jockeys, trainers, form and tote prices. Search by sport or race type, or paste page URLs.
Pricing
from $1.40 / 1,000 odds rows
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Features
Share
Sportsbet Australia Scraper: Sports Odds, Markets & Racing Prices
Sportsbet Australia Scraper turns sportsbet.com.au into clean, structured odds data. Pick a sport, a competition or a race day, or paste page links, and get one row per selection with the event, the market, the selection name and its win price. Racing rows add the track, race number, distance, track condition, weather, runner number, barrier draw, jockey, trainer, weight, recent form, sire, dam, age, sex and speed rating. Export to JSON, CSV or Excel, or pull results straight into your app through the API.
Why This Scraper?
- Every market, every selection. One row per runner or outcome with decimal win price, the fractional numerator and denominator, place price and price type, so a head to head, a line market and a premiership future all land in one schema.
- Full racing detail. Horse, greyhound and harness races with jockey, trainer, barrier, weight, last starts, pedigree, speed rating, recent price ticks and the race overview.
- Three ways in. Search by sport and competition, search a race day by code, region and track, or paste any supported page link.
- Precise filters. Matches or futures, Australia and New Zealand or international meetings, tracks, market names, minimum and maximum price and each-way markets only.
- Built for monitoring. Incremental mode returns only new and changed prices, with a price and availability scope, compact change rows and a grace period before a market is marked expired.
- One clear cap. Max items is the only default limit, so a run does exactly as much as you ask.
Use Cases
- Odds comparison and aggregation: pull Australian prices into your own comparison table, one stable schema across sports and racing.
- Betting models and research: build price histories and closing line datasets for AFL, NRL, soccer, tennis, cricket and racing.
- Racing analysis: join runner form, pedigree, barrier and weight data with live prices for ratings and value hunting.
- Price alerts and dashboards: schedule incremental runs and react to price moves, scratchings and market suspensions.
- Media and content teams: feed fixtures, markets and prices into previews, tipping pages and newsletters.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
recordType | selection (or event when market detail is off) |
rowId | 1000000:2000000:3000000 |
eventId / externalId | 1000000 / 2000000 |
name / displayName | Team A v Team B |
sport / classId / region | Australian Rules / 50 / Australia |
competitionId / competitionName | 4165 / AFL |
startTime / eventSort / numMarkets | 2027-03-20T09:30:00Z / MTCH / 40 |
status | PRICED |
participant1 / participant2 | Team A / Team B |
hasBIR / isLive / isFuture | true / false / false |
marketId / marketName | 3000000 / Head to Head |
marketType / marketSort / marketStatus | - / HH / A |
eachwayAvailable / numPlaces | true / 3 |
selectionId / selectionName | 4000000 / Team A |
winPrice / winPriceNum / winPriceDen | 1.9 / 900 / 1000 |
placePrice / priceCode | 1.45 / L |
trackName / raceType / raceNumber | Example Park / horse / 5 |
country / distance / isInternational | Australia / 1200 / false |
trackStatus / weather / runnerNumber / drawNumber | Good (4) / fine / 1 / 6 |
jockey / trainer | Jane Doe / John Roe |
weightGram / isOut / shortForm | 58500 / false / 1X23 |
oddsFluctuations | [7.5, 8, 7.5, 8.5] |
sire / dam / age / sex / speed | Sire Name (AUS) / Dam Name (AUS) / 5 / g / 100 |
url / scrapedAt | https://www.sportsbet.com.au/betting/australian-rules/afl/team-a-v-team-b-1000000 / 2026-11-03T00:00:00Z |
impliedProbability / priceRank / isFavourite | 0.5263 / 1 / true (worked out per market from the live prices) |
marketOverround / marketSelectionCount / priceMovePct | 1.0526 / 2 / -4.3 (price change in percent since the opening price, racing) |
side / selectionExternalId / marketExternalId | home / 5000000 / 6000000 |
runnerOverview / overviewProvider | Form note and expert comment on the runner (the advice shown on the race card) |
tipRank / tippedRunners / tipsProvider | 1 / the race's tipped runners in order / the tip source |
raceCommentary / raceClass / isFeatureRace / fieldSize | Race preview text, class, feature flag and number of runners still in |
scratchings / scratchedCount | Withdrawn runners with their price deductions |
raceResults / exoticResults / finishPosition / dividends | Placings, dividends and exotic payouts once the race has run |
careerRecord / distanceRecord / trackRecord / distanceTrackRecord | {"starts": 23, "wins": 3, "seconds": 2, "thirds": 2} |
goingRecords / firstUpRecord / secondUpRecord / seasonRecords | The same record by track condition, run since a spell, and season |
recentStarts | Up to 10 past runs, newest first: date, track, distance, place, runners, margin, jockey, barrier, starting price, class, time and condition |
awards / formFigures / prizeMoney / blinkers | Form badges such as "Likes the Wet", recent finishing figures, career prize money |
trainerLocation / runnerCountry / weightClaim / silkUrl / runnerFormUrl | Stable details of the runner |
bestTime / rating / speedTier / birthDate / sameBoxRecord | Greyhound only |
careerMileRate / daysSinceLastRun / runsSinceLastWin / speedMapX / speedMapY / barrierPosition | Harness only |
Extra fields: startTimeEpoch, handicap, selectionStatus, resultType, otherPrices (additional price types with their win and place price), colour, lastSixStarts, openPrice, expectedSettlingPosition, raceGrade, raceOverview, surface, tempo, winPercentage, placePercentage, dryRating, wetRating, multiplesKey, powerPlayPricing (alternative price boosts per price type), cashoutAvailable, liveStream and sameGameMultiEnabled.
Every row carries the same set of keys. Racing fields are empty on sports rows, and sports fields such as participant1 are empty on racing rows. With market detail off, each row is one event and the market and selection fields are empty. Pedigree and speed fields are filled for horse racing and are often empty for greyhound and harness racing, where the site does not publish them.
How to Use
- Pick a mode:
search(sports or racing with filters) orurl(paste page links). - Fill in the fields for that mode and decide whether to fetch the full market detail.
- Set Max items to control run size and cost, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it through the API.
AFL prices with all markets:
{"mode": "search","category": "sports","sports": ["Australian Rules"],"competitions": ["AFL"],"fetchDetails": true,"maxItems": 100}
Today's horse races, each-way markets only:
{"mode": "search","category": "racing","raceTypes": ["horse"],"raceDate": "today","raceRegion": "australia-nz","eachwayOnly": true,"maxItems": 200}
Paste page links:
{"mode": "url","urls": ["https://www.sportsbet.com.au/betting/soccer/australia/australian-a-league-men","https://www.sportsbet.com.au/racing-schedule/horse/today"],"maxItems": 100}
Recurring price monitoring:
{"mode": "search","category": "sports","sports": ["Rugby League"],"incrementalMode": true,"changeScope": "priceAndStock","compactUpdates": true,"maxItems": 500}
URL shapes. Query strings such as tracking parameters are ignored. The search fields are ignored in url mode.
| URL shape | What it reads |
|---|---|
https://www.sportsbet.com.au/ | the next races to go |
https://www.sportsbet.com.au/betting/australian-rules | every competition of a sport |
https://www.sportsbet.com.au/betting/australian-rules/afl | one competition |
https://www.sportsbet.com.au/betting/soccer/australia/australian-a-league-men | one competition under a region |
https://www.sportsbet.com.au/betting/australian-rules/afl/afl-premiership-winner-2027-10966930 | one event with all its markets |
https://www.sportsbet.com.au/betting/live-betting | events that are in play |
https://www.sportsbet.com.au/racing-schedule/horse/today | a race day (today, tomorrow or a date) |
https://www.sportsbet.com.au/results | a race day including resulted races |
https://www.sportsbet.com.au/horse-racing | today's horse races |
https://www.sportsbet.com.au/horse-racing/australia-nz/example-park/race-5-1000000 | one race |
https://app.sportsbet.com.au/ | the next races to go |
Leaving urls untouched in url mode reads one example of each supported page type. Max items is split evenly across the links.
Columns that do not apply to a row are left out instead of returned empty, so a sports row carries no racing columns and a horse row no greyhound ones. Sports pages publish no form history or tips; their rows add the price analysis fields.
Output views
The dataset has three views: Odds overview, Racing runners and Changes (incremental runs). The Output tab also links a run summary for multi-search runs.
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/sportsbet-au-scraper").call(run_input={"mode": "search", "category": "racing", "maxItems": 50})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row.get("trackName"), row.get("raceNumber"), row.get("selectionName"), row.get("winPrice"))
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/sportsbet-au-scraper').call({ mode: 'search', category: 'racing', maxItems: 50 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each row, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. If the picker is empty, you have not authorized a connector yet.
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search builds the lists from sports, competitions or racing; url reads pasted page links. |
category | string | sports | Search mode: sports lists events of the chosen sports and competitions, racing lists the races of a race day. |
sports | array | prefill only, ["Australian Rules"] | Sport names to cover, for example Soccer, Rugby League, Tennis. Sports search only. |
competitions | array | prefill only, ["AFL"] | Optional competition names or ids that narrow the sports. Sports search only. |
eventKind | string | all | all, matches or futures. Sports search only. |
raceTypes | array | ["horse"] | Racing codes to list: horse, greyhound, harness. Racing search only. |
raceDate | string | today | today, tomorrow or YYYY-MM-DD in Australian Eastern time. Racing search only. |
raceRegion | string | all | all, australia-nz or international. Racing search only. |
trackNames | array | (none) | Optional track names (partial match). Racing search only. |
upcomingOnly | boolean | true | Skip races that have already been run. Racing search only. |
marketNames | array | (none) | Only markets whose name contains one of these. Needs market detail. |
minOdds | number | (none) | Only selections at or above this decimal win price. Needs market detail. |
maxOdds | number | (none) | Only selections at or below this decimal win price. Needs market detail. |
eachwayOnly | boolean | false | Only each-way markets. Needs market detail. |
urls | array | one example of each supported page type (12 links, see URL shapes) | Pages to read. URL mode only; the search fields are ignored in this mode. |
fetchDetails | boolean | true | Fetch every event's full market list and emit one row per selection. Off emits one row per event. |
maxPages | integer | (none) | Optional safety stop on how many competition or race-day lists are read. Leave empty for unlimited; Max items remains the real cap. |
maxItems | integer | 20 | The run's single hard cap: maximum rows across all searches. Set 0 for unlimited. Callers that omit it get 20. |
proxy | object | prefill only, Apify Proxy with country AU | Connection settings. Residential is required and preselected. |
resumeFromRunId | string | empty | Continue an interrupted pull: rows already in that earlier run or dataset are skipped, not returned and not billed. |
incrementalMode | boolean | false | Recurring runs: return only NEW, UPDATED and REAPPEARED rows. Unchanged rows are not returned and not billed. |
stateKey | string | (none) | Incremental mode: name of the saved baseline. Empty derives it from the search settings. |
emitUnchanged | boolean | false | Incremental mode: also return unchanged rows (billed like any returned row). |
emitExpired | boolean | false | Incremental mode: return EXPIRED rows for rows no longer found, only after a complete scan. |
changeScope | string | all | Incremental mode: all compares every field, priceAndStock compares prices, status flags and other price types only. |
compactUpdates | boolean | false | Incremental mode: UPDATED and EXPIRED rows are slim, with priceChanges and variantChanges. |
expireAfterMissedScans | integer | 1 | Incremental mode: how many complete scans in a row must miss a row before it is marked EXPIRED. |
ignoreFieldsForChanges | array | (none) | Incremental mode: extra fields (dotted for nested) that never count as a change; they stay in the output. |
mcpConnectors | array | (none) | Optional: send a summary of each row to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Does not affect the dataset. |
Alternative input names are accepted for convenience: startUrls (urls), limit (maxItems) and proxyConfiguration (proxy).
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"recordType": "selection","rowId": "1000000:2000000:3000000","eventId": 1000000,"name": "R5 Example Handicap","displayName": "R5 Example Park","sport": "Horses - Aus/NZ","competitionName": "Example Park","region": "Australia","startTime": "2026-11-03T05:00:00Z","status": "PRICED","marketId": 2000000,"marketName": "Win or Place","eachwayAvailable": true,"numPlaces": 3,"selectionId": 3000000,"selectionName": "Example Runner","winPrice": 6.5,"winPriceNum": 11,"winPriceDen": 2,"placePrice": 1.88,"priceCode": "L","otherPrices": [{"priceCode": "NTP", "winPrice": 8.1, "placePrice": null}],"trackName": "Example Park","raceType": "horse","raceNumber": 5,"country": "Australia","distance": 1675,"trackStatus": "Good (4)","weather": "fine","runnerNumber": 1,"drawNumber": 6,"jockey": "Jane Doe","trainer": "John Roe","weightGram": 61500,"isOut": false,"shortForm": "0X0X","oddsFluctuations": [7.5, 8, 7.5, 8.5, 9],"sire": "Sire Name (AUS)","dam": "Dam Name (AUS)","age": 8,"sex": "G","speed": 0,"url": "https://www.sportsbet.com.au/horse-racing/australia-nz/example-park/race-5-1000000","scrapedAt": "2026-11-03T00:00:00Z"}
Plan Requirement
The site only serves Australian residential connections, so a paid Apify plan with residential proxy access (or your own Australian residential proxy URLs) is required; on a free plan the run fails with the message below instead of returning rows. Connection tuning (exit rotation, retries, a traffic budget for residential data) is built in and needs no settings. The run reads the connection that was actually granted and moves to a backup connection when the default is refused, without a blind retry loop.
What you see in the log and in the run status:
- When the selected connection is refused for your plan, the log prints "The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable." and, once a page is served that way, "Served over the backup connection (the default connection was unavailable)."
- If the account has no proxy access at all, the run fails with: "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required."
- If the backup connection could not load the pages either, the run fails with: "No results: residential proxies are unavailable on this run (Apify free plans do not include them), and the backup connection could not load the requested sportsbet.com.au pages."
- If every request failed for another reason, the run fails with: "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search."
A run that could not load any page always ends as failed with a message; it never reports an empty result.
FAQ
How much does it cost?
You pay a small fee once per run start, a per-row fee for every row pushed to the dataset (this includes EXPIRED and, when requested, unchanged rows; a genuinely empty search pushes no row), and a per-event market detail fee for every event whose full market list was fetched and returned rows. The Pricing tab on the actor page shows the current rates. Use Max items to cap the cost of any run, and note that one event can produce many rows, one per selection.
Can I get only price changes on a schedule?
Turn on Incremental changes. The first run saves a baseline per State key and returns every row as NEW; later runs return only NEW, UPDATED (with changedFields) and REAPPEARED rows. Set Change scope to price and availability only so that renamed events, weather notes and form changes never create a billable row, and turn on Compact updates for slim change rows with the old and new price. scrapedAt and oddsFluctuations are kept in the output but never count as a change. EXPIRED means a row was not in the scanned lists on enough complete scans in a row; it does not prove the market was closed, so read the status fields for that. A Max items or Max pages cut, a market, price or each-way filter, a resume or an early stop never expires anything.
How do I list only matches, or only futures?
Use Event kind in sports search. Matches are head to head games; futures are season-long and outright markets such as premiership winners.
Which sports and competitions can I use?
Any sport or competition listed on sportsbet.com.au. Type the names as shown on the site (for example Australian Rules, Rugby League, Soccer, AFL, NRL) or paste the sport or competition page in url mode.
Is it legal to scrape sportsbet.com.au?
This actor collects only publicly available odds and fixtures. You are responsible for how you use the data: follow the site's terms and the laws that apply to you, including gambling and advertising rules, and get legal advice if you plan commercial redistribution.
Why did my run fail instead of returning an empty dataset?
Two different situations both fail the run rather than report a false result. In url mode, if none of the pasted links are recognisable sportsbet.com.au pages, the run fails once the pasted links have been checked, before any page is scraped, because that is a problem with the input. Separately, if every request is refused, the run fails with a connection message instead of claiming nothing matched. A genuinely empty selection, where the site was reached but nothing matched, still succeeds with an empty dataset and a status message.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
๐ Want more sports data?
Pair this actor with these related scrapers from the same team:
| โฝ SofaScore Scraper โฝ Live Scores, Stats, Players & Odds Pull structured sports data from SofaScore across football, basketball, tennis, and 20+... | โฝ Sportsbook Odds Scraper (1xBet, Melbet, Linebet, Paripulse) Collect live and prematch betting odds from 1xBet, Melbet, Linebet and Paripulse. Give it... |
| โฝ FotMob Scraper โฝ Match Details, Stats, Lineups & Players Pull structured football data from FotMob: match details with scores, team stats, events... | โฝ OneFootball Scraper Scrape public OneFootball data including football news, upcoming fixtures, match results... |
| โฝ Globo Esporte Scraper Scrape public sports content from ge.globo.com, including news, videos, matches and feed... | โฝ JioHotstar Scraper Scrape the JioHotstar catalog by content type or URL. Extract shows, movies, episodes... |
๐ Browse all abotapi scrapers
๐ฌ Support
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
- โญ Enjoying it? A quick review on the actor page helps other users find it.