Coches.net API

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.

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a Coches.net endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
C
/coches/v1

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.

3 endpoints

search

3 cr

Search Spain's largest used-car marketplace with the site's own filters.

required
—
optional
query, make_id, model_id, price_min, price_max, year_min, year_max, km_min, km_max, hp_min, hp_max, province_id, fuel_type_id, transmission, seller_type, condition, sort, order, page, limit

listing

3 cr

Full detail for one car.

required
listing_id
optional
—

reference

2 cr

The filter vocabulary, read live from the source.

required
—
optional
—

Every parameter, every allowed value →

Coches.net API

4 of 3 endpoints, ready to run

View docs ↗

Low-mileage BMWs from 2020 on, in Madrid

3 credits0 required · 5 optional
POST/coches/v1/search
idle
// 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.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 438 engines.

02
Call
POST /coches/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
2 or 3 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

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.

01reference
POSTreference

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.

02search with make_id, model_id, year_min and km_max
POSTsearch with make_id, model_id, year_min and km_max

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.

03listing with listing_id from any row
POSTlisting with listing_id from any row

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.

request
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}'
response envelope
{
  "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.

FilterUnfiltered -> filteredRows that obeyed it
make_id (BMW = 7)268 873 -> 21 42935 of 35
model_id (BMW Serie 1 = 539)268 873 -> 3 62435 of 35
price_min / price_max (5 000-10 000 EUR)268 873 -> 51 47035 of 35
year_min / year_max (2020-2024)268 873 -> 88 32535 of 35
km_max (50 000 km)268 873 -> 55 37635 of 35
fuel_type_id (1 = diesel)268 873 -> 122 08435 of 35
province_id (Madrid = 28)268 873 -> 53 96135 of 35
query (free text, "gti")268 873 -> 2 440text match, not row-checkable
seller_type = professional (BMW)21 429 -> 10 55435 of 35
seller_type = private (BMW)21 429 -> 10 87935 of 35
transmission = automatic (BMW)21 429 -> 14 078gearbox is not on a search row
condition = nearly_new (Km0 / demo)268 873 -> 3 08235 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.

Market

Spain only (coches.net). The catalogue read 268 873 live cars on 2026-10-06.

Currency

EUR on every price, always. There is no country parameter and no currency switch.

Identity

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.

Filters that bite

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.

Filter deliberately not offered

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.

Model names

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.

Paging

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.

Prices

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.

VIN

Returned where the source publishes a vehicle-history report - 2 of 6 cars sampled. Null otherwise, never inferred.

Sellers

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.

Not included

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.

3

endpoints

2/3

credits per call

01

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.

02

Dealer and lead-gen tools pull a province's live inventory with the dealer's name, address, phone and rating attached to every car.

03

Residual-value and insurance models compare a car's asking price against the market average the source publishes for that exact car.

04

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 →
$0.67–$1.50 / 1,000 credits
  • 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
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}'
python
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"])
FAQ

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.

0/4000

No account needed · we reply from [email protected]

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.