DEV Community

Devil Scrapes
Devil Scrapes

Posted on

How to Scrape Carzone.ie Car Listings (Ireland) to JSON/CSV

Quick answer: Carzone.ie publishes no public API, so structured used-car data requires scraping the public listings. The Carzone Car Scraper on Apify handles browser fingerprint rotation, residential proxy rotation, and retries for you — returning clean typed rows at $2.05 per 1,000 results ($0.05 actor-start + $0.002 per result).


Ireland's used-car market has a few distinctive quirks. The market is denominated in euros, left-hand traffic means most Irish cars are right-hand drive, and engine power is reported in BHP (brake horsepower) rather than the metric PS/CV used across most of continental Europe. The county-level location field matters too — Dublin listings trade at a premium over identical cars in Connacht, and that geographic signal is worth capturing.

Carzone.ie is Ireland's leading used-car marketplace, listing tens of thousands of cars at any given moment. It publishes no developer API. The site's search pages surface roughly 10 listings per page, with detail pages holding the richer spec data (transmission, BHP, cc, body type, colour, county). Getting a complete structured view of the market means working through both layers — which requires session management, residential proxies, and robust retry logic.

This guide shows how to pull Carzone.ie data programmatically using the Carzone Car Scraper, a managed Apify Actor that handles the infrastructure.


Does Carzone.ie Have an API? 🔎

No. Carzone.ie publishes no public car API and no structured data export. Its search is backed by an internal endpoint that the Next.js frontend calls — not a stable surface for external code. The site also de-duplicates sponsored and featured placements that appear mixed into search results; the Actor handles that de-duplication for you by advert ID.


What Data You Can Extract

The Actor returns one row per listing. Fields from the search result card are always present; fields marked "enrichment-only" require enrichDetails: true (the default), which fetches each listing's detail page.

Field Description
listing_id Carzone advert ID
listing_url Absolute URL to the listing
title Make + model + derivative
make Manufacturer (e.g. Toyota)
model Model (e.g. Corolla)
year Registration / model year
price Integer price in EUR
currency Always EUR
mileage_km Odometer in kilometres
fuel_type Petrol / Diesel / Electric / Petrol Hybrid
transmission Manual or Automatic — enrichment-only
engine_power_hp Engine power in BHP — enrichment-only
engine_size_cc Displacement in cc — enrichment-only
body_type Hatchback / Saloon / SUV, etc. — enrichment-only
color Exterior colour — enrichment-only
first_registration First registration date YYYY-MM-DD — enrichment-only
location Seller town/city — enrichment-only
region Irish county — enrichment-only
seller_type dealer (Trade) or private
seller_name Dealer trading name — enrichment-only
photo_urls List of photo URLs
description Advert description / equipment list
posted_date Listing last-updated date
scraped_at ISO-8601 UTC timestamp of scrape

The region field carries the Irish county — Dublin, Cork, Galway, Meath, and so on. This is the geographic granularity that matters in the Irish market: county-level pricing differences are significant and not captured by city names alone.

Engine power in engine_power_hp is BHP as Carzone reports it — consistent with how Irish buyers compare cars, and directly comparable to other UK/Ireland automotive data sources.


A Realistic Output Row

Here is a sample result using the exact field names from the Actor's Pydantic ResultRow model:

{
  "listing_id": "4444769",
  "listing_url": "https://www.carzone.ie/used-cars/mitsubishi/mirage/fpa/4444769",
  "title": "Mitsubishi Mirage 1.2 DBA-A03A CVT 5DR AU AUTO",
  "make": "Mitsubishi",
  "model": "Mirage",
  "year": 2017,
  "price": 6990,
  "currency": "EUR",
  "mileage_km": 111000,
  "fuel_type": "Petrol",
  "transmission": "Automatic",
  "engine_power_hp": 78,
  "engine_size_cc": 1200,
  "body_type": "Hatchback",
  "color": "White",
  "first_registration": "2017-02-28",
  "location": null,
  "region": "Meath",
  "seller_type": "dealer",
  "seller_name": "CarBar",
  "photo_urls": [
    "https://c0.carsie.ie/d43864c90df075c94489ddbe4ca5ffe9742493abfef315899189d722e9fae6e5.jpg"
  ],
  "description": null,
  "posted_date": null,
  "scraped_at": "2026-06-02T00:00:00+00:00"
}
Enter fullscreen mode Exit fullscreen mode

Note that mileage is already in kilometres — Carzone reports km natively, so there is no unit conversion required (unlike Swedish Blocket, which uses the Swedish mil).


How We Handle the Blocks

