Carsales.com.au Scraper - Bypass 440-Car Limit, 30+ Fields avatar

Carsales.com.au Scraper - Bypass 440-Car Limit, 30+ Fields

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Carsales.com.au Scraper - Bypass 440-Car Limit, 30+ Fields

Carsales.com.au Scraper - Bypass 440-Car Limit, 30+ Fields

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.

Pricing

from $1.00 / 1,000 results

Rating

5.0

(1)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

3

Bookmarked

35

Total users

2

Monthly active users

8 days ago

Last modified

Share

Carsales Scraper: Vehicle Listings, Prices and Seller Details

Carsales Scraper turns Carsales, Australia's largest car marketplace, into structured vehicle data. Search by make, model, body type, state, price, year or odometer, or paste your own Carsales search links, and get back 30+ named fields per listing: price, odometer, specs, transmission, fuel type, seller details and photos. Turn on detail page enrichment for VIN, features and dealer comments, then export to JSON, CSV or Excel, or pull the results straight through the API.

Why This Scraper?

  • 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 VIN, stock number, features list, dealer comments, seller phone, ABN 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.
  • Clear about what it could not read. A blocked page, a capped budget, or a proxy tier that Carsales rejects is called out plainly in the log rather than passed off as a clean empty result.
  • Send results straight into your apps. Optional MCP connectors pipe scraped listings into Notion, Linear, Airtable or Apify as soon as a run finishes.

Use Cases

  • 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 names, phone numbers 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.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
listingId"OAG-AD-1234567"
url"https://www.carsales.com.au/cars/details/2022-toyota-corolla-ascent-sport/OAG-AD-1234567/"
title"2022 Toyota Corolla Ascent Sport ZE12R"
make / model / year"Toyota" / "Corolla" / 2022
variant"Ascent Sport"
bodyType / transmission / fuelType"Hatch" / "Automatic" / "Petrol"
engine / cylinders / engineCapacity"4cyl 2.0L Petrol" / 4 / "2.0L"
odometer / odometerDisplay24500 / "24,500 km"
price / priceDisplay / currency28990 / "$28,990" / "AUD"
condition / adType / sellerType"Used" / "Dealer used" / "Dealer"
state"NSW"
images / imageCountarray of photo URLs / 21
videoCount / threeSixtyCount1 / 0
badges / rankingType["Dealer used", "Below market price"] / "featured"
sellerName / sellerPhone / sellerAbndetail mode only: "Sample Motors" / "02 5550 1234" / "12345678901"
suburb / postcodedetail mode only: "Parramatta" / "2150"
vin / stockNumber / colordetail mode only: "1HGCM82633A004352" / "ST1029" / "Silver"
description / dealerComments / featuresdetail mode only: catalog blurb / dealer write up / equipment list
seats / doors / drivetrain / comparisonRatedetail mode only: 5 / 4 / "Front Wheel Drive" / "6.90% p.a."
specsdetail mode only: full specification dictionary from the listing page
scrapedAt"2026-09-28T00:00:00.000Z"
changeType / changedFields / firstSeenAt / lastSeenAtincremental mode only: "UPDATED" / ["price"] / timestamps

How to Use

  1. Pick a mode: search (build a query from filters) or url (paste your own Carsales search links).
  2. Fill in the fields for that mode. Filter fields are ignored in URL mode, and the URLs field is ignored in Search mode.
  3. Set Maximum listings and Maximum pages to control run size and cost, then click Start.
  4. Download the dataset as JSON, CSV or Excel, or read it through the API.

Search for used Toyota Corollas in NSW, cheapest first:

{
"mode": "search",
"condition": "used",
"make": "Toyota",
"model": "Corolla",
"state": "nsw",
"priceMax": 30000,
"sortBy": "price-asc",
"maxListings": 50
}

Paste a Carsales search URL directly:

{
"mode": "url",
"urls": [
"https://www.carsales.com.au/cars/used/toyota/corolla/new-south-wales-state/"
],
"maxListings": 100
}

