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
{
"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.
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.
{
"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.
| Field | Default | What it does |
|---|---|---|
maxResultsinteger | 100 | Maximum 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. |
maxPriceEurinteger | 0 | Maximum price (EUR)Uses the price bands coches.net itself publishes, so pick a round figure. |
km0Onlyboolean | false | Only Km 0 carsNearly-new cars self-registered by the dealer: a small, high-value segment. |
automaticOnlyboolean | false | Only automatic transmission113,912 of the cars on the site are automatic. |
financedOnlyboolean | false | Only cars with advertised financing69,747 listings advertise financing terms; the detail comes back on 66.5% of dealer listings. |
privateOnlyboolean | false | Only 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. |
scrapeDealersboolean | false | Also scrape dealersCollect dealer profiles into a separate `dealers` dataset: name, phone, address, postcode, province and pack. |
maxDealersinteger | 0 | Maximum dealersHow many dealer profiles to return when the option above is on. |
maxCacheAgeDaysinteger | 7 | Maximum cache age (days)Accept cached rows up to this old. 0 forces a fresh fetch. Every row reports which it was. |
maxPagesPerUrlinteger | 6 | Pages 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.
| Field | Filled | Meaning |
|---|---|---|
ad_idstring | 100% | Listing identifier on coches.net. |
urlstring | 100% | Canonical listing URL. |
titlestring | 100% | Listing title as published. |
makestring | 100% | Manufacturer. |
modelstring | 100% | Model name. |
yearinteger | 100% | Registration year. |
kminteger | 100% | Mileage in kilometres. |
price_eurnumber | 100% | Asking price in euros. |
fuel_typestring | 100% | Translated: Diesel, Petrol, Hybrid, Plug-in hybrid, Electric, LPG. |
fuel_type_rawstring | 100% | The exact Spanish string coches.net published. |
provincestring | 100% | Spanish province, kept in Spanish: it is a proper noun. |
regionstring | 100% | Autonomous community. |
seller_typestring | 100% | `dealer` or `private`. |
photosstring[] | 100% | Listing photo URLs. |
published_atdatetime | 100% | When the advert was published. |
offer_typestring | 100% | Translated: Used or Km0. |
citystring | 98.2% | City, kept in Spanish. |
hpinteger | 97.5% | Power in horsepower. |
warranty_monthsinteger | 80.9% | Warranty length in months. |
environmental_labelstring | 79.6% | Official Spanish DGT badge code: `0`, `ECO`, `C` or `B`. |
price_average_indicator_eurnumber | 77.6% | Coches.net's own estimate of the model's market value. |
price_rank_indicatorstring | 77.6% | Where this listing sits against that estimate. |
seller_rating_avgnumber | 74.5% | Dealer rating average. Dealers only. |
financed_price_eurnumber | 68.5% | Price when financed through the advertised offer. |
financing_tae_pctnumber | 54.2% | Advertised APR. |
seller_phonestring | 100% | Dealer business phone. Always `null` for private sellers. |
from_cacheboolean | always | Whether this row was served from the shared cache. |
fetched_atdatetime | always | When the data actually came off coches.net. |
data_age_hoursnumber | always | How 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.billeddealersOne row per dealer profile, when `scrapeDealers` is on.billederrorsAny 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.
| Event | Price | Notes |
|---|---|---|
actor-startActor start | $0.00001 | Effectively free. A run that finds nothing costs you nothing. |
listingCar listing | $0.002 | One listing with 55 fields, including the market-average price and price rank. Error rows are never charged. |
dealerDealer profile | $0.004 | One 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?
Why are private sellers' phone numbers missing?
What is `price_rank_indicator` and can I trust it?
How much does a run cost?
Can I get the full advert description and equipment list?
Is the output in Spanish or English?
How many cars can one run return?
Guides for this Actor
- Scrape coches.netA walkthrough of extracting used-car listings from Spain's largest vehicle marketplace: how discovery works by facet rather than pagination, what the 55 fields contain, and what a thousand listings cost.
- Coches.net APICoches.net publishes no public listing API. What it does publish is a server-rendered payload and a detailed robots.txt — which together define exactly what a compliant integration can read.
- Price rank explainedCoches.net computes its own valuation for each model and publishes it next to the asking price. Two fields, filled on 77.6% of listings, that replace a pricing model you would otherwise have to build.
- Cars below market priceA concrete screen: which fields to filter on, which segments carry the valuation data, and how to avoid the two biases that make a below-market list look better than it is.
- DGT badge dataSpain's environmental badge decides where a car can drive and what it is worth. What each code means, how often it appears in listing data, and why it stays untranslated.
- Car dealer lead listsDealer profiles come with business phone, address, postcode and province at 100% coverage on a 60-dealer sample. Private sellers' numbers are never included, and that is not a configuration gap.
- Coches.net data fieldsA reference for the 55 fields in a coches.net listing row, each with the percentage of 550 real listings that had it filled, plus the two fields deliberately left out.
- GDPR and classifiedsScraping a marketplace means scraping individuals. Article 14 attaches an obligation to that which no scraper can discharge at scale — and a setting does not remove it, it transfers it.
- Spanish market analysisWhat you can and cannot conclude from marketplace listings: asking prices are not transaction prices, inventory is not demand, and the badge distribution tells you more than the fuel type does.
- Comparing data sourcesCoches.net, Milanuncios, Wallapop and AutoScout24 all list Spanish cars, and they differ in the one thing that matters for data work: how much structure the site publishes.