Carsales.com.au Scraper at a glance
Carsales.com.au Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes id, change type, title, make and model, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.50 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Ecommerce, Developer Tools, Automation
- Region
- Oceania
- Pricing
- $1.50 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 35 options
Scrape structured vehicle listings from Carsales.com.au from $1 per 1K results. Built to bypass the 20-page / 440-car search cap with deep filtering. Returns clean JSON with 30+ fields per listing, ideal for dealers, analysts, pricing tools, and real-time vehicle data pipelines.
What Carsales.com.au Scraper can do
- Two ways to find cars. Pick filters (make, model, body type, state, price, year, odometer, transmission, fuel type and more) or paste your own Carsales search URLs.
- 30+ named fields per listing, from every search result. Price, odometer, specs, transmission, fuel type, seller type, images and more, already structured, with no extra fetch needed.
- Optional detail page enrichment. Turn on Fetch full details to add the catalog description, seats, drivetrain, location (suburb and postcode), features list, dealer comments, seller phone, the seller ABN where the listing page publishes it, and a full specification dictionary.
- Goes past a single search's own limit. Carsales stops serving any one search after roughly 440 listings, however many it reports. Deep collection partitions a large search into price ranges (and states) and merges the results, recovering far more than one search alone can release.
- Resume or track a search over time. Continue one interrupted run without paying for listings you already collected, or turn on incremental mode to classify each listing as NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED on a recurring schedule.
- Send results straight into your apps. Optional MCP connectors pipe scraped listings into Notion, Linear, Airtable or Apify as soon as a run finishes.
Choose what to collect
These inputs let you configure Carsales.com.au Scraper - Bypass 440-Car Limit, 30+ Fields. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Choose how to find listings. Only fields belonging to the chosen mode are used. |
urlsarray | Carsales search URLs to scrape. Each URL is collected up to Maximum Pages or Maximum Listings. Ignored in Search mode. Example: https://www.carsales.com.au/cars/used/toyota/corolla/new-south-wales-state/ |
conditionstring | Vehicle condition (Search mode only). |
sellerTypestring | Dealer / Private / All (Search mode only). |
makestring | Manufacturer, e.g. Toyota, Ford, BMW. Leave empty for all makes. (Search mode only) |
modelstring | Model name, e.g. Corolla, Ranger, X5. Requires a Make. (Search mode only) |
bodyTypestring | Body shape (Search mode only). |
Show 28 more inputs
| Input | What it controls |
|---|---|
statestring | Australian state (Search mode only). |
transmissionstring | Gearbox (Search mode only). |
fuelTypestring | Fuel type (Search mode only). |
colourstring | Exterior colour, e.g. black, white, blue, silver, grey, red. (Search mode only) |
cylindersinteger | Engine cylinders (3, 4, 6, 8, 12). Search mode only. |
doorsinteger | Number of doors (2, 3, 4, 5). Search mode only. |
priceMininteger | Lower bound for price. Search mode only. Can be combined with Maximum price. |
priceMaxinteger | Upper bound for price. Search mode only. |
yearMininteger | Oldest model year. Search mode only. |
yearMaxinteger | Newest model year. Search mode only. |
odometerMininteger | Lower bound for kilometers. Search mode only. |
odometerMaxinteger | Upper bound for kilometers. Search mode only. |
postcodestring | 4-digit Australian postcode. Search mode only. |
radiusKminteger | Search radius around postcode. Ignored if Postcode is empty. |
sortBystring | Sort order (Search mode only; in URL mode the URL's sort is used). |
fetchDetailsboolean | Off by default. Each search result already includes the full listing record (price, odometer, specs, transmission, fuel, body, seller, images, ~38 fields), so this is rarely needed and is left off to keep runs fast. |
maxListingsinteger | Stop after scraping this many listings across the whole run. Leave empty to use the default of 30; maximum 100000. carsales only lets any one search hand out about 440 listings, however many matches it reports; to collect more than that, set this above 440 and keep 'Deep collection' on, and the actor covers the search across several price ranges. Larger targets run longer. |
expandPriceBandsboolean | On by default. carsales stops serving any single search after about 440 listings, no matter how many matches it reports. When your Maximum listings is above ~440, this covers the search across several price ranges (and states) and de-duplicates the results, recovering far more than one search can show. It only activates when you ask for more than one search can hand out, so smaller runs just page through a single search, which is faster and cheaper. Note: even with this on, a very large search (e.g. tens of thousands of matches) cannot be collected 100%; combine with make/model, state, or year filters for fuller coverage. |
maxPagesinteger | Maximum pages to read per search (or per price range when deep collection is on). About 30 listings on page 1 and 22 on each page after it, so ~20 pages covers everything one search will release. Raising it above 20 collects nothing extra from a single search. Hard cap in code: at most 20 pages are read per search when left empty. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large crawl of listings without returning or charging for listings already collected there. Use this after an interrupted run, or when continuing a listing pull in another run. For recurring monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for recurring monitoring of the same search. The first run returns all matching listings as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED listings. Turn on "Emit unchanged" or "Emit expired" only when you also want those listings returned (and billed). State is kept separately for each mode/filter combination; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the mode/filters, different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max listings/Max pages capped it, a page was blocked, or Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Incremental mode only. Field names that must NOT count as a change, so a listing that only differs in these fields stays UNCHANGED instead of UPDATED. Use top-level names (e.g. badges, images, imageCount) or dotted paths for nested fields (e.g. seller.name). Ignored fields are still returned in the output and are left out of changedFields. scrapedAt and the raw tracking blob are always ignored. Changing this list never causes a one-time wave of UPDATED rows. |
mcpConnectorsarray | 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). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
listingIdID (text)changeTypeChange Type (text)titleTitle (text)makeMake (text)modelModel (text)yearYear (number)pricePrice (number)odometerKm (number)bodyTypeBody (text)transmissionTrans. (text)stateState (text)urlURL (link)Show 18 more fields
sellerTypeSeller Type (text)sellerNameSeller Name (text)sellerPhonePhone (text)sellerAbnABN (text)suburbSuburb (text)postcodePostcode (text)imageCountPhotos (number)videoCountVideos (number)threeSixtyCount3D / 360 (number)imagesImage URLs (array)changedFieldsChanged Fields (array)firstSeenAtFirst Seen (text)lastSeenAtLast Seen (text)colorColour (text)publishDatePublished (text)specsSpecs (object)featuresFeatures (array)dealerCommentsDealer Comments (text)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"listingId": "OAG-AD-1234567",
"url": "https://www.carsales.com.au/cars/details/2022-toyota-corolla-ascent-sport-ze12r/OAG-AD-1234567/",
"title": "2022 Toyota Corolla Ascent Sport ZE12R",
"make": "Toyota",
"model": "Corolla",
"year": 2022,
"variant": "Ascent Sport",
"bodyType": "Hatch",
"transmission": "Automatic",
"engine": "4cyl 2.0L Petrol",
"fuelType": "Petrol",
"cylinders": 4,
"engineCapacity": "2.0L",
"odometer": 24500,
"odometerDisplay": "24,500 km",
"price": 28990,
"priceDisplay": "$28,990",
"currency": "AUD",
"condition": "Used",
"adType": "Dealer used",
"sellerType": "Dealer",
"sellerName": "Sample Motors",
"sellerPhone": "02 5550 1234",
"state": "NSW",
"suburb": "Parramatta",
"postcode": "2150",
"images": [
"https://www.carsales.com.au/img/sample-listing-1.jpg",
"https://www.carsales.com.au/img/sample-listing-2.jpg"
],
"imageCount": 21,
"videoCount": 1,
"threeSixtyCount": 0,
"badges": [
"Dealer used",
"Below market price"
],
"rankingType": "featured",
"color": "Silver",
"seats": 5,
"doors": 4,
"drivetrain": "FWD",
"scrapedAt": "2026-09-28T00:00:00.000Z"
}Ways to use this data
- Price intelligence: track asking prices for a specific make, model and year combination across states and watch trends over time.
- Dealer inventory monitoring: pull every listing from one dealer, or schedule a saved search and see only what changed since last time.
- Market research: compare fuel type mix, body style share, or odometer distribution across regions and price bands.
- Lead generation: collect seller type, phone numbers and, where the listing page publishes them, seller names and ABNs, from fresh listings with detail enrichment turned on.
- Data pipelines and AI agents: feed price, specification and condition fields into valuation or forecasting models, or pipe results into Notion, Airtable or Linear via MCP connectors.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Carsales.com.au Scraper return?
The documented output for Carsales.com.au Scraper includes id, change type, title, make, model, year, price and km. Availability of each field depends on the source page and the selected mode.
How much does Carsales.com.au Scraper cost?
It costs $1.50 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Repeated runs against the same search then return only NEW, UPDATED and REAPPEARED listings; turn on Emit unchanged or Emit expired if you also want those rows. State is tracked automatically per search scope, or name it yourself with State key.
Why did my filters seem to get ignored?
Search mode and URL mode are strictly separate. In Search mode, every filter field builds the search URL; in URL mode, the URLs field is used and every filter field is ignored, even if you filled them in. Make sure the mode you picked matches the fields you set. If you call the actor with mode=url and no urls (or clear the field), it scrapes https://www.carsales.com.au/cars/used/.
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 as soon as a run finishes.
