Leboncoin FR $1π° URL | Filters | Deep Search Scraper
Pricing
from $0.80 / 1,000 results
Leboncoin FR $1π° URL | Filters | Deep Search Scraper
Pull public leboncoin.fr listings across cars, property, jobs, electronics, furniture, and 35+ categories. Returns 60β78 fields, including price, GPS, seller info, attributes, and images. Search by filters or URL with pagination and listing ID dedupe.
Pricing
from $0.80 / 1,000 results
Rating
5.0
(1)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
0
Monthly active users
15 days ago
Last modified
Categories
Share
Leboncoin.fr Scraper
Pull every public field from leboncoin.fr classified listings: cars, property, jobs, electronics, furniture, and 35 more categories. 60-78 flat fields per record including price, GPS coordinates, full seller info, exploded category attributes (mileage, fuel type, year, rooms, surface area), and the full image gallery. Search by filters or paste a Leboncoin search URL; both modes walk pagination forward and dedupe by listing ID.
Why this scraper?
- 60-78 flat fields per listing (most rivals stop at 40)
- Two modes: build searches from filters, or paste raw Leboncoin search URLs
- Multi-location, multi-URL, multi-category in one run
- Optional detail-page enrichment for full body text and image gallery
- Optional seller-reviews enrichment (star rating + text reviews)
- Optional seller-other-listings enrichment (catalogue of pro sellers' active ads)
- Per-search budget cap so a 5-city run returns 5 cities, not just the first one
- Fast: 100 listings in ~13 seconds, 150 listings in ~16 seconds (verified on cloud, FR-residential)
- Session cache cuts repeat-run latency by half (subsequent runs within 22 minutes skip the cold-start)
- Works with FR-residential by default; any EU residential country also accepted (DE, BE, IT, ES, NL, PT, AT, ...)
- Resume & recurring updates β turn on Incremental mode to get only NEW, UPDATED, and REAPPEARED listings on repeat runs of the same search, or use Resume to continue one interrupted crawl
Data You Get
Sample shape, values are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
id | "0000000000" |
list_id | 0000000000 |
subject | "Sample Listing Title" |
body | "Full seller description text appears here when fetchDetails=true." |
url | "https://www.leboncoin.fr/ad/voitures/0000000000" |
category_id | "2" |
category_name | "Voitures" |
ad_type | "offer" |
status | "active" |
brand | "leboncoin" |
price | 0 |
price_max | null |
price_cents | 0 |
publication_date | "2026-01-01 00:00:00" |
index_date | "2026-01-01 00:00:00" |
expiration_date | "2026-04-01 00:00:00" |
has_phone | true |
is_boosted | false |
is_urgent | false |
city | "Paris" |
zipcode | "75001" |
department_id | "75" |
department | "Paris" |
region_id | "12" |
region | "Ile-de-France" |
latitude | 48.8566 |
longitude | 2.3522 |
owner_type | "private" |
owner_name | "Sample Seller" |
owner_user_id | "00000000" |
owner_store_id | "00000000" |
owner_raw | full upstream owner block (verbatim β captures siren, store address, response stats, and any field the platform adds) |
image_count | 5 |
thumb_url | "https://img.leboncoin.fr/api/v1/lbcpb1/images/00/00/00/000000.jpg?rule=ad-thumb" |
image_urls | ["https://img.leboncoin.fr/...?rule=ad-image", "..."] |
view_count | 0 |
favorite_count | 0 |
attr_year | "2020" |
attr_mileage | "50000" |
attr_fuel | "Diesel" |
attr_gearbox | "Manuelle" |
attr_rooms | "3 pièces" |
attr_square | "60 mΒ²" |
attr_energy_rate | "D" |
attr_ges | "C" |
raw_attributes | [{"key": "year", "value": "2020", "value_label": "2020"}, ...] |
seller_rating_avg | 4.8 (when fetchSellerReviews=true) |
seller_review_count | 42 (when fetchSellerReviews=true) |
seller_reviews | [{"rating": 5, "comment": "...", "author": "...", "created_at": "..."}, ...] (when fetchSellerReviews=true) |
seller_other_listings_count | 17 (when fetchSellerOtherListings=true) |
seller_other_listings | [{"id": "0000000000", "subject": "...", "price": 0, "url": "...", "thumb_url": "..."}, ...] (when fetchSellerOtherListings=true) |
Category attributes (attr_*) vary by category. Cars carry mileage, fuel, gearbox, year. Property carries rooms, square, energy_rate, ges. The full set is preserved in raw_attributes for advanced consumers.
Seller enrichment fields are only populated when the corresponding input toggle is on. Private sellers without a public profile yield empty arrays. Sellers with no reviews yet yield seller_review_count: 0 and an empty seller_reviews array.
Incremental mode only. When incrementalMode is on, every returned record also carries:
| Field | Description |
|---|---|
changeType | NEW | UPDATED | UNCHANGED | REAPPEARED | EXPIRED |
changedFields | Top-level fields that changed since last seen; non-empty only for UPDATED |
firstSeenAt | When this listing was first observed by this monitoring campaign |
lastSeenAt | When this listing was last observed |
How to Use
Search by filters (cars in Paris under 15k EUR)
{"mode": "search","category": "voitures","locations": ["Paris"],"minPrice": 5000,"maxPrice": 15000,"maxMileage": 50000,"fuel": "diesel","sortBy": "price_asc","maxPages": 5,"maxListings": 100}
Search across multiple cities
{"mode": "search","category": "ventes_immobilieres","locations": ["Paris", "Lyon", "Marseille", "Bordeaux"],"minSquare": 40,"maxSquare": 120,"rooms": ["2", "3", "4"],"ownerType": "pro","maxPages": 3,"maxListings": 200}
Paste Leboncoin search URLs (URL mode)
{"mode": "url","urls": ["https://www.leboncoin.fr/recherche?category=2&locations=Paris&fuel=2","https://www.leboncoin.fr/recherche?category=9&locations=Lyon&price=200000-500000"],"maxPages": 5,"maxListings": 200}
Free-text query
{"mode": "search","text": "iphone 14 pro","category": "telephonie","locations": ["Paris", "Lyon"],"maxListings": 50,"fetchDetails": true}
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | "search" | "search" builds the URL from filters; "url" takes raw Leboncoin search URLs |
text | string | none | Free-text keyword query (search mode) |
category | string | "all" | Top-level category (cars, property, electronics, ...) |
locations | array | ["Paris"] | Cities, regions, or department codes (search mode, multi-select) |
ownerType | string | "all" | Filter by seller: "all", "private", "pro" |
minPrice / maxPrice | integer | none | Price range in EUR |
minSquare / maxSquare | integer | none | Surface area in mΒ² (property categories) |
rooms | array | none | Number of rooms (property; multi-select e.g. ["2", "3"]) |
minMileage / maxMileage | integer | none | Mileage in km (vehicle categories) |
fuel | string | "all" | "all", "petrol", "diesel", "hybrid", "electric", "gpl", "other" |
sortBy | string | "relevance" | "relevance", "date_desc", "date_asc", "price_asc", "price_desc" |
urls | array | none | Direct Leboncoin search URLs (URL mode, multi-URL) |
maxPages | integer | 2000 | Max pages per search (100 listings per page). The actual page count is bounded by maxListings, so the high default just means "walk until budget hits." |
maxListings | integer | 100 | Total listings cap across all searches; 0 = unlimited |
fetchDetails | boolean | false | Visit each listing's detail page for full body + image gallery (adds 1 fetch per item) |
fetchSellerReviews | boolean | false | Pull the seller's star rating + textual reviews. Adds 1 lightweight call per listing (no extra credits). Empty array for sellers with no reviews yet. |
fetchSellerOtherListings | boolean | false | Pull the seller's other active ads (subject, price, URL, image). Adds 1 lightweight call per listing (no extra credits). Useful for mapping pro-seller catalogues. |
resumeFromRunId | string | none | Continue one specific previous run/dataset: listings already collected there are skipped. For recurring monitoring, use Incremental mode instead β see "Resume & recurring updates" below. |
incrementalMode | boolean | false | Daily/recurring monitoring of this same search. First run returns everything as NEW; later runs return only NEW/UPDATED/REAPPEARED by default. See "Resume & recurring updates" below. |
stateKey | string | none | Incremental mode only. Name this monitoring campaign, or leave empty to derive one automatically from the search/filter/detail settings. |
emitUnchanged | boolean | false | Incremental mode only. Also return listings unchanged since the last run, marked UNCHANGED. Adds and bills extra rows you already have. |
emitExpired | boolean | false | Incremental mode only. Also return listings from a previous run no longer found, marked EXPIRED, once a run has fully scanned the search (not capped, not a resume). Adds and bills extra synthetic rows. |
proxy | object | residential FR | Proxy config; residential required. Default country is FR. Any EU country accepted (DE, BE, IT, ES, NL, PT, AT, CH, LU, IE, DK, SE, FI, PL, CZ, GR, HU, RO, BG). |
Resume & recurring updates
There are two different things here β pick the one that matches what you're doing:
| Need | Use |
|---|---|
| A crawl stopped and should continue | resumeFromRunId |
| Run the same search every day and receive only changes | incrementalMode |
| Keep separate daily campaigns for similar searches | distinct stateKey values |
| Run a normal full snapshot | leave both off |
Resume (resumeFromRunId) continues one specific interrupted or previous large crawl: paste a run ID or dataset ID and this run skips listings already collected there, returning only the remaining new ones.
What counts as a change. A few fields are deliberately not used to decide UPDATED, so a run is not reported as changed by activity that is not the listing itself: view_count, favorite_count, index_date (leboncoin's own re-index timestamp, not the ad's publication_date), and the seller-profile fields seller_rating_avg, seller_review_count, seller_reviews, seller_other_listings_count, seller_other_listings (these describe the seller, not the ad). Every one of these fields is still returned in full on every row β they are excluded only from change detection. So a listing whose seller gains a review is reported UNCHANGED, while a change to the ad itself (price, title, description, photos, location) is reported UPDATED.
Incremental mode (incrementalMode) is for a schedule (for example, daily): the actor remembers the previous run of the same search by itself, so you never paste a run ID. The first run returns everything as NEW. Later runs return only NEW, UPDATED, and REAPPEARED listings by default β duplicates and unchanged listings are suppressed (never pushed, never billed). Turn on emitUnchanged or emitExpired only when you also want those rows returned (and billed for). State is isolated per search/URL and filter/detail-mode setup automatically; set stateKey to name or deliberately share a monitoring campaign.
Identity is tracked by list_id β leboncoin's own ad id (also exposed as the string id field). A handful of fields are excluded from change detection because they are not really "the ad changing": view_count / favorite_count (engagement counters that tick on their own), index_date (a backend reindex timestamp), and the seller_* fields (they describe the seller, not this specific listing β a new review or another ad from the same seller must not flag this one UPDATED).
Scheduled-run example β same search, run daily:
Day 1 (first run ever for this search):
{ "mode": "search", "category": "voitures", "locations": ["Lyon"], "incrementalMode": true }
β every listing comes back with "changeType": "NEW".
Day 2 (the schedule fires again, identical input):
{ "mode": "search", "category": "voitures", "locations": ["Lyon"], "incrementalMode": true }
β listings whose price/attributes/etc. changed come back as "changeType": "UPDATED" with changedFields listing what changed, brand-new listings come back as "changeType": "NEW", listings that vanished and came back come back as "changeType": "REAPPEARED" β and listings that are still there, unchanged, are not returned at all (suppressed, not charged) unless emitUnchanged is on. EXPIRED tombstones for listings no longer found are only produced when emitExpired is on and the run fully scanned the tracked search (not capped by Max listings, not a resume).
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape β the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record β not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify β Settings β Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Output Example
Sample shape, values are illustrative placeholders, not from a live listing.
{"id": "0000000000","list_id": 0000000000,"subject": "Sample Listing Title","body": "Full seller description text appears here when fetchDetails=true.","url": "https://www.leboncoin.fr/ad/voitures/0000000000","category_id": "2","category_name": "Voitures","ad_type": "offer","status": "active","brand": "leboncoin","price": 0,"price_max": null,"price_cents": 0,"publication_date": "2026-01-01 00:00:00","has_phone": true,"is_boosted": false,"city": "Paris","zipcode": "75001","department_id": "75","department": "Paris","latitude": 48.8566,"longitude": 2.3522,"owner_type": "private","owner_name": "Sample Seller","owner_user_id": "00000000","image_count": 5,"thumb_url": "https://img.leboncoin.fr/api/v1/lbcpb1/images/00/00/00/000000.jpg?rule=ad-thumb","image_urls": ["https://img.leboncoin.fr/api/v1/lbcpb1/images/00/00/00/000000.jpg?rule=ad-image"],"attr_year": "2020","attr_mileage": "50000","attr_fuel": "Diesel","attr_gearbox": "Manuelle","raw_attributes": [],"seller_rating_avg": 4.8,"seller_review_count": 42,"seller_reviews": [{"rating": 5,"comment": "Vendeur sΓ©rieux, transaction rapide.","author": "Sample Buyer","created_at": "2026-03-15T12:00:00Z"}],"seller_other_listings_count": 17,"seller_other_listings": [{"id": "0000000001","subject": "Another listing from same seller","price": 9500,"url": "https://www.leboncoin.fr/ad/voitures/0000000001","thumb_url": "https://img.leboncoin.fr/.../thumb.jpg"}]}
seller_* fields are populated only when the corresponding input toggle is on (fetchSellerReviews, fetchSellerOtherListings). Each toggle adds about 0.5 seconds per listing and no additional result charge.
Plan Requirement
Leboncoin.fr's edge filter rejects datacenter traffic. Residential proxy is required β without it, the run will return 0 items. Recommended:
{"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "FR" }}
Country selection: FR is the default and works best (Leboncoin is a French marketplace). If FR returns 0 items on your account, try other EU countries β the actor accepts FR, BE, DE, ES, IT, NL, PT, AT, CH, LU, IE, DK, SE, FI, PL, CZ, GR, HU, RO, BG. Each Apify account has its own pool per country, so quality can vary; experiment with what works for you.
Apify's free plan does not include residential proxy credit. For best results upgrade to Starter or higher (https://apify.com/pricing). Datacenter proxies and non-EU exits will trigger a warning at startup.