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
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
3
Bookmarked
36
Total users
2
Monthly active users
4 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, 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.
- 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 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.
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; name and ABN appear only when the listing page publishes them, the phone on most dealer listings: "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 |
publishDate / saleStatus / pageType | detail mode only: "2013-01-22T23:01:11" / "for sale" / "dealer" |
latestStock / clearance / buyHomePremium / promoteListing / isDealerBranding | detail mode only: true or false flags the listing page publishes; left out when the page does not carry them |
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. Use Ignore fields when detecting changes to stop noisy fields (for examplebadgesorimages) from turning a listing intoUPDATED;scrapedAtand the raw tracking data are always ignored. Price-change tracking: an asking-price change makes the listingUPDATEDwithpriceinchangedFields(no separate switch is needed). There is no time-window option; the baseline is the previous run under the same State key, so schedule the run at the cadence you want to compare. If you are coming from other carsales actors,maxListingsis the item cap and Deep collection (expandPriceBands) is the equivalent of turning price splitting on.
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 | https://www.carsales.com.au/cars/used/ | 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. Leave empty to use the default of 30; maximum 100000. |
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. |
ignoreFieldsForChanges | string[] | none | Incremental mode only: field names (or dotted paths like seller.name) that never count as a change. They stay in the output but are left out of changedFields. |
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
Carsales protects every page with an anti-bot interstitial. In our measurements plain requests were refused on the datacenter pool, on Apify residential proxy (Australia) and from a normal home connection alike, so no proxy group is guaranteed to clear it. Residential proxy is selected by default in the Proxy input; if you have your own Australian residential proxy URLs, supply them there. A run fails (instead of returning a clean empty dataset) only when it was served no results page at all and delivered no rows. The message tells you why. If the residential proxy connection is refused and no backup connection was tried, the message is "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: https://apify.com/pricing. If you entered your own proxy URLs, check that their credentials are valid." If residential proxies are unavailable and the backup connection also could not load the pages, the message is "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 Carsales pages. Upgrade at https://apify.com/pricing or supply your own proxy URLs, then try again." If every connection route was refused for any other reason, the message is "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search. Please try again later." A run that loaded at least one results page never fails this way, so a search with no matches, or an incremental run where every listing is unchanged, finishes normally with an empty result. No other plan requirement applies; usage is billed per the Pricing tab.
FAQ
How much does it cost?
Billing has three events, named as on the Pricing tab: apify-actor-start once per run, apify-default-dataset-item for every listing row pushed to the dataset, and fetch-details for every listing that is successfully enriched when fetchDetails is switched on. Rows that are suppressed (for example unchanged listings when Emit unchanged is off) are not charged as results. 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. If you call the actor with mode=url and no urls (or clear the field), it scrapes https://www.carsales.com.au/cars/used/.
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... | π Autotrader US Scrape US car listings from Autotrader by make, model, ZIP, price, year, body style... |
| π·οΈ Gumtree AU Scraper Scrape gumtree.com.au classifieds across every vertical: for-sale goods, motors, real... | π mobile.de Scraper Scrape mobile.de vehicle listings with 30+ fields including price, mileage, registration... |
| π Cars.com Scraper Scrape cars.com listings by make, ZIP and radius. 90+ fields per car: price, MSRP... | π Craigslist Scraper Scrape Craigslist postings in any of 700+ cities worldwide: price, title, posting text... |
π 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.