ActorStack.dev
E-commerceLead generationv0.1.12updated 18 August 2026

Coches.net Car Listings & Dealer Scraper

robots.txt compliant. No login. No session cookies.

Extracts used-car listings and dealer profiles from coches.net, Spain's largest vehicle marketplace, including the site's own market-average price and price rank — the two fields that tell you whether a car is priced below market before you build any valuation model of your own. It downloads and obeys the live robots.txt on every run.

oswaldocarabano/coches-net-scraper

input.json
{
  "maxResults": 1000,
  "makes": ["bmw", "audi"],
  "provinces": ["madrid"],
  "scrapeDealers": true,
  "maxDealers": 200,
  "maxCacheAgeDays": 7
}
Version
v0.1.12
Memory
4096 MB
Browser
none
Proxy
Managed, no configuration needed

Short answer

The Coches.net Car Listings & Dealer Scraper extracts used-car listings from coches.net with 55 fields per row, including the marketplace's own market-average price and price rank (filled on 77.6% of 550 measured listings). It never signs in, never exceeds what robots.txt allows, and never returns private sellers' phone numbers. Pricing is $0.002 per listing and $0.004 per dealer profile, and error rows are never charged.

Key points

  • 55 fields per listing, all from the search results themselves, so one request returns 35 fully populated cars.
  • `price_average_indicator_eur` and `price_rank_indicator` — coches.net's own valuation and where a listing sits against it — on 77.6% of 550 measured listings. Of the eleven coches.net scrapers on Apify, one other exposes them.
  • Private sellers' phone numbers are never returned, with no option to change that. GDPR Article 14 requires informing people whose data you collect indirectly within one month, and for ~107,000 private sellers that is not achievable by anyone.
  • Dealer phone numbers are returned in full, on 100% of dealer listings: published business contact details.
  • Fill rates measured on 550 listings across 35 makes and 38 provinces, dealer and private, on 17 August 2026.
  • Data is delivered in English with the original Spanish string kept alongside in `fuel_type_raw` and `offer_type_raw`. Province, city and region stay in Spanish because they are proper nouns.
On this page11 sections

What it does

Extracts used-car listings and dealer profiles from coches.net, Spain's largest vehicle marketplace, including the site's own market-average price and price rank — the two fields that tell you whether a car is priced below market before you build any valuation model of your own. It downloads and obeys the live robots.txt on every run.

output — one row
{
  "ad_id": "58291043",
  "url": "https://www.coches.net/bmw-320d-touring-madrid-58291043.htm",
  "title": "BMW Serie 3 320d Touring",
  "make": "BMW",
  "model": "Serie 3",
  "year": 2019,
  "km": 96500,
  "price_eur": 21900,
  "price_average_indicator_eur": 24350,
  "price_rank_indicator": "below_market",
  "fuel_type": "Diesel",
  "fuel_type_raw": "Diésel",
  "hp": 190,
  "environmental_label": "C",
  "offer_type": "Used",
  "offer_type_raw": "Ocasión",
  "province": "Madrid",
  "city": "Alcobendas",
  "region": "Comunidad de Madrid",
  "seller_type": "dealer",
  "seller_phone": "+34910000000",
  "seller_rating_avg": 4.6,
  "financed_price_eur": 20400,
  "financing_tae_pct": 7.9,
  "warranty_months": 12,
  "photos": ["https://..."],
  "published_at": "2026-08-11T09:14:00.000Z",
  "from_cache": false,
  "data_age_hours": 0
}

Why this one

The marketplace's own valuation, passed through unchanged

Coches.net computes what it thinks a model is worth on the Spanish market and publishes it next to the asking price. Together with `price_rank_indicator`, that lets you find every car asking meaningfully less than its own marketplace's valuation in a single query, with no pricing model of your own. It is coches.net's estimate, not an independent one, and it is filled on 77.6% of listings — both stated rather than dressed up.

robots.txt is downloaded and obeyed on every run

The site publishes a machine-readable set of rules and this Actor reads the live file every time, never requesting a page crawlers are asked not to request. `maxPagesPerUrl` defaults to 6 because that is what robots.txt allows. This is the reason the Actor keeps working rather than a limitation of it.

Facet expansion instead of deep pagination

Discovery expands make, then province, then price band. That is not a workaround: the site's own search stops returning results past roughly page 300, so deep pagination would miss about 96% of the inventory no matter what any crawler attempted.

Two fields deliberately absent

Video links (20.9%) and the featured flag (17.5%) were measured, found too sparse to promise, and left out of the documented schema rather than listed as "available".

