Leboncoin Scraper - Classifieds, Prices, Sellers & Listings avatar

Leboncoin Scraper - Classifieds, Prices, Sellers & Listings

Pricing

from $0.80 / 1,000 results

Go to Apify Store
Leboncoin Scraper - Classifieds, Prices, Sellers & Listings

Leboncoin Scraper - Classifieds, Prices, Sellers & Listings

Scrape Leboncoin.fr classifieds across cars, property, jobs, electronics, furniture and 35+ categories. Extract 60–78 fields including prices, GPS coordinates, seller details, attributes and images. Supports filtered searches, URLs, pagination and listing deduplication.

Pricing

from $0.80 / 1,000 results

Rating

5.0

(1)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

10

Total users

0

Monthly active users

9 days ago

Last modified

Features

Limited permissions

Share

Leboncoin Scraper: Cars, Property, Jobs & 39 More Categories

Leboncoin Scraper turns leboncoin.fr classified listings into clean structured data. Search by filters or paste a Leboncoin search URL, and get 60 to 80 flat fields per listing: price, GPS coordinates, seller info, category attributes such as mileage, fuel type, year, rooms and surface area, plus the full image gallery. Optionally enrich every listing with the full description, seller ratings and a seller's other active ads. Export to JSON, CSV or Excel, or pull results straight into your app through the API.

Why This Scraper?

  • Two ways to search. Build a search from filters (category, location, price, and more), or paste one or more Leboncoin search URLs and let the actor walk them forward.
  • 60 to 80 flat fields per listing. Price, location down to GPS coordinates, full seller info, and every category-specific attribute the site returns (mileage, fuel, rooms, surface area, and more), not a hard-coded subset.
  • Multi-location and multi-category in one run. Search several cities or paste several search URLs, and get a fair share of listings from each.
  • Optional detail-page enrichment. Turn on a single input to also fetch the full description text and the complete image gallery for each listing.
  • Optional seller enrichment. Pull a seller's star rating and written reviews, or their other active listings, useful for mapping professional sellers' catalogues.
  • Per-search budget. Max listings is shared fairly across every location or URL in the run, so a multi-city search returns a sample from every city instead of exhausting the budget on the first one.
  • Built for schedules. Turn on Incremental mode to get only new and changed listings on repeat runs of the same search, or use Resume to continue one interrupted crawl.

Use Cases

  • Car and vehicle market research: track prices, mileage and listing volume for specific makes, models or regions.
  • Property market monitoring: collect listings by city, price band, surface area and room count for rental or sale market analysis.
  • Lead generation for pro sellers: filter by seller type and category to find active listings worth reaching out about.
  • Price tracking and alerts: run the same search on a schedule with Incremental mode to catch new listings and price changes as they happen.
  • Marketplace and competitor analysis: map a professional seller's full catalogue with the seller-other-listings enrichment.

Data You Get

Sample shape: values are illustrative placeholders, not from a live listing.

FieldExample
id"1234567890"
list_id1234567890
subject"Sample Listing Title"
body"Full seller description text appears here when fetchDetails=true."
url"https://www.leboncoin.fr/ad/voitures/1234567890"
category_name"Voitures"
ad_type"offer"
status"active"
price0
publication_date"2026-01-01 00:00:00"
expiration_date"2026-04-01 00:00:00"
has_phonetrue
is_boostedfalse
city"Paris"
zipcode"75001"
department"Paris"
latitude / longitude48.8566 / 2.3522
owner_type"private"
owner_name"Sample Seller"
image_count5
image_urls["https://img.leboncoin.fr/...jpg", "..."]
attr_regdate"2020"
attr_mileage"50000"
attr_fuel"Diesel"
attr_rooms"3 pièces"

Category attributes (attr_*) vary by category: cars carry mileage, fuel and gearbox, property carries rooms, surface area and energy rating. The full set the site returns for a listing is preserved in a raw_attributes array (each entry has key, value and value_label) alongside the flattened attr_* fields. When fetchSellerReviews or fetchSellerOtherListings is on, each listing also carries seller_rating_avg (out of 5), seller_review_count (ratings the seller has received) and a seller_reviews array (written reviews only, each rated out of 5; Max reviews of them, 20 by default), or seller_other_listings_count and a seller_other_listings array of that seller's other active ads, with empty results for sellers with no reviews or no other listings.

Every record also carries structured groups built from the same data, so either style of consumer can read it: title, description, category, listing_type, details, ids, location, seller, pricing (amount, cents, price per square metre when the ad exposes a surface), property (type, surface, rooms, floor, energy rating, and similar, filled when the category has them, otherwise null), media.images, dates, commerce, metrics, listing_details, source_context (seed, loaded URL, page index, scrape time) and source_data. These groups add no extra charge and do not affect change detection in incremental mode.

