Dealers are the segment of the Spanish used-car market that can actually be worked at scale: they publish business phone numbers, they trade continuously, and they carry the marketplace's valuation on 86.6% of their listings against 38.2% for private sellers. Everything about the data is better instrumented on that side of the market.
What a dealer profile contains
Turn on scrapeDealers and a second dataset appears with one row per dealer: internal id, name, external contract id, phone, province and province id, postal code, commercial pack, active status, street address and stock page URL.
The pack field is more useful than it looks — it indicates the tier of listing package the dealer buys, which is a rough proxy for size and marketing spend. Combined with the count of their listings in the main dataset, it gives you a two-dimensional sense of the business before you speak to anybody.
Measured coverage
On 60 dealer profiles:
| Fields | Present |
|---|---|
dealer_id, name, external_contract_id, phone, province, province_id, postal_code, pack, is_active | 100% |
| Street address, stock page URL | 96.7% |
Phone numbers also appear on 100% of dealer listings in the main dataset, so for a contact list you do not strictly need the dealer sweep — you need it when you want the address, the postcode and the pack.
Why private numbers are excluded permanently
Roughly 40% of listings on coches.net are posted by private individuals, and the site exposes their mobile numbers in the page source. This Actor never returns them: when seller_type is private, seller_phone is null, always, and there is no setting to change it.
Article 14 of the GDPR requires that when you obtain someone's personal data from a source other than the person, you inform them — as a rule within one month. For roughly 107,000 private sellers, nobody can do that. A configuration toggle would not remove the obligation; it would move it to whoever flipped the switch, usually without them noticing. The full reasoning.
A dealer-list workflow
{
"maxResults": 5000,
"provinces": ["madrid", "barcelona", "valencia", "sevilla"],
"scrapeDealers": true,
"maxDealers": 400,
"maxCacheAgeDays": 7
}Five thousand listings ($10) plus four hundred dealer profiles ($1.60). Then aggregate the main dataset by dealer to get stock count, median asking price, badge mix and make concentration, and join it to the dealer rows on the seller identifier.
The result is a prioritised list where each row carries a phone number and a reason to call: “38 cars in stock, median €14,200, 60% diesel with no badge” is a conversation opener that a name and a number is not.
Enriching dealers with their inventory
This is where the two datasets earn their separation. A dealer row is one record; their inventory is many. Keeping them apart means the dealer table stays one row per business — and the aggregations you build on top are yours to define rather than baked into a flattened export.
Useful derived columns: stock count, median and spread of asking price, share of listings carrying the valuation, share below market, average mileage, badge distribution, and the ratio of Km 0 to used — Km 0 being self-registered nearly-new stock, which indicates a dealer with manufacturer relationships.
Cost
$0.004 per dealer profile and $0.002 per listing. A four-province sweep as above is under $12 and produces a contact list with business context attached. Error rows are never charged, and maxDealers is a hard cap, so the spend is bounded before the run starts.



