# Sportsbet AU Scraper 🏅 Sports Odds & Racing Prices (`abotapi/sportsbet-au-scraper`) Actor

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.

- **URL**: https://apify.com/abotapi/sportsbet-au-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 odds rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 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

1. Pick a **mode**: `search` (sports or racing with filters) or `url` (paste page links).
2. Fill in the fields for that mode and decide whether to fetch the full market detail.
3. Set **Max items** to control run size and cost, then click **Start**.
4. Download the dataset as JSON, CSV or Excel, or read it through the API.

**AFL prices with all markets:**

```json
{
  "mode": "search",
  "category": "sports",
  "sports": ["Australian Rules"],
  "competitions": ["AFL"],
  "fetchDetails": true,
  "maxItems": 100
}
```

**Today's horse races, each-way markets only:**

```json
{
  "mode": "search",
  "category": "racing",
  "raceTypes": ["horse"],
  "raceDate": "today",
  "raceRegion": "australia-nz",
  "eachwayOnly": true,
  "maxItems": 200
}
```

**Paste page links:**

```json
{
  "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:**

```json
{
  "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:

```python
from apify_client import ApifyClient

client = 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:

```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**.

1. Authorize a connector once under **Apify, Settings, Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. If the picker is empty, you have not authorized a connector yet.
3. For **Notion**, also set `notionParentPageUrl` to 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.

```json
{
  "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:

<table>
<tr><td>⚽ <a href="https://apify.com/abotapi/sofascore-scraper"><b>SofaScore Scraper ⚽ Live Scores, Stats, Players &amp; Odds</b></a><br>Pull structured sports data from SofaScore across football, basketball, tennis, and 20+...</td><td>⚽ <a href="https://apify.com/abotapi/sportsbook-odds-scraper"><b>Sportsbook Odds Scraper (1xBet, Melbet, Linebet, Paripulse)</b></a><br>Collect live and prematch betting odds from 1xBet, Melbet, Linebet and Paripulse. Give it...</td></tr>
<tr><td>⚽ <a href="https://apify.com/abotapi/fotmob-scraper"><b>FotMob Scraper ⚽ Match Details, Stats, Lineups &amp; Players</b></a><br>Pull structured football data from FotMob: match details with scores, team stats, events...</td><td>⚽ <a href="https://apify.com/abotapi/onefootball-com-scraper"><b>OneFootball Scraper</b></a><br>Scrape public OneFootball data including football news, upcoming fixtures, match results...</td></tr>
<tr><td>⚽ <a href="https://apify.com/abotapi/globo-ge"><b>Globo Esporte Scraper</b></a><br>Scrape public sports content from ge.globo.com, including news, videos, matches and feed...</td><td>⚽ <a href="https://apify.com/abotapi/hotstar-com-scraper"><b>JioHotstar Scraper</b></a><br>Scrape the JioHotstar catalog by content type or URL. Extract shows, movies, episodes...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/sportsbet-au-scraper/issues/open). 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.

# Actor input Schema

## `mode` (type: `string`):

search = pick sports, competitions or racing and let the actor build the lists. url = paste sportsbet.com.au pages (sport, competition, event, race or racing schedule links).

## `category` (type: `string`):

Sports lists events for the sports and competitions below. Racing lists the races of a race day. Only applies when mode = search.

## `sports` (type: `array`):

Sport names to cover, e.g. Australian Rules, Soccer, Rugby League, Tennis, Cricket, Basketball - US. Leave empty and name competitions instead to search by competition only. Only applies when mode = search and What to search = Sports betting.

## `competitions` (type: `array`):

Optional competition names or ids that narrow the sports above, e.g. AFL, NRL, English Premier League, 4165. Leave empty for every competition of the chosen sports. Only applies when mode = search and What to search = Sports betting.

## `eventKind` (type: `string`):

Matches are head-to-head games. Futures are season-long and outright markets such as premiership winners. Only applies in sports search.

## `raceTypes` (type: `array`):

Which racing codes to list. Only applies when mode = search and What to search = Racing.

## `raceDate` (type: `string`):

today, tomorrow or a date as YYYY-MM-DD (Australian Eastern time). Only applies when mode = search and What to search = Racing.

## `raceRegion` (type: `string`):

Limit racing to Australia and New Zealand meetings or to international meetings. Only applies in racing search.

## `trackNames` (type: `array`):

Optional track names (partial match), e.g. Flemington, Randwick. Leave empty for every track. Only applies in racing search.

## `upcomingOnly` (type: `boolean`):

Skip races that have already been run. Turn off to include resulted races. Only applies in racing search.

## `marketNames` (type: `array`):

Optional market name filter (partial match), e.g. Head to Head, Line, Win or Place. Only markets whose name contains one of these are returned. Applies to every mode when market detail is on.

## `minOdds` (type: `number`):

Only return selections priced at or above this decimal win price, e.g. 2.5. Applies to every mode when market detail is on.

## `maxOdds` (type: `number`):

Only return selections priced at or below this decimal win price, e.g. 10. Applies to every mode when market detail is on.

## `eachwayOnly` (type: `boolean`):

Only return selections from markets that offer each-way betting. Applies to every mode when market detail is on.

## `urls` (type: `array`):

Paste one or more sportsbet.com.au pages: the home page, a sport (/betting/australian-rules), a competition (/betting/australian-rules/afl), an event, a race, the live betting page, the racing schedule or the results page. Several URLs are supported. The search fields above are ignored in this mode. Left untouched, URL mode scrapes one example of each supported page type.

## `fetchDetails` (type: `boolean`):

Fetch every event's full market list and emit one row per selection (runner or outcome) with prices, handicaps and, for racing, jockey, trainer, form, pedigree and track details. Turn off to emit one lighter row per event.

## `maxPages` (type: `integer`):

Optional safety stop on how many competition or race-day lists to read in total. This does NOT cap the run: leave it empty for unlimited pages and the run is bounded solely by Max items.

## `maxItems` (type: `integer`):

The run's single hard cap: maximum rows across all searches. Defaults to 20 (also when the field is omitted through the API). Set 0 for unlimited. This is the only default limit; Max pages is unlimited by default and defers to this.

## `proxy` (type: `object`):

Connection used for requests. Residential proxies are required for this site and are preselected; keep the preselected country. Datacenter proxies are not accepted by the site.

## `resumeFromRunId` (type: `string`):

Paste a previous run ID or dataset ID to continue a large pull without returning or charging for rows already collected there. For recurring monitoring of the same search, use Incremental changes below instead.

## `incrementalMode` (type: `boolean`):

For recurring runs, return only NEW, UPDATED and REAPPEARED rows; rows unchanged since the last run are not returned or billed. Each row is compared on every field except the scrape time and the recent price tick list (oddsFluctuations), which stay in the output but never count as a change; with Change scope set to price and availability only, the comparison is limited to prices, status flags and other price types. Each row gets changeType, changedFields, firstSeenAt and lastSeenAt; outside incremental mode these four fields are empty. The baseline is kept per State key; changing the search settings starts a new baseline unless State key is set.

## `stateKey` (type: `string`):

Incremental mode only. Optional name for this campaign's saved baseline. Leave empty to derive it from the search settings, so each distinct search keeps its own baseline.

## `emitUnchanged` (type: `boolean`):

Incremental mode only. Also return (and bill as normal rows) rows whose values did not change.

## `emitExpired` (type: `boolean`):

Incremental mode only. Return an EXPIRED row for rows no longer found after Expire after missed scans complete scans (billed like any returned row). EXPIRED means the row was not in the scanned lists; it does not prove the market was closed, so read the status fields for that. Only after a complete scan: a Max items or Max pages cut, a row filter, a resume, an early stop or a failed fetch disables it.

## `changeScope` (type: `string`):

Incremental mode only. All fields compares every field. Price and availability only compares just the prices, status flags and other price types, so a renamed event or a changed weather note never creates a billable row.

## `compactUpdates` (type: `boolean`):

Incremental mode only. UPDATED and EXPIRED rows become slim: identifiers, link, current prices and status, plus priceChanges (old and new value) and variantChanges (other price types). NEW rows stay complete.

## `expireAfterMissedScans` (type: `integer`):

Incremental mode only, with Emit expired. A row is marked EXPIRED only after being absent from this many complete scans in a row. Raise it so a market that briefly drops from the list is not expired.

## `ignoreFieldsForChanges` (type: `array`):

Incremental mode only. Extra field names (dotted for nested, e.g. otherPrices.placePrice) that never mark a row as UPDATED and are left out of changedFields; they stay in the output. oddsFluctuations and scrapedAt are always ignored.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "category": "sports",
  "sports": [
    "Australian Rules"
  ],
  "competitions": [
    "AFL"
  ],
  "eventKind": "all",
  "raceTypes": [
    "horse"
  ],
  "raceDate": "today",
  "raceRegion": "all",
  "upcomingOnly": true,
  "eachwayOnly": false,
  "urls": [
    "https://www.sportsbet.com.au/",
    "https://www.sportsbet.com.au/betting/australian-rules",
    "https://www.sportsbet.com.au/betting/australian-rules/afl",
    "https://www.sportsbet.com.au/betting/soccer/australia/australian-a-league-men",
    "https://www.sportsbet.com.au/betting/australian-rules/afl/afl-premiership-winner-2027-10966930",
    "https://www.sportsbet.com.au/betting/live-betting",
    "https://www.sportsbet.com.au/racing-schedule/horse/today",
    "https://www.sportsbet.com.au/results",
    "https://www.sportsbet.com.au/betting/australian-rules/afl?utm_source=x&action=y",
    "https://www.sportsbet.com.au/horse-racing",
    "https://www.sportsbet.com.au/horse-racing/international/funabashi/race-11-11123076",
    "https://app.sportsbet.com.au/"
  ],
  "fetchDetails": true,
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "changeScope": "all",
  "compactUpdates": false,
  "expireAfterMissedScans": 1,
  "ignoreFieldsForChanges": [],
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `racing` (type: `string`):

No description

## `analysis` (type: `string`):

No description

## `changes` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "search",
    "sports": [
        "Australian Rules"
    ],
    "competitions": [
        "AFL"
    ],
    "raceTypes": [
        "horse"
    ],
    "urls": [
        "https://www.sportsbet.com.au/",
        "https://www.sportsbet.com.au/betting/australian-rules",
        "https://www.sportsbet.com.au/betting/australian-rules/afl",
        "https://www.sportsbet.com.au/betting/soccer/australia/australian-a-league-men",
        "https://www.sportsbet.com.au/betting/australian-rules/afl/afl-premiership-winner-2027-10966930",
        "https://www.sportsbet.com.au/betting/live-betting",
        "https://www.sportsbet.com.au/racing-schedule/horse/today",
        "https://www.sportsbet.com.au/results",
        "https://www.sportsbet.com.au/betting/australian-rules/afl?utm_source=x&action=y",
        "https://www.sportsbet.com.au/horse-racing",
        "https://www.sportsbet.com.au/horse-racing/international/funabashi/race-11-11123076",
        "https://app.sportsbet.com.au/"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AU"
    },
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false,
    "compactUpdates": false,
    "ignoreFieldsForChanges": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/sportsbet-au-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "search",
    "sports": ["Australian Rules"],
    "competitions": ["AFL"],
    "raceTypes": ["horse"],
    "urls": [
        "https://www.sportsbet.com.au/",
        "https://www.sportsbet.com.au/betting/australian-rules",
        "https://www.sportsbet.com.au/betting/australian-rules/afl",
        "https://www.sportsbet.com.au/betting/soccer/australia/australian-a-league-men",
        "https://www.sportsbet.com.au/betting/australian-rules/afl/afl-premiership-winner-2027-10966930",
        "https://www.sportsbet.com.au/betting/live-betting",
        "https://www.sportsbet.com.au/racing-schedule/horse/today",
        "https://www.sportsbet.com.au/results",
        "https://www.sportsbet.com.au/betting/australian-rules/afl?utm_source=x&action=y",
        "https://www.sportsbet.com.au/horse-racing",
        "https://www.sportsbet.com.au/horse-racing/international/funabashi/race-11-11123076",
        "https://app.sportsbet.com.au/",
    ],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AU",
    },
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
    "compactUpdates": False,
    "ignoreFieldsForChanges": [],
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/sportsbet-au-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search",
  "sports": [
    "Australian Rules"
  ],
  "competitions": [
    "AFL"
  ],
  "raceTypes": [
    "horse"
  ],
  "urls": [
    "https://www.sportsbet.com.au/",
    "https://www.sportsbet.com.au/betting/australian-rules",
    "https://www.sportsbet.com.au/betting/australian-rules/afl",
    "https://www.sportsbet.com.au/betting/soccer/australia/australian-a-league-men",
    "https://www.sportsbet.com.au/betting/australian-rules/afl/afl-premiership-winner-2027-10966930",
    "https://www.sportsbet.com.au/betting/live-betting",
    "https://www.sportsbet.com.au/racing-schedule/horse/today",
    "https://www.sportsbet.com.au/results",
    "https://www.sportsbet.com.au/betting/australian-rules/afl?utm_source=x&action=y",
    "https://www.sportsbet.com.au/horse-racing",
    "https://www.sportsbet.com.au/horse-racing/international/funabashi/race-11-11123076",
    "https://app.sportsbet.com.au/"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "compactUpdates": false,
  "ignoreFieldsForChanges": []
}' |
apify call abotapi/sportsbet-au-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/sportsbet-au-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/6xmxXrfxgaSjEzvUp/builds/cYebUZZuoZ5iacJ4p/openapi.json