Use cases

  • Find used cars asking below their own marketplace valuation, using price rank as the filter.
  • Track used-car price movements by make, model, province or DGT environmental badge over time.
  • Build dealer lead lists with business phone, address, postcode and province.
  • Study the Spanish EV and hybrid market through the DGT badge distribution (14,546 zero-emission and 29,25x ECO cars at time of measurement).
  • Feed a residual-value or depreciation model with year, mileage, power and asking price.
  • Monitor advertised financing terms: lender, APR and instalment, on the listings that publish them.

Input

Every field has a default, and the defaults are deliberately small so a first run is cheap enough to inspect before you commit to a sweep. This table mirrors the Actor's own input schema field for field.

FieldDefaultWhat it does
maxResultsinteger100Maximum listingsHow many listings to return. You are charged per listing delivered. Hard cap 50,000 per run.
makesstring[][]MakesLimit the run to specific makes, e.g. `bmw`, `seat`, `mercedes-benz`. Empty sweeps all 134, smallest first.
provincesstring[][]ProvincesLimit to specific Spanish provinces, e.g. `madrid`, `barcelona`, `a_coruna`. Empty covers all 52.
environmentalLabelsstring[][]DGT environmental badgeOnly cars carrying the badge you pick. `0` is zero-emissions; `ECO` covers hybrids and gas.
maxPriceEurinteger0Maximum price (EUR)Uses the price bands coches.net itself publishes, so pick a round figure.
km0OnlybooleanfalseOnly Km 0 carsNearly-new cars self-registered by the dealer: a small, high-value segment.
automaticOnlybooleanfalseOnly automatic transmission113,912 of the cars on the site are automatic.
financedOnlybooleanfalseOnly cars with advertised financing69,747 listings advertise financing terms; the detail comes back on 66.5% of dealer listings.
privateOnlybooleanfalseOnly private sellerspersonal dataIndividuals rather than dealers. Measured trade-off: private listings carry the market-average price on only 38.2% against 86.6% for dealers, and never a phone number.
colorsstring[][]ColoursCannot be combined with a make or badge filter: the site's URL scheme allows only one of them.
scrapeDealersbooleanfalseAlso scrape dealersCollect dealer profiles into a separate `dealers` dataset: name, phone, address, postcode, province and pack.
maxDealersinteger0Maximum dealersHow many dealer profiles to return when the option above is on.
maxCacheAgeDaysinteger7Maximum cache age (days)Accept cached rows up to this old. 0 forces a fresh fetch. Every row reports which it was.
maxPagesPerUrlinteger6Pages per facet URLHow deep to paginate within one facet. 6 is what coches.net's robots.txt allows, and the Actor does not go beyond it.

Output and fill rates

A field being in the schema is not the same as it having a value. The percentages below were counted on real runs; the sample sizes are in Measurements. Anything not listed here is not promised.

FieldFilledMeaning
ad_idstring100%Listing identifier on coches.net.
urlstring100%Canonical listing URL.
titlestring100%Listing title as published.
makestring100%Manufacturer.
modelstring100%Model name.
yearinteger100%Registration year.
kminteger100%Mileage in kilometres.
price_eurnumber100%Asking price in euros.
fuel_typestring100%Translated: Diesel, Petrol, Hybrid, Plug-in hybrid, Electric, LPG.
fuel_type_rawstring100%The exact Spanish string coches.net published.
provincestring100%Spanish province, kept in Spanish: it is a proper noun.
regionstring100%Autonomous community.
seller_typestring100%`dealer` or `private`.
photosstring[]100%Listing photo URLs.
published_atdatetime100%When the advert was published.
offer_typestring100%Translated: Used or Km0.
citystring98.2%City, kept in Spanish.
hpinteger97.5%Power in horsepower.
warranty_monthsinteger80.9%Warranty length in months.
environmental_labelstring79.6%Official Spanish DGT badge code: `0`, `ECO`, `C` or `B`.
price_average_indicator_eurnumber77.6%Coches.net's own estimate of the model's market value.
price_rank_indicatorstring77.6%Where this listing sits against that estimate.
seller_rating_avgnumber74.5%Dealer rating average. Dealers only.
financed_price_eurnumber68.5%Price when financed through the advertised offer.
financing_tae_pctnumber54.2%Advertised APR.
seller_phonestring100%Dealer business phone. Always `null` for private sellers.
from_cachebooleanalwaysWhether this row was served from the shared cache.
fetched_atdatetimealwaysWhen the data actually came off coches.net.
data_age_hoursnumberalwaysHow old the data is.

Every key is always present. A field that exists but is empty comes back as explicit null, so a parser never has to guess.

Datasets

Different record types go to different datasets, so the main table never carries columns that are blank on most rows.

  • defaultOne row per car listing, 55 fields.billed
  • dealersOne row per dealer profile, when `scrapeDealers` is on.billed
  • errorsAny URL that failed, with the reason.never billed