Collect a large search beyond one search's own limit:

{
"mode": "search",
"make": "Ford",
"model": "Ranger",
"maxListings": 2000,
"expandPriceBands": true,
"maxPages": 20
}

Track a saved search on a schedule, only new and changed listings:

{
"mode": "search",
"make": "BMW",
"model": "X5",
"state": "vic",
"incrementalMode": true,
"emitExpired": true
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/carsales-au-scraper").call(run_input={
"mode": "search", "make": "Toyota", "model": "Corolla", "state": "nsw", "maxListings": 50
})
for car in client.dataset(run["defaultDatasetId"]).iterate_items():
print(car["title"], car["price"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/carsales-au-scraper').call({
mode: 'search', make: 'Toyota', model: 'Corolla', state: 'nsw', maxListings: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Collecting more than one search's own limit

A single Carsales search releases at most about 440 listings, however many matches it reports. Deep collection (the expandPriceBands toggle, on by default) only engages once Maximum listings is set above that ceiling: it then partitions the same search into a series of price ranges aligned to Carsales' own price steps, and, in Search mode with no State chosen, crosses those ranges with every state, so the combined result covers far more than one search alone. Each range is checked before its listings are kept, and duplicates are removed automatically. Even with this on, an extremely broad search (tens of thousands of matches) cannot be captured completely; narrowing with make, model, state or year still helps.

Resume and recurring updates

  • Resume from a previous run (resumeFromRunId) continues ONE specific interrupted run: paste its run or dataset ID and this run skips every listing already saved there, so you are not charged twice.
  • Incremental mode (incrementalMode) is for scheduling the SAME search again and again. The first run returns everything as NEW; later runs return only NEW, UPDATED and REAPPEARED listings by default. Turn on Emit unchanged or Emit expired if you also want those rows back, both are billed extra. EXPIRED rows are only produced once a run has proven it scanned the tracked search fully, never after a page cap, a blocked page, or a resumed run. Use State key to name or share a monitoring baseline, or leave it empty and the actor derives one automatically from your mode and filters.

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 record, 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

ParameterTypeDefaultDescription
modestringsearchsearch (build a query from filters) or url (paste your own links).
urlsarraynone (sample prefilled)Carsales search URLs to scrape. URL mode only; ignored in Search mode.
conditionstringusedVehicle condition: all, new, used or demo. Search mode only.
sellerTypestringallSeller type: all, dealer or private. Search mode only.
makestringnoneManufacturer, e.g. Toyota. Search mode only.
modelstringnoneModel name, e.g. Corolla. Requires Make. Search mode only.
bodyTypestringnone (Any)Body shape, e.g. suv, sedan, hatch. Search mode only.
statestringnone (All Australia)Australian state: nsw, vic, qld, sa, wa, tas, act or nt. Search mode only.
transmissionstringnone (Any)automatic or manual. Search mode only.
fuelTypestringnone (Any)Fuel type, e.g. petrol, diesel, hybrid, electric. Search mode only.
colourstringnoneExterior colour, e.g. black, white, silver. Search mode only.
cylindersintegernoneEngine cylinders, e.g. 3, 4, 6, 8 or 12. Search mode only.
doorsintegernoneNumber of doors (1 to 10). Search mode only.
priceMinintegernoneLower price bound (AUD). Search mode only.
priceMaxintegernoneUpper price bound (AUD). Search mode only.
yearMinintegernoneOldest model year. Search mode only.
yearMaxintegernoneNewest model year. Search mode only.
odometerMinintegernoneLower odometer bound (km). Search mode only.
odometerMaxintegernoneUpper odometer bound (km). Search mode only.
postcodestringnone4 digit Australian postcode. Search mode only.
radiusKmintegernoneSearch radius around Postcode. Ignored if Postcode is empty.
sortBystringfeaturedSort order: featured, price-asc, price-desc, km-asc, km-desc, year-desc or year-asc. Search mode only; in URL mode the URL's own sort is used.
fetchDetailsbooleanfalseFetch each listing's detail page for extra fields (VIN, features, dealer comments, seller phone, and more). Off by default because search results already carry the core fields.
maxListingsinteger30Stop after scraping this many listings across the whole run.
expandPriceBandsbooleantruePartition a large search across price ranges (and states) once Maximum listings exceeds one search's own ~440 limit.
maxPagesinteger20Maximum pages to read per search, or per price range when deep collection is on.
resumeFromRunIdstringnoneContinue ONE previous interrupted run without re-collecting or re-charging its listings.
incrementalModebooleanfalseTrack the same search across scheduled runs and classify each listing as NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED.
stateKeystringnoneName or share an incremental mode monitoring baseline. Leave empty to derive one automatically.
emitUnchangedbooleanfalseAlso return (and bill) listings unchanged since the last incremental run.
emitExpiredbooleanfalseAlso return (and bill) listings no longer found, only after a fully scanned incremental run.
proxyConfigurationobjectnone declared (RESIDENTIAL prefilled)Connection settings. The input editor prefills Apify Proxy with the RESIDENTIAL group, and the actor itself falls back to RESIDENTIAL even if this is left empty.
mcpConnectorsarraynoneOptional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstringnoneNotion connector only: page under which item pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run. Does not affect the dataset.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"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",
"vin": "1HGCM82633A004352",
"stockNumber": "ST1029",
"color": "Silver",
"seats": 5,
"doors": 4,
"drivetrain": "Front Wheel Drive",
"comparisonRate": "6.90% p.a.",
"scrapedAt": "2026-09-28T00:00:00.000Z"
}

Plan Requirement

This actor requires Apify's residential proxy option, selected by default in the Proxy input. Datacenter and other non residential proxy groups are rejected by carsales.com.au and return zero listings. If residential proxy is not available in your current setup, supply your own residential proxy URLs in the Proxy input instead. No other plan requirement applies; usage is billed per the Pricing tab.

FAQ

How much does it cost?

You pay per listing returned, plus an extra per listing charge when detail page enrichment (fetchDetails) is switched on. The Pricing tab shows current rates. Use Maximum listings to cap the size and cost of any run.

This actor collects only publicly available vehicle listing data from Carsales, Australia's largest car marketplace. You are responsible for how you use it: follow Carsales' terms and the laws that apply to you, and get legal advice before any commercial redistribution. Seller supplied photos, text and dealer branding may carry their own rights.

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.

Why does a run fail instead of returning an empty dataset?

A run fails outright when Resume from a previous run points at a run or dataset your account cannot read, when it is combined with Incremental mode on a search that already has saved incremental state, or when no usable proxy configuration can be built at all. A run instead succeeds with zero or few listings when a search genuinely matches nothing, or when every request on your available proxy is refused. That case is stated plainly in the log rather than left to look like a clean empty search.

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.

πŸ”— Want more car data?

Pair this actor with these related scrapers from the same team:

πŸš— EasyAuto123 Scraper
Scrape EasyAuto123 vehicle listings into clean structured data. Extract prices, VINs...
🏷️ Gumtree AU Scraper
Scrape gumtree.com.au classifieds across every vertical: for-sale goods, motors, real...
πŸš— Cars.com Scraper
Scrape cars.com listings by make, ZIP and radius. 90+ fields per car: price, MSRP...
πŸš— AutoScout24 Scraper
From $0.8/1K. A lean, production-grade scraper for autoscout24.com. Point it at a search...
πŸš— mobile.de
From $0.8/1K. Scrape mobile.de vehicle listings with 30+ structured fields including...
πŸš— Turo Scraper
Collect Turo vehicles by location and trip dates or listing URLs. Get make, model, year...

πŸ‘‰ Browse all abotapi scrapers

πŸ’¬ Support & custom scrapers

  • 🐞 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 abotapi@proton.me or message Telegram @abotapi.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.