Carzone.ie is a modern JavaScript marketplace. Its search pages serve approximately 10 listings per page and surface sponsored placements mixed in with organic results. Here is what the Actor does to stay reliable across both the search and detail layers:

  • Browser fingerprint rotation. We use curl-cffi to impersonate real Chrome, Firefox, and Safari TLS handshakes. The server sees a real browser, not Python.
  • Residential proxy rotation via Apify Proxy. We rotate residential exit IPs and fresh session IDs on every block signal. Irish residential exits are preferred for this target.
  • Exponential backoff with Retry-After. We retry on 408, 429, and 5xx — up to five attempts per page, honouring Retry-After headers.
  • Rate-limit-aware pacing. When the site pushes back, we slow down rather than burning through retries.
  • Advert ID deduplication. Sponsored and featured placements appear multiple times in Carzone search results. The Actor de-duplicates by listing_id so you never get duplicate rows in your dataset.
  • Loud failure, never silent. A hard block produces a non-zero exit with a descriptive status message — never a green run with zero results.

Running It with Python 🐍

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("DevilScrapes/carzone-ireland-cars").call(
    run_input={
        "make": "Toyota",
        "maxResults": 100,
        "enrichDetails": True,
        "proxyConfiguration": {
            "useApifyProxy": True,
            "apifyProxyGroups": ["RESIDENTIAL"]
        }
    }
)

items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
print(f"Scraped {len(items)} listings")
for item in items[:3]:
    print(item["make"], item["model"], item["year"],
          item["price"], "EUR", "", item["region"])
Enter fullscreen mode Exit fullscreen mode

Three ways to target your search:

  1. make — convenience filter, e.g. "Toyota". Builds the /used-cars/toyota path automatically.
  2. query — free-text keywords, e.g. "hybrid suv". Maps to Carzone's keywords parameter.
  3. searchUrl — paste a full Carzone search URL with filters applied. The URL wins if all three are set.

Use Cases

Irish EUR price analytics. Build time series of asking prices for specific makes and models in the Irish market. Run daily and push to a database; plot price vs. mileage and price vs. year to understand depreciation curves in EUR.

EV and hybrid market tracking. Query fuel_type = Electric or Petrol Hybrid to chart Ireland's used-EV pricing. Ireland introduced strong SEAI EV grants that suppressed new-EV prices and are now flowing through to the used market — tracking Carzone gives you the data to see that in real time.

County-level pricing analysis. Use the region field to compare asking prices for identical cars across Irish counties. Dublin vs. rural Connacht pricing gaps are well known in the trade; quantifying them from listing data is straightforward with region in your dataset.

Dealer inventory monitoring. Filter by seller_type = dealer and seller_name to watch a competitor's stock. Diff successive runs to catch new arrivals and price movements.

Arbitrage from the UK. Ireland and the UK share a right-hand-drive convention, making cross-channel vehicle sourcing common. Compare Carzone EUR prices against UK equivalents (in GBP) to spot import opportunities, particularly on popular Japanese imports like the Corolla and Yaris.


FAQ ❓

How much does it cost?

Pay-Per-Event pricing: $0.05 for actor-start (one-off per run) plus $0.002 per result row. 1,000 results costs $2.05 total. Every new Apify account gets $5 of free credit — no credit card required to try.

Is mileage in miles or kilometres?

Kilometres. Carzone.ie reports mileage in km natively and the Actor stores the km value in mileage_km — no conversion required. This makes it directly comparable with other EU markets in the fleet.

Why are transmission, body type, and county sometimes null?

Those fields live on each car's detail page, not the search result card. Keep enrichDetails: true (the default) to fill them in; set it to false to halve the request count and return only what the search page provides: make, model, year, price, mileage, fuel type, and photos.

Is scraping Carzone.ie legal?

Carzone's terms restrict automated access. You are responsible for ensuring your use complies with applicable law and the site's terms. The Actor scrapes only public listing data visible to any unauthenticated browser. We do not bypass authentication, access private messages, or scrape seller phone numbers.

Does this cover new cars too?

The default search targets the used-car channel. Paste a searchUrl that includes new-car filters if you want those — the parser reads whatever the search page returns.


Get Started

The Actor is live on the Apify Store. Every new Apify account starts with $5 of free credit — enough for roughly 2,400 enriched listings.

Carzone Car Scraper on Apify Store

Questions or edge cases? Use the Actor's Issues tab on Apify Console. We ship fixes weekly and read every report.


Built by Devil Scrapes — a fleet of opinionated public-data Actors. Honest pricing, real engineering, zero fine print.

Top comments (0)