Pricing

Pay per delivered result. Charges are applied as each row is produced rather than in a lump at the end, so an aborted run bills only for what it actually gave you.

EventPriceNotes
actor-startActor start$0.00001Effectively free. A run that finds nothing costs you nothing.
listingCar listing$0.002One listing with 55 fields, including the market-average price and price rank. Error rows are never charged.
dealerDealer profile$0.004One dealer with business phone, address, postcode and province.

Measurements

Each figure is shown with the method that produced it. A benchmark without a method is a marketing claim wearing a number's clothes.

Fill-rate sample

550 listings

35 makes and 38 provinces, dealer and private sellers, measured 17 August 2026.

Market-average price coverage

77.6% overall — 86.6% dealer, 38.2% private

Same 550-listing sample, split by seller type.

Rows per request

35 fully populated listings

All 55 fields come from the search results, so no detail-page request is needed.

Dealer field coverage

100% on 9 of 11 fields

60 dealer profiles. `dealer_id`, `name`, `external_contract_id`, `phone`, `province`, `province_id`, `postal_code`, `pack` and `is_active` at 100%; street address and stock page URL at 96.7%.

Pagination ceiling

~page 300, ~96% of inventory unreachable by deep paging

The site's own search stops returning results, which is why discovery expands facets instead.

Fields excluded on purpose

video links 20.9%, featured flag 17.5%

Measured, found too sparse to promise, and left out of the documented schema.

What it will not do

Stated plainly so you can judge fit before spending anything.

  • Listing detail pages are not included. The individual advert pages sit behind stricter bot protection, and reaching them would require the fingerprint spoofing this Actor refuses to do. Free-text descriptions, colour, transmission and equipment lists are therefore unavailable.
  • `price_average_indicator_eur` is filled on 77.6% of listings, not all of them.
  • Results are capped at 50,000 per run.
  • Colour filters cannot be combined with a make or badge filter: the site's URL scheme allows only one of them.
  • No CAPTCHA solving, no TLS or browser fingerprint spoofing, no accounts, no session cookies. If the public data ever becomes unreachable without one of those, the Actor reports the failure instead of working around it.

Privacy

  • Private sellers' phone numbers are never returned. When `seller_type` is `private`, `seller_phone` is `null`, always, and there is no setting to change it.
  • The reason is GDPR Article 14: collecting personal data indirectly obliges you to inform the person within one month, and for ~107,000 private sellers that is not achievable. A setting would not remove the problem, it would just transfer it to your account.
  • Every vehicle field is still returned for private listings — price, mileage, year, power, badge, province, city, photos and price rank — along with the listing URL, which carries the site's own contact form.
  • Data removal requests: privacy@actorstack.dev

See also the data removal process.

Frequently asked questions

Is there an official coches.net API?
No. Coches.net does not publish a public API for listing data, which is why an Actor that reads the site's own server-rendered payload is the practical route. This one stays inside what the site's robots.txt allows and downloads the live file on every run.
Why are private sellers' phone numbers missing?
They are withheld deliberately and permanently. GDPR Article 14 requires informing a person within one month when you collect their personal data indirectly, and for roughly 107,000 private sellers on the site that is not achievable by us or by you. Dealer phone numbers are returned in full, because those are published business contact details.
What is `price_rank_indicator` and can I trust it?
It is coches.net's own placement of a listing against its own market-value estimate, passed through unchanged. It is filled on 77.6% of listings and it is the marketplace's estimate rather than an independent valuation — useful precisely because it is the number the market itself publishes, not because it is objective.
How much does a run cost?
$0.002 per listing and $0.004 per dealer profile, plus $0.00001 to start. A 1,000-listing run costs about $2. Error rows are never charged, and charges are applied per row as it is produced rather than in a lump at the end.
Can I get the full advert description and equipment list?
No. Those live on the individual advert pages, which sit behind stricter bot protection than the search results. Reaching them would require the browser fingerprint spoofing this Actor refuses to do, so descriptions, colour, transmission and equipment lists are not available. Everything in the documented fill-rate table comes from the search results and is unaffected.
Is the output in Spanish or English?
English for the enumerations — fuel type and offer type are translated — with the original Spanish kept in `fuel_type_raw` and `offer_type_raw`. Province, city and region stay in Spanish because they are proper nouns, and the DGT badge stays as `0`, `ECO`, `C` or `B` because those are official codes.
How many cars can one run return?
Up to 50,000 per run. Discovery expands facets — make, then province, then price band — because the site's search stops returning results past roughly page 300, so deep pagination would miss about 96% of the inventory.

Guides for this Actor