Spain's used-car market as one JSON API
The Coches.net API returns live used-car listings from Spain's largest car marketplace as clean JSON.
3 active endpoints, on 2 and 3 credit tiers.
- POST/coches/v1/search
- POST/coches/v1/listing
- POST/coches/v1/reference
What Coches.net endpoints does ReefAPI ship?
3 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Coches.net API
4 of 3 endpoints, ready to run
Low-mileage BMWs from 2020 on, in Madrid
// Press "Try it" and this pane shows exactly what the // live site returned this second — including an empty // result, if that is the truth. No key, no account.
How the Coches.net API works
Coches.net is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 438 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
From a brand name to a VIN in three calls
Coches.net filters on ids, not names, and its own result counts tell you how big a segment is before you page it. These three calls are the whole loop.
Returns all 166 manufacturers with their ids and 1 688 model ids, the province index, and the live result count behind each make, fuel and province id. Call it once and cache the ids.
Returns the rows plus the source's own source_total and source_total_pages. Page with those two - never by looping until the rows run out, because past the last page the source keeps answering with rows and sets page_clamped.
The same car with the seller's description, factory specs, equipment lists, financing, the market-average price the source publishes for that car, the VIN where a history report exists, and the dealer's address, phone, website and rating.
Measured on 2026-10-06: the id from a search row resolved to the identical car on 6 of 6 round-trips across six different segments, with title, cash price, mileage and year matching the row exactly, and the cash price agreeing with the source's own second price field on 6 of 6.
curl -X POST https://api.reefapi.com/coches/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"make_id":7,"province_id":28,"year_min":2020,"km_max":40000,"limit":10}'{
"ok": true,
"data": { … },
"meta": {
"api": "coches",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}What the filters do, measured on 2026-10-06
Every filter below was checked twice in the same run: once against the unfiltered total (268 873 cars) and once against the rows it returned, so a filter that the site accepts and then ignores is not on this page. Both counts are printed because the second is the one that can disagree.
| Filter | Unfiltered -> filtered | Rows that obeyed it |
|---|---|---|
| make_id (BMW = 7) | 268 873 -> 21 429 | 35 of 35 |
| model_id (BMW Serie 1 = 539) | 268 873 -> 3 624 | 35 of 35 |
| price_min / price_max (5 000-10 000 EUR) | 268 873 -> 51 470 | 35 of 35 |
| year_min / year_max (2020-2024) | 268 873 -> 88 325 | 35 of 35 |
| km_max (50 000 km) | 268 873 -> 55 376 | 35 of 35 |
| fuel_type_id (1 = diesel) | 268 873 -> 122 084 | 35 of 35 |
| province_id (Madrid = 28) | 268 873 -> 53 961 | 35 of 35 |
| query (free text, "gti") | 268 873 -> 2 440 | text match, not row-checkable |
| seller_type = professional (BMW) | 21 429 -> 10 554 | 35 of 35 |
| seller_type = private (BMW) | 21 429 -> 10 879 | 35 of 35 |
| transmission = automatic (BMW) | 21 429 -> 14 078 | gearbox is not on a search row |
| condition = nearly_new (Km0 / demo) | 268 873 -> 3 082 | 35 of 35 |
Body type is NOT offered as a search filter, on purpose. The source accepts it and the total moves, but the rows disagree with their own body-type field: 35 of 35 obeyed it for one id, 31 of 35 for another and only 13 of 35 for a third. Every row carries `body_type_id`, so filter on it yourself. Model NAMES are not a filter either - the source accepts a model name and returns the unfiltered make, so only `model_id` is accepted and `reference` gives you the ids.
What this covers, and what it does not
One market, one currency, one id space. The lines that go against us are here too, because those are the ones worth knowing before you build on it.
Spain only (coches.net). The catalogue read 268 873 live cars on 2026-10-06.
EUR on every price, always. There is no country parameter and no currency switch.
listing_id is the site's own numeric advert id. It round-trips: search -> listing -> the same id, same string type. The numeric id alone resolves used, Km0 and dealer-demo adverts, so you never have to keep the URL slug.
Free text, make id, model id, price, year, mileage, horsepower, province, fuel, gearbox, private-vs-dealer and nearly-new. Each was verified against the unfiltered total and against the returned rows.
Body type. The source accepts it and the total moves, but only 13 of 35 returned rows carried the body type asked for on one id. Every row returns body_type_id so you can filter it yourself.
Not accepted. The source takes a model name, ignores it and returns the unfiltered make - so only model_id is accepted, and reference hands you the ids.
Variable window of 30-35 rows per page. Use source_total_pages and has_more; asking beyond the end still returns rows and sets page_clamped.
Cash asking price and the dealer's financed price are separate fields, with the monthly instalment beside them. The detail endpoint re-checks the cash price against the source's own second price field and publishes whether they agree.
Returned where the source publishes a vehicle-history report - 2 of 6 cars sampled. Null otherwise, never inferred.
Both kinds. Dealers come with trading name, address, city, postal code, coordinates, phone, website, star rating and review count; private adverts come with the display name and phone the seller published. Of 21 429 BMWs, 10 554 were professional and 10 875 private.
New-car configurator pricing, motorbikes (a separate site), saved searches, messaging, favourites and anything behind a login.
What people build with Coches.net
The jobs this data is most often used for.
endpoints
credits per call
Price-intelligence teams track Spanish used-car prices by make, model, year and mileage band, using the source's own result totals to size each segment.
Dealer and lead-gen tools pull a province's live inventory with the dealer's name, address, phone and rating attached to every car.
Residual-value and insurance models compare a car's asking price against the market average the source publishes for that exact car.
Vehicle-history and VIN services resolve listing ids into VINs where the source publishes a history report, together with the factory specification set.
What Coches.net data costs
The cheapest call here is 2 credits, so $15/mo (Pro) buys 5,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 438 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/coches/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"make_id":7,"province_id":28,"year_min":2020,"km_max":40000,"limit":10}'import requests
r = requests.post(
"https://api.reefapi.com/coches/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"make_id": 7,
"province_id": 28,
"year_min": 2020,
"km_max": 40000,
"limit": 10
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Coches.net.
Get a free key →Does search cover the whole Coches.net catalogue or just one brand?▾
The whole catalogue. An unfiltered call read 268 873 live cars on 2026-10-06 and every filter is optional, so you can browse the lot or narrow to a single model in one province. The source's own total and page count come back on every response, so you always know how much is behind the query you sent.
What is the difference between price_eur and financed_price_eur?▾
price_eur is the cash asking price - the number the advert prints as the price to pay. financed_price_eur is the lower price the dealer offers if you take their finance, and monthly_instalment_eur is the instalment behind it. They are separate fields on purpose: on 127 of 200 sampled rows a financed price existed and it was usually lower, so collapsing them into one price would quietly understate the market. On the detail endpoint the cash price is also checked against the source's own financing block and the result is published as price_witness_agrees - it agreed on 6 of 6 cars checked.
Do I get the VIN?▾
Where Coches.net publishes a vehicle-history report for that car, yes - the 17-character VIN comes back in the vin field. It is not published for every advert: 2 of 6 cars sampled across six different segments had one. When it is absent the field is null, never guessed.
Are dealer details included, and private sellers too?▾
Yes. listing returns the seller block as the site publishes it: for a dealer that is the trading name, street address, city, province, postal code, coordinates, phone, website, star rating, review count and the link to their stock page. For a private advert it is the display name the seller chose and their phone. Both kinds are in the catalogue - of 21 429 BMWs, 10 554 were professional and 10 875 private.
How do I find the make and model ids?▾
Call reference once. It returns all 166 manufacturers with their ids and 1 688 model ids under them, plus the province index and the live result count behind each make, fuel and province id. Those ids are what search takes; the names are not accepted because the source ignores a model name and silently returns the unfiltered make.
How far can I page, and how do I know when to stop?▾
The response carries source_total_pages from the site itself and has_more derived from it - use those. Do not loop until the rows run out: past the last page the source still answers 200 with a full window of rows, so a naive loop never terminates. When you ask beyond the end, page_clamped comes back true. A measured example: BMW had 715 pages, page 2 returned 34 rows and page 4 000 returned 34 different rows with page_clamped set.
How many cars come back per page?▾
The source window is variable - 30 to 35 rows were measured on the same filters at different times, so the page size is not fixed and is not promised. limit caps what you receive from that window (1-35, default 20) and window_size tells you how many the source actually published.
What does an empty result look like?▾
An honest zero. A deliberately impossible filter (BMWs between 9.99 and 10 million euro) returned ok with source_total 0 and no rows. A total above zero is never returned with an empty row list - that combination is treated as a source change and reported as an error instead of a silent empty success. A listing that has been taken down returns NOT_FOUND, because the source redirects it back to the search page.
Which fields can be empty?▾
Counted over 200 rows across eight different segments: listing_id, url, title, make, model, year, mileage_km, price_eur, fuel, province, region, warranty flags and the offer type were 200 of 200. financed_price_eur 127 of 200, monthly_instalment_eur 88 of 200, environmental_label 137 of 200, warranty_months 141 of 200, seller name 146 of 200, seller phone 183 of 200, city 180 of 200, power_hp 181 of 200, images 199 of 200. Anything the source does not publish comes back null rather than copied from somewhere else.
What is the Coches.net API?▾
Coches.net API is a ReefAPI endpoint group for spain's biggest used-car marketplace: filtered search, full car detail, vin and dealer. It returns live JSON through POST requests under /coches/v1.
Is the Coches.net API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Coches.net calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Coches.net login or account?▾
No login to Coches.net is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Coches.net data?▾
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Coches.net API use?▾
Coches.net actions currently cost 2-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
99 Classifieds & Second-hand APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Coches.net, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 437 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-10-06.