ParuVendu API & Scraper
ParuVendu.fr is one of France's big general classifieds sites, and this API reads it section by section.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
`search` takes `section` (cars, real_estate, goods, pets or services) plus that section's own filters: brand and model codes, fuel, gearbox, body, year and mileage for cars; sale or rent, property type, price and minimum surface for real estate; category, gift or sale, and condition for goods; and a French department number everywhere. `listing` returns one advert in full: the whole description, every photo, city, department and region, every labelled attribute (make, model, version, year, mileage, CO2 and Crit'Air for cars; rooms, surface, bedrooms, land and energy class for property) and the seller block with the dealer or agency name and page. `car_facets` lists the 115 car brand codes and any brand's model codes. On 2026-10-14 the site carried 104,073 used cars, 218,931 houses for sale and 907,606 second-hand items.
What a ParuVendu field actually contains
Fields that read differently from how they look. Every row was measured against live ParuVendu pages on 2026-10-14.
| Field | What it holds |
|---|---|
| price_eur vs price_text | price_text is what the page prints. price_eur is that number in euros, or null when the advert shows no price: 'Faire offre' on goods (37 of 90 sampled goods rows), 'NC' on services, and 0. Prices are typed by sellers and not checked by ParuVendu: the cheapest BMW sorted by price read 1 euro. |
| Listing price witnesses | listing returns the printed price plus the page's own analytics price (price_analytics) and, on cars and goods, its structured product price (price_ld_json). On 14 adverts across five sections every available witness agreed; price_mismatch flags any disagreement. |
| id | The full ParuVendu id such as 1296268993A1KVVOBMS1, exactly as search returns it. Pass it unchanged to listing; 14 of 14 sampled ids resolved to the same advert. ad_number is the numeric part only. |
| Real-estate search titles | ParuVendu titles property cards as '<type> <surface> m2 <city> (<department>)'. We read property_kind, surface_m2, city and department from it; listing returns the advert's own title, which is a different sentence for the same advert. |
| seller_type on search rows | Dealers and agencies are marked Professionnel with their ParuVendu page in seller_url (121 of 132 car rows). On pet rows it is always null: the card prints the same label for breeders and private owners, so the real seller type comes from listing. |
| department and postal_code | department is the French department number. Cars, pets and services rows carry the 5-digit postal code; property and goods cards print the department only, so postal_code is null there and filled on listing. |
| total and last_page | total is ParuVendu's own count. ParuVendu serves 500 pages at most for any query, so last_page stops there; asking past the real end returns an empty page with page_beyond_end, never a repeat. |
Brand and model filters take ParuVendu's own codes (VVOBM000 is BMW, VVOBMS1 the BMW Série 1). car_facets lists them all.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/paruvendu/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"section": "cars",
"brand": "VVOBM000",
"max_price": 15000,
"sort": "price_desc"
}
}{
"ok": true,
"meta": {
"api": "paruvendu",
"endpoint": "search",
"mode": "live",
"latency_ms": 1547.7,
"record_count": 25,
"bytes": 392559,
"cache_hit": false,
"upstream_requests": 1,
"charged_credits": 3,
"version": "1.0.0",
"request_id": "5be75b3033fb4919",
"queue_ms": 1.9,
"fetched_at": "2026-10-14T18:57:30.170Z"
},
"data": {
"section": "cars",
"query": null,
"total": 1162,
"page": 1,
"page_size": 25,
"last_page": 47,
"has_more": true,
"page_beyond_end": false,
"sort": "price_desc",
"filters_applied": {
"section": "cars",
"sort": "price_desc",
"brand": "VVOBM000",
"max_price": 15000,
"page": 1
},
"listings": [
{
"id": "1296173843A1KVVOBMS3",
"ad_number": "1296173843",
"url": "https://www.paruvendu.fr/a/voiture-occasion/bmw/serie-3/1296173843A1KVVOBMS3",
"section": "cars",
"title": "BMW f30 série 3 2013 318d",
"price_eur": 15000,
"price_text": "15 000 €",
"city": "Tours",
"postal_code": "37000",
"department": "37",
"description_snippet": null,
"image": "https://img.paruvendu.fr/media_ext/_https_/media.paruvendu.fr/e4/f6/L21lZGlhLXBhL1dWMTcvOC8wL1dWMTc4MDQzNzgwXzEuanBlZz8yMDI2MTAxMTE1NDIxNA_rct?func=crop&w=480&gravity=auto",
"photo_count": 6,
"seller_type": "Particulier",
"seller_name": null,
"seller_listing_count": null,
"seller_url": null,
"is_featured": false,
"is_new": false,
"published_on": null,
"year": 2013,
"mileage_km": 178000,
"fuel": "Diesel",
"gearbox": "automatique",
"body_type": "Berline"
},
{
"id": "1295041599A1KVVOBMS1",
"ad_number": "1295041599",
"url": "https://www.paruvendu.fr/a/voiture-occasion/bmw/serie-1/1295041599A1KVVOBMS1",
"section": "cars",
"title": "BMW Série 1 118d",
"price_eur": 15000,
"price_text": "15 000 €",
"city": "Saint-Jean-Pied-de-Port",
"postal_code": "64220",
"department": "64",
"description_snippet": null,
"image": "https://img.paruvendu.fr/media_ext/_https_/media.paruvendu.fr/e7/81/L21lZGlhLXBhL1dWMTcvNy84L1dWMTc3ODk5NDQzXzEuanBlZz8yMDI2MDkwNTE3NDIwOQ_rct?func=crop&w=480&gravity=auto",
"photo_count": 3,
"seller_type": "Particulier",
"seller_name": null,
"seller_listing_count": null,
"seller_url": null,
"is_featured": false,
"is_new": false,
"published_on": null,
"year": 2017,
"mileage_km": 98772,
"fuel": "Diesel",
"gearbox": "manuelle",
"body_type": "Berline"
},
{
"id": "1294219973A1KVVOBMI3",
"ad_number": "1294219973",
"url": "https://www.paruvendu.fr/a/voiture-occasion/bmw/i3/1294219973A1KVVOBMI3",
"section": "cars",
"title": "BMW i3 94 Ah 170 ch BVA +Connected Atelier",
"price_eur": 15000,
"price_text": "15 000 €",
"city": "Nice",
"postal_code": "06000",
"department": "06",
"description_snippet": null,
"image": "https://img.paruvendu.fr/media_ext/_https_/media.paruvendu.fr/3d/bf/L21lZGlhLXBhL1dWMTcvNy83L1dWMTc3NzI5MTU4XzEuanBlZz8yMDI2MDgxNDExMzIwNQ_rct?func=crop&w=480&gravity=auto",
"photo_count": 3,
"seller_type": "Particulier",
"seller_name": null,
"seller_listing_count": null,
"seller_url": null,
"is_featured": false,
"is_new": false,
"published_on": null,
"year": 2018,
"mileage_km": 79000,
"fuel": "Electrique",
"gearbox": "automatique",
"body_type": "Monospace"
}
]
}
}What the ParuVendu API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search ParuVendu.fr, one of France's big general classifieds sites, section by section: used cars (brand, model, fuel, gearbox, body, year, mileage, price), real estate for sale or rent (property type, price, surface), second-hand goods (28 categories, sale/gift/swap, condition), pets and local services. Every section can be narrowed to a French department. `section` is required. | Price-intelligence teams call search to search ParuVendu.fr, one of France's big general classifieds sites, section by section. | section, query, category, brand, model, ... |
| listing | One ParuVendu ad in full: title, full description, price (with the page's own second price witnesses), every photo, city/department/region, every labelled attribute (cars: make, model, version, year, mileage, fuel, gearbox, CO2, Crit'Air, warranty; property: rooms, surface, bedrooms, land, energy class), the ad reference and the seller block (name, private or professional, dealer page, listing count, member since, dealer phone when the page publishes it). Either `id` or `url` is required. | Classifieds aggregators call listing to get one ParuVendu ad in full. | id, url, include_pii |
| car_facets | ParuVendu's own car filter vocabulary: every brand code, and with `brand` that brand's model codes, plus fuel, gearbox, body and door codes and the year range — the exact codes `search` (section=cars) accepts. | Resale and arbitrage tools call car_facets to get paruVendu's own car filter vocabulary. | brand |
| categories | The category codes `search` accepts: 28 goods rubrics, 13 pet families, 15 service families, the 5 property types and the car fuel/gearbox/body codes. | Lead-generation teams call categories to get the category codes `search` accepts. | section |
Call search from your stack
curl -X POST https://api.reefapi.com/paruvendu/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"section":"cars","brand":"VVOBM000","max_price":15000,"sort":"price_desc"}'import requests
r = requests.post(
"https://api.reefapi.com/paruvendu/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"section": "cars",
"brand": "VVOBM000",
"max_price": 15000,
"sort": "price_desc"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/paruvendu/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"section": "cars",
"brand": "VVOBM000",
"max_price": 15000,
"sort": "price_desc"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.paruvendu.search with {"section":"cars","brand":"VVOBM000","max_price":15000,"sort":"price_desc"}.Who uses this API and why
- Track French used-car prices for one model: search section=cars with brand and model codes, sorted by price, and keep year, mileage, fuel and the dealer.
- Build a house-price or rent index by department from section=real_estate with property type, surface and price.
- Watch second-hand demand in one category, such as furniture or bikes, with the item price, city and department of each advert.
- Find car dealers and real-estate agencies active in a region: professional rows carry the dealer name, its ParuVendu page and its advert count.
- Feed a market dashboard with fresh adverts newest first, then read the ones that matter in full with listing.
Questions developers ask before integrating
Do I need a ParuVendu account or a French IP?
No. Every endpoint reads public pages without an account or login, and you call reefapi.com from anywhere.
Which sections can I search?
Five: cars (used cars), real_estate (houses, flats, land, parking and buildings, for sale or rent), goods (28 second-hand categories from furniture to bikes), pets and services. Each section accepts its own filters; a filter from another section is rejected with a clear error instead of being silently ignored.
How do I filter cars by make, model and year?
Take the brand code from car_facets (BMW is VVOBM000), call car_facets with that brand for the model codes, then search with section=cars, brand, model and year_min. Measured on 2026-10-14: BMW 7,013 adverts, of which 1,161 at 15,000 euros or less, 291 electric, and 665 Série 1 from 2020 on.
Can I search houses or flats in one department, for sale or rent?
Yes: section=real_estate with transaction (sale or rent), property_type (house, apartment, land, parking, building) and department. Measured: 218,931 houses for sale in France, 3,181 for rent, 3,859 flats for sale in Gironde (33); 150 m² or more at 300,000 euros or less left 21,167 houses.
Does it return the seller?
Yes, as the page publishes it. Search rows carry the dealer name, its ParuVendu page and how many adverts it has. listing returns the seller block: name, private or professional, the dealer or agency page and, on dealer car adverts, the phone the dealer publishes on the page.
How deep can I page?
Up to page 500 of any query, which is where ParuVendu itself stops: 25 cars per page, about 30 rows elsewhere. Narrow with filters, such as one department, to reach everything in a large result set.
Why is a price null?
Because the advert shows no price: 'Faire offre' (make an offer), 'NC', or 0 for items given away. We keep the printed text in price_text so you can tell those cases apart.
What does the listing add over search?
The full description, every photo (20 on a typical dealer car advert), region, the full attribute list (16 to 17 labelled attributes on a car), the advert reference and last-update time, and the complete seller block.
What is the ParuVendu API?
ParuVendu API is a ReefAPI endpoint group for france's general classifieds as json: used cars, homes for sale or rent and second-hand goods, with prices in euros and the seller block. It returns live JSON through POST requests under /paruvendu/v1.
Is the ParuVendu API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. ParuVendu calls use the same shared credit balance as every other ReefAPI engine.
Do I need a ParuVendu login or account?
No login to ParuVendu 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 ParuVendu 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 ParuVendu API use?
ParuVendu actions currently cost 1-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call ParuVendu from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call paruvendu actions with the same key, credit pool and JSON envelope used by normal REST requests.