How to Use

  1. Pick a mode: Search by filters, or Direct URLs (paste one or more Leboncoin search URLs).
  2. In search mode, set a category, locations and any value filters (price, rooms, mileage, fuel, seller type).
  3. Switch on detail-page or seller enrichment if you need the full description, image gallery, or seller ratings.
  4. Set Max total listings to control run size and cost, then click Start.

Search cars in Paris under 15,000 EUR:

{
"mode": "search",
"category": "voitures",
"locations": ["Paris"],
"maxPrice": 15000,
"maxMileage": 50000,
"fuel": "diesel",
"sortBy": "price_asc",
"maxListings": 100
}

Search across multiple cities, professional sellers only:

{
"mode": "search",
"category": "ventes_immobilieres",
"locations": ["Paris", "Lyon", "Marseille", "Bordeaux"],
"minSquare": 40,
"maxSquare": 120,
"rooms": ["2", "3", "4"],
"ownerType": "pro",
"maxListings": 200
}

Paste Leboncoin search URLs, with detail enrichment:

{
"mode": "url",
"urls": [
"https://www.leboncoin.fr/recherche?category=2&locations=Paris",
"https://www.leboncoin.fr/recherche?category=9&locations=Lyon"
],
"fetchDetails": true,
"maxListings": 200
}

URL mode shapes. Supported: search pages (/recherche?..., with or without www, including page=, sort=/order=, price=, owner_type= and locations=City_ZIP), category pages (/c/<category>), single ads (/ad/<category>/<id>, one record, tracking parameters ignored), pro shops (/boutique/<id>) and seller profiles (/profile/<uuid>, which lead to the seller's shop). A shop or profile page shows only the seller's first ten listings and ignores page numbers, so the actor reads the rest of that seller's catalogue through the site's search filtered on the seller (a shop with 460 listings returned all of them up to your listing limit). The older /<category>/<id>.htm form and m.leboncoin.fr are not supported: such a URL is skipped with a clear warning in the log. The sort order input, when set, overrides the sort in a pasted URL. limit is accepted as an alias of Max total listings. A pasted page=N search URL starts at page N. The default list holds nine distinct targets; the pre-filled examples add three accepted forms (the bare host, a /c/<category> page equal to a category search, and an ad URL with tracking parameters) that resolve to a target already in the default list, so twelve examples are shown in all. A locations=City_ZIP token needs a real postcode (Lyon_69003); an umbrella code the site has no listings for, such as Lyon_69000, matches nothing on the site itself. In search mode (the default) the URLs field is ignored, so an API call that sets only keywords or locations never scrapes the sample URLs.

Behaviour change: URL mode with the URLs field left untouched now scrapes one example URL per supported shape (search, category, single ad, shop, profile) instead of asking for input. Clear the field and paste your own URLs for a targeted run.

Free-text query with seller enrichment:

{
"mode": "search",
"text": "iphone 14 pro",
"category": "telephonie",
"locations": ["Paris", "Lyon"],
"fetchSellerReviews": true,
"maxListings": 50
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/leboncoin-fr-scraper").call(run_input={
"mode": "search", "category": "voitures", "locations": ["Paris"], "maxListings": 50
})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
print(listing["subject"], listing["price"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/leboncoin-fr-scraper').call({
mode: 'search', category: 'voitures', locations: ['Paris'], maxListings: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Dataset views

The dataset has five views: Overview (listing fields), Sellers, Seller reviews (one row per review, needs fetchSellerReviews), Changes (incremental changeType, changedFields and priceChanges) and Detail (description and gallery). A run summary is saved under the OUTPUT key of the key-value store.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one specific interrupted or previous large crawl: paste a run or dataset ID and this run skips listings already collected there, returning only the new ones.
  • Incremental mode (incrementalMode) is for running the same search again and again, for example daily. The actor remembers the previous run of the same search itself, so you never paste a run ID. The first run returns everything as NEW. Later runs return only NEW and UPDATED listings by default (duplicates and unchanged listings are suppressed, never pushed, never billed). REAPPEARED is produced only for a listing that was previously marked EXPIRED and then shows up again, so it only appears in monitoring campaigns that also use emitExpired. Turn on emitUnchanged or emitExpired only when you also want those rows returned and billed. State is kept separately per search/filter setup automatically; set stateKey to name or deliberately share a monitoring campaign. What is compared: every output field of a listing against the copy saved by the previous run, and changedFields names what moved. What is excluded: view and favourite counters, the site's re-index timestamp and the seller's rating, reviews and other-listings fields never count as a change (they are still returned). ignoreFieldsForChanges adds your own fields to that exclusion, as top-level names or dotted paths into nested fields (for example owner_raw.name); changing it starts a separate baseline unless you set stateKey. changeScope set to priceAndStock narrows the comparison to price, price range and ad status only, compactUpdates returns slim UPDATED and EXPIRED rows (identifiers, current price and status, priceChanges with old and new values; NEW rows stay full), and expireAfterMissedScans waits for that many complete scans in a row before a missing listing is marked EXPIRED. EXPIRED means the listing is no longer found in the search, not that it was confirmed sold or removed. EXPIRED is only produced after a complete walk of the search from its first page to its natural end: a pasted URL starting after page 1, a run capped by Max pages or Max listings, a failed page fetch or a Resume run never expire anything. Every option here is off by default and the output of existing schedules is unchanged.
  • EXPIRED rows (listings from a previous run no longer found) are produced only once a run has fully scanned the tracked search, not when Max listings capped it and not on a Resume run, and only with emitExpired on.
  • A handful of fields (view_count, favorite_count, index_date, and the seller_* fields) are excluded from change detection because they describe engagement or the seller rather than the listing itself; they are still returned in full on every row.

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 listing, 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.

  1. Authorize a connector once under Apify > Settings > Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. If the picker is empty, you have not authorized a connector yet.
  3. For Notion, also set notionParentPageUrl to 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.

Input Parameters

ParameterTypeDefaultDescription
modestring"search""search" builds the URL from filters, "url" takes raw Leboncoin search URLs.
textstringnoneFree-text keyword query. Search mode only.
categorystring"all"Top-level category (cars, property, electronics, jobs, and more). Search mode only.
locationsarraynone (prefill: ["Paris"])City names, postcodes, or metropolitan department codes ("75" or "69_d"). Corsica and the overseas departments are not accepted as department codes, use a city name there. Search mode only.
minSquareintegernoneMinimum surface area in m² (property categories). Search mode only.
maxSquareintegernoneMaximum surface area in m² (property categories). Search mode only.
minMileageintegernoneMinimum mileage in km (vehicle categories). Search mode only.
maxMileageintegernoneMaximum mileage in km (vehicle categories). Search mode only.
urlsarrayone example per supported URL shape (see below)Leboncoin URLs to scrape. URL mode only, multi-URL supported. startUrls is accepted as an alias.
ownerTypestring"all"Filter by seller type: "all", "private", "pro". Applies in both modes.
minPriceintegernoneMinimum price in EUR. Applies in both modes.
maxPriceintegernoneMaximum price in EUR. Applies in both modes.
roomsarraynoneNumber of rooms (property categories). Applies in both modes.
fuelstring"all""all", "petrol", "diesel", "hybrid", "electric", "gpl", "other". Applies in both modes; a ?fuel= segment inside a pasted URL is ignored, set this input instead.
sortBystring"relevance""relevance", "date_desc", "date_asc", "price_asc", "price_desc". Applies in both modes; in URL mode it overrides the pasted URL's own sort.
maxPagesinteger0Max pages per search (about 100 listings per page). 0 walks until maxListings or the end of results; a hard cap of 1000 pages per search always applies.
maxListingsinteger20Total listings cap across all searches. 0 = unlimited.
fetchDetailsbooleanfalseVisit each listing's detail page for the full description, image gallery and extra attributes. Adds about 1 second per listing. Each delivered enriched listing is charged as one detail-page event on top of the per-result charge; listings the site refuses, listings skipped with the toggle off, and listings incremental mode suppresses as unchanged are not charged.
maxReviewsinteger20Reviews returned per seller when fetchSellerReviews is on (1 to 200, fetched page by page). Each review carries rating (out of 5), text, author_name, date and replies, an empty list unless the seller answered (reply posting is disabled on the accounts sampled, so expect it to be empty). No extra charge: billing is unchanged.
fetchSellerReviewsbooleanfalseFetch the seller's star rating and written reviews per listing. Adds about 0.5 seconds per item.
fetchSellerOtherListingsbooleanfalseFetch the seller's other active ads per listing. Adds about 0.5 seconds per item.
resumeFromRunIdstringnoneContinue one specific previous run or dataset: listings already collected there are skipped.
incrementalModebooleanfalseReturn only new and changed listings on repeat runs of the same search.
changeScopestring"all""all" or "priceAndStock" (price, price range and ad status only decide UPDATED). Incremental mode only.
compactUpdatesbooleanfalseSlim UPDATED and EXPIRED rows with priceChanges; NEW rows stay full. Incremental mode only.
expireAfterMissedScansinteger1Complete scans in a row a listing must be missing before it is marked EXPIRED. Needs emitExpired.
ignoreFieldsForChangesarray[]Field names or dotted paths that never make a listing UPDATED. Incremental mode only.
stateKeystringnoneName a monitoring campaign, or leave empty to derive one automatically from the search settings.
emitUnchangedbooleanfalseAlso return (and bill) listings unchanged since the last run.
emitExpiredbooleanfalseAlso return (and bill) listings from a previous run no longer found, once a run has fully scanned the search.
proxyobjectnone (prefill: Apify Proxy, residential, country AT)Connection settings. A residential connection is required.
mcpConnectorsarraynoneOptional: send a summary of each listing to apps you authorized under Integrations.
notionParentPageUrlstringnoneNotion connector only: page under which listing pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run.

Output Example

Sample shape: values are illustrative placeholders, not from a live listing.

{
"id": "1234567890",
"list_id": 1234567890,
"subject": "Sample Listing Title",
"body": "Full seller description text appears here when fetchDetails=true.",
"url": "https://www.leboncoin.fr/ad/voitures/1234567890",
"category_id": "2",
"category_name": "Voitures",
"ad_type": "offer",
"status": "active",
"price": 0,
"publication_date": "2026-01-01 00:00:00",
"has_phone": true,
"is_boosted": false,
"city": "Paris",
"zipcode": "75001",
"department": "Paris",
"region": "Ile-de-France",
"latitude": 48.8566,
"longitude": 2.3522,
"owner_type": "private",
"owner_name": "Sample Seller",
"image_count": 5,
"image_urls": ["https://img.leboncoin.fr/api/v1/lbcpb1/images/00/00/00/000000.jpg?rule=ad-image"],
"attr_regdate": "2020",
"attr_mileage": "50000",
"attr_fuel": "Diesel",
"raw_attributes": [],
"seller_rating_avg": 4.8,
"seller_review_count": 42,
"seller_reviews": [
{
"rating": 5,
"text": "Vendeur serieux, transaction rapide.",
"author_name": "Sample Buyer",
"date": "2026-03-15T12:00:00Z"
}
]
}

Plan Requirement

Leboncoin.fr requires a residential connection. Datacenter connections are refused by the site's bot filter, and some residential exits are refused too; the actor treats a refusal as a bad exit and retries with a different one, so a run can still succeed; a refused page never moves the run onto a backup connection. If you select a non-residential group, the actor tries Apify Residential first. Use the prefilled proxy setting (Apify Proxy, residential, country AT) and keep it when calling the actor via the API, since it has no schema default. Apify free plans do not include residential proxies. Only when the residential connection itself is refused for the account does the log say "The selected connection is unavailable to this run" and the run continues on a backup connection where it can ("Served over the backup connection (the default connection was unavailable)."), though some pages may still fail. You can also supply your own proxy URLs.

When nothing can be read, the run fails with one of these messages instead of returning an empty dataset: "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required", "No results: residential proxies are unavailable on this run ... and the backup connection could not load the requested Leboncoin pages", or "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search."

FAQ

How much does it cost?

Billing uses two events: one charge for each listing saved to the dataset, and one charge when the run starts (scaled by the memory the run uses). Detail-page and seller enrichment (including seller reviews) add time per listing but no extra charge. In incremental mode, suppressed duplicate and unchanged listings are never pushed and never billed. The Pricing tab shows the current rates. Use Max total listings to cap the cost of any run.

This actor collects only publicly available classifieds data. You are responsible for how you use it: follow Leboncoin's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Seller-supplied text, photos and contact details may be subject to third-party rights, handle personal data carefully.

Can I get only new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated listings, and unchanged ones are not billed. EXPIRED and REAPPEARED rows require also turning on emitExpired, and only appear once a run has fully scanned the tracked search.

Why did my run return 0 listings?

The most common cause is a non-residential or non-EU connection. Leboncoin's site rejects non-residential traffic outright, so keep the connection type set to residential. If the default country returns 0 items on your account, try a different EU country in the proxy settings.

Why did my run fail instead of returning an empty dataset?

If every connection attempt is refused during startup, the run stops with a clear message so "no listings match this search" is never confused with "the site could not be reached at all." Run it again in a few minutes. A search that genuinely has no matches still returns a normal empty result rather than failing.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

🔗 Want more classifieds data?

Pair this actor with these related scrapers from the same team:

🏷️ Mudah.my Cars, Property, Jobs & Marketplace Scraper
Scrape Mudah.my listings across every category: cars, motorcycles, property, mobiles...
🏷️ Kijiji.ca Scraper
Scrape Kijiji.ca listings across property, vehicles, jobs, electronics, furniture...
🏷️ Subito.it Scraper
Scrape Subito.it listings across cars, real estate, marketplace, jobs, and more. Search...
🚗 Willhaben.at Scraper
Scrape Willhaben.at listings into clean JSON with 40+ structured fields, including...
🏷️ Tutti.ch Scraper
Scrape listings from tutti.ch across all 23 categories, including vehicles, property...
🏷️ FINN.no Jobs Scraper
Scrape active FINN.no job listings by search filters or URL. Extract 30+ fields including...

👉 Browse all abotapi scrapers

💬 Support

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.