Carsales.com.au Scraper - Bypass 440-Car Limit, 30+ Fields
Pricing
from $1.00 / 1,000 results
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
Maintained by CommunityActor stats
3
Bookmarked
35
Total users
2
Monthly active users
8 days ago
Last modified
Categories
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.
| Field | Example |
|---|---|
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 / odometerDisplay | 24500 / "24,500 km" |
price / priceDisplay / currency | 28990 / "$28,990" / "AUD" |
condition / adType / sellerType | "Used" / "Dealer used" / "Dealer" |
state | "NSW" |
images / imageCount | array of photo URLs / 21 |
videoCount / threeSixtyCount | 1 / 0 |
badges / rankingType | ["Dealer used", "Below market price"] / "featured" |
sellerName / sellerPhone / sellerAbn | detail mode only: "Sample Motors" / "02 5550 1234" / "12345678901" |
suburb / postcode | detail mode only: "Parramatta" / "2150" |
vin / stockNumber / color | detail mode only: "1HGCM82633A004352" / "ST1029" / "Silver" |
description / dealerComments / features | detail mode only: catalog blurb / dealer write up / equipment list |
seats / doors / drivetrain / comparisonRate | detail mode only: 5 / 4 / "Front Wheel Drive" / "6.90% p.a." |
specs | detail mode only: full specification dictionary from the listing page |
scrapedAt | "2026-09-28T00:00:00.000Z" |
changeType / changedFields / firstSeenAt / lastSeenAt | incremental mode only: "UPDATED" / ["price"] / timestamps |
How to Use
- Pick a mode:
search(build a query from filters) orurl(paste your own Carsales search links). - Fill in the fields for that mode. Filter fields are ignored in URL mode, and the URLs field is ignored in Search mode.
- Set Maximum listings and Maximum pages to control run size and cost, then click Start.
- 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 ApifyClientclient = 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 asNEW; later runs return onlyNEW,UPDATEDandREAPPEAREDlistings by default. Turn on Emit unchanged or Emit expired if you also want those rows back, both are billed extra.EXPIREDrows 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.
- 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 (build a query from filters) or url (paste your own links). |
urls | array | none (sample prefilled) | Carsales search URLs to scrape. URL mode only; ignored in Search mode. |
condition | string | used | Vehicle condition: all, new, used or demo. Search mode only. |
sellerType | string | all | Seller type: all, dealer or private. Search mode only. |
make | string | none | Manufacturer, e.g. Toyota. Search mode only. |
model | string | none | Model name, e.g. Corolla. Requires Make. Search mode only. |
bodyType | string | none (Any) | Body shape, e.g. suv, sedan, hatch. Search mode only. |
state | string | none (All Australia) | Australian state: nsw, vic, qld, sa, wa, tas, act or nt. Search mode only. |
transmission | string | none (Any) | automatic or manual. Search mode only. |
fuelType | string | none (Any) | Fuel type, e.g. petrol, diesel, hybrid, electric. Search mode only. |
colour | string | none | Exterior colour, e.g. black, white, silver. Search mode only. |
cylinders | integer | none | Engine cylinders, e.g. 3, 4, 6, 8 or 12. Search mode only. |
doors | integer | none | Number of doors (1 to 10). Search mode only. |
priceMin | integer | none | Lower price bound (AUD). Search mode only. |
priceMax | integer | none | Upper price bound (AUD). Search mode only. |
yearMin | integer | none | Oldest model year. Search mode only. |
yearMax | integer | none | Newest model year. Search mode only. |
odometerMin | integer | none | Lower odometer bound (km). Search mode only. |
odometerMax | integer | none | Upper odometer bound (km). Search mode only. |
postcode | string | none | 4 digit Australian postcode. Search mode only. |
radiusKm | integer | none | Search radius around Postcode. Ignored if Postcode is empty. |
sortBy | string | featured | Sort 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. |
fetchDetails | boolean | false | Fetch 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. |
maxListings | integer | 30 | Stop after scraping this many listings across the whole run. |
expandPriceBands | boolean | true | Partition a large search across price ranges (and states) once Maximum listings exceeds one search's own ~440 limit. |
maxPages | integer | 20 | Maximum pages to read per search, or per price range when deep collection is on. |
resumeFromRunId | string | none | Continue ONE previous interrupted run without re-collecting or re-charging its listings. |
incrementalMode | boolean | false | Track the same search across scheduled runs and classify each listing as NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED. |
stateKey | string | none | Name or share an incremental mode monitoring baseline. Leave empty to derive one automatically. |
emitUnchanged | boolean | false | Also return (and bill) listings unchanged since the last incremental run. |
emitExpired | boolean | false | Also return (and bill) listings no longer found, only after a fully scanned incremental run. |
proxyConfiguration | object | none 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. |
mcpConnectors | array | none | Optional: send a summary of each record 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. |
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.
Is it legal to scrape Carsales?
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.