Carsales.com.au Scraper: Price, Odometer, Year
Pricing
from $1.20 / 1,000 vehicles
Carsales.com.au Scraper: Price, Odometer, Year
Scrape Carsales.com.au vehicle listings by make and model: price, year, odometer, listing URL and photos. Australia residential proxy, no login, pay per vehicle.
Pricing
from $1.20 / 1,000 vehicles
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
15 hours ago
Last modified
Categories
Share
A single Carsales results page per search, fetched over an Australian residential proxy — no browser involved.
You are only charged for a vehicle that actually lands in your dataset. A blocked or empty search is never billed.
Overview
Carsales is Australia's dominant vehicle marketplace, and this actor turns any make and model search into structured rows: title, year, price, odometer reading, body type and a direct link, with photos.
Give it a make such as "toyota", optionally a model such as "camry", and it returns the current listings for sale exactly as carsales itself lists them — one results page per search, roughly 20 to 30 vehicles on Carsales' own "Featured" sort.
Price and odometer parsed as real numbers ✅ · Year parsed from the listing title ✅ · Photos included ✅ · MCP ready for AI agents ✅
How this gets past Carsales' bot defence, and why it only returns one page
Carsales protects its listing pages with DataDome. A plain HTTP request that mimics a real browser's TLS and header fingerprint is enough to clear it on a fresh residential IP — no interactive challenge, no login, no cookies from a prior visit required. That is the entire transport: one request, one Australian residential proxy session, the same schema.org listing data (JSON-LD) Carsales embeds on every search page for its own SEO.
What this version does not do is turn the page. Carsales does not expose page 2 as a URL you can construct — the "Next" control submits a same-page form carrying an opaque, single-use token the server mints only when you click it, so there is no ?page=2 to ask for and no safe way to replay that click without a real browser executing the click itself. Asking for more than one page's worth of vehicles from a single search is therefore not currently possible without reintroducing the exact browser-based blocking this actor exists to avoid. maxItems above what one page returns simply gets you everything on that page.
Input
{"make": "toyota","model": "camry","maxItems": 40,"minYear": 2020,"maxPrice": 40000}
| Field | What it takes |
|---|---|
make | Vehicle make, for example "toyota" or "ford". Leave blank to search all makes. |
model | Vehicle model, for example "camry" or "ranger". Leave blank to search every model of the chosen make. |
maxItems | Hard cap for the run. Each search fetches one Carsales results page (roughly 20 to 30 vehicles), so this mostly matters if you want fewer than that. |
minYear | Optional. Only return vehicles from this model year or newer. |
minPrice / maxPrice | Optional price band in AUD. |
Year and price filters are applied after fetching the page, because Carsales does not expose them as a URL parameter the way it exposes make and model. This costs nothing extra: the page is already being fetched, and this only decides which rows are worth billing you for.
Output
{"listing_id": "OAG-AD-25834030","title": "2026 Toyota Camry Ascent Auto","year": 2026,"make": "Toyota","model": "Camry","price": 43990,"odometer_km": 2346,"url": "https://www.carsales.com.au/cars/details/2026-toyota-camry-ascent-auto/OAG-AD-25834030/","scraped_at": "2026-08-13T21:00:00.000Z"}
| Field | Description |
|---|---|
🆔 listing_id | Carsales advert ID, stable for deduplication across runs |
📄 title | Listing title as displayed |
📅 year | Model year, parsed from the title |
🚗 make / model | Vehicle make and model |
💰 price | Listed price in AUD, as a number |
🛣️ odometer_km | Odometer reading in kilometres |
🚙 body_type | Body type, when the listing discloses it |
🖼️ image_url / image_count | Primary photo and total photo count |
🔗 url | Direct link to the listing on Carsales |
Common use cases
Pricing research. Build a real price distribution for a make and model by year and odometer, instead of relying on a single valuation guide figure.
Dealer and private seller monitoring. Track what is actually listed for a model right now, and how quickly stock turns over.
Buying alerts. Run on a schedule against a model and price band to catch new listings the day they go live.
Fleet and remarketing analysis. Pull current market supply for specific models to time a fleet disposal or a private sale.
AI agents. Feed live Carsales listings into an agent that answers "what is a fair asking price for a 2021 Camry with under 60,000 kilometres right now?"
Pricing
| Event | Price | You pay when |
|---|---|---|
| Vehicle delivered | $0.0011 | A vehicle lands in your dataset |
$1.10 per 1,000 vehicles. A search that returns nothing costs nothing.
Run it on a schedule
- Run once with the make and model you want repeated, then click Save as a task.
- In the Apify Console go to Schedules, Create new.
- Pick a frequency and attach the saved task.
- Wire the dataset to Sheets, Slack or a webhook from the Integrations tab.
Deduplicate on listing_id so a repeated schedule only surfaces genuinely new listings.
FAQ
Do I need a Carsales account? No. The actor reads Carsales's own public search results only.
Why do I only get one page of results? Because Carsales does not expose "page 2" as a URL — its "Next" control submits a same-page form carrying a single-use token the server mints only when clicked, with no simpler pattern behind it. Fetching further pages would mean either a real browser clicking through (the approach that used to get this actor DataDome-blocked in production, delivering nothing) or replaying that click over plain HTTP, which Carsales also blocks. One page per search is the honest ceiling today.
Can I filter by state or location? Not in this version. Carsales's location filtering is not exposed as a simple URL parameter the way make and model are, so it is left out rather than shipped half working. Make, model, year and price cover the most common use cases.
Why did I get fewer vehicles than my cap?
Because the search has fewer matching vehicles than your cap, your year or price filter narrowed the results, or the one available page returned fewer than maxItems. The run reports what it actually found rather than padding the count.
Use from Claude, ChatGPT and any MCP agent
https://mcp.apify.com/?tools=themineworks/carsales-scraper
Or call it programmatically:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('themineworks/carsales-scraper').call({make: 'toyota',model: 'camry',maxItems: 40,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Questions, or need a field we do not return yet? Reach out through the Apify profile.