How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
vélo électriquein Search keyword. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Leboncoin Scraper collects public listings from Leboncoin in France by keyword, category, place and price, and returns one row per listing with price, city, photos, condition and seller type. No login or API key is needed.
Good for
- A reseller who wants underpriced items in one category or region.
- A market analyst who wants price levels for cars, bikes, phones or flats in France.
- A buyer who wants a daily list of new listings for one search.
- A shop that wants to see what professional sellers ask for similar items.
Who uses it
Resellers
Find underpriced items in one category or region.
Market analysts
See price levels for cars, bikes, phones or flats in France.
Shops
See what professional sellers ask for similar items.
Price
Prices will be shown after release.
Questions
Do I need a Leboncoin account or an API key?
No. The Actor reads public listings without a login.
Can I get the seller's phone number or name?
No. For professional sellers you get the business name when the listing shows it.
Why is a value empty?
The seller did not give it, or the category does not have it. For example, condition is empty in many categories.
Why does the price differ for listing links?
Each listing link goes through a slower route, and this costs more to run. Search rows have the same fields, so a search is the better choice for many listings.
How do I get only new listings every day?
Turn on onlyNew, add a stateName and create a schedule. The first run saves the newest listings, up to maxItems. Later runs save and charge only the ones that appeared since.
How fresh is the data?
Each row shows the site at the time of the run. The scrapedAt field gives this time. A listing can change or end after that.
Details
Step by step on Apify
- Open the Input tab. Keep
vélo électriquein Search keyword or type your own (box 1 in the picture). - Keep Max listings per search at 20 for a first test (box 2). This is the value the form suggests. If you leave the field out in the API, the limit is 100.
- Click Start.
- Open the Listings table in the Output tab. Check Title and Price (€) (box 4 in the picture).
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Track prices of one product in France | query, category, maxItems | Listing | price, oldPrice, postedAt, city | Export to a sheet on a schedule |
| Spot resale deals below your price | query, maxPrice, sortBy, excludeTerms | Listing | title, price, condition, url | Send a summary to Slack |
| Monitor new listings for one search | searchUrls, onlyNew, stateName | New listing | listingId, title, price, url | Schedule and webhook |
| Compare professional sellers | category, sellerType, includeSellerStats | Listing with seller details | sellerName, sellerSiren, price, sellerStats | Export to CSV |
| Study real estate or car prices in one area | category, location, minRooms, minSurface or a search link | Listing | price, attributes, zipcode, department | Export to your analysis tool |
Tips for better results
- One search shows at most 3,500 listings. Search without a place to go deeper.
- A keyword also matches the description. Use titleOnly or a category.
- Turn on onlyNew, add a stateName and set a schedule to get only new listings.
Limits and good to know
- One search shows at most 3,500 listings. This is a limit of the site. A search with no place and a
maxItemsabove 3,500 is split by department to go deeper. A search with a place stops at 3,500 and says so - The maximum is 20,000 listings per search, 21 keyword searches and 20 search links per run, and 100 listing links per run
- Time. On our runs, 500 listings took about 1 minute, 3,500 listings took about 3 to 5 minutes and 20,000 listings took 14 to 28 minutes. Listing links are slower: 100 links took about 7 to 14 minutes. A run can take longer when the site slows down requests. The default run timeout is 60 minutes, and a run works for at most 60 minutes even with a higher timeout. Start several deep searches as separate runs. A run that reaches the time limit keeps its rows and says so
- Monitoring memory.
onlyNewremembers the last 50,000 listings for each search and the newest date it reached. If more new listings appear thanmaxItems, the rest arrive with the next run. A listing the source indexes more than 2 hours late, or that sits behind a full page of listings you already got, counts as old. With narrow filters on a very busy search, a run can stop after 1,000 listings with no match and end as partial. New matches above that point are saved, but a match further down may not arrive - Filter stop. If none of the last 1,000 listings pass your filters, the search stops and says so. This protects you from a long scan with no results
- Newest first follows the date of the last republish. Paid or republished listings can have an older
postedAt - A keyword also matches the description. A search for
vélo électriquecan return flats and cars that mention one. UsetitleOnlyorcategory - No private data. The Actor does not collect phone numbers or private sellers' names. Phone numbers and emails are masked in listing text. It does not read messages or accounts
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"listingId": "3302515620",
"url": "https://www.leboncoin.fr/ad/velos/3302515620",
"title": "Vélo électrique GIANT",
"price": 80,
"oldPrice": null,
"currency": "EUR",
"buyerFee": 1.99,
"category": "Vélos",
"categoryId": "55",
"location": "Périgueux 24000",
"city": "Périgueux",
"zipcode": "24000",
"department": "Dordogne",
"region": "Aquitaine",
"postedAt": "2026-11-05T00:54:35.000Z",
"imageCount": 5,
"attributes": {
"bicycle_type": "Vélo électrique",
"bicycle_brand": "Giant"
},
"condition": null,
"adType": "offer",
"status": "active",
"sellerType": "private",
"sellerName": null,
"sellerStats": null,
"searchQuery": "vélo électrique",
"searchUrl": null
}Data fields (40)
| Field | Type | Meaning |
|---|---|---|
listingId | string | Leboncoin listing id (the number at the end of the listing URL). |
url | string | Public listing page on www.leboncoin.fr. |
title | string | Listing title. Phone numbers and e-mail addresses are masked. |
description | string | Full listing text. Phone numbers and e-mail addresses are masked. |
price | number | Price in euros, with cents when the seller set them. |
oldPrice | number | Earlier price when the seller lowered it. |
currency | string | EUR when the listing has a price. |
buyerFee | number | Protection fee Leboncoin adds for the buyer, in euros. |
shippingFees | array | Delivery options with their price in euros. |
category | string | Category name as Leboncoin shows it. |
categoryId | string | Leboncoin category id, the same value as the Category input. |
location | string | City and postcode as one line. |
city | string | City. |
zipcode | string | Postcode. |
department | string | Department name. |
departmentId | string | Department number. |
region | string | Region name, in the pre-2016 regions Leboncoin uses. |
regionId | string | Leboncoin region id. |
latitude | number | Approximate latitude of the listing. |
longitude | number | Approximate longitude of the listing. |
postedAt | string | First publication date in UTC (ISO 8601). |
indexedAt | string | Last time the listing was republished or updated, in UTC (ISO 8601). |
expiresAt | string | When the listing expires, in UTC (ISO 8601). |
images | array | Photo URLs in the largest size available. |
imageCount | integer | Number of photos. |
attributes | object | Category details as labels, e.g. mileage, surface, energy class, bike type. |
condition | string | Item condition as Leboncoin shows it. |
adType | string | offer, or demand for wanted listings. |
status | string | Listing status at the source. |
urgent | boolean | The seller marked the listing as urgent. |
boosted | boolean | The seller paid to show the listing higher. |
shippable | boolean | The listing offers delivery. |
hasPhone | boolean | The seller has a phone number on the listing. The number itself is never collected. |
sellerType | string | pro or private. |
sellerName | string | Business name of a professional seller. Always empty for private sellers. |
sellerSiren | string | French company number (SIREN) of a professional seller. Always empty for private sellers. |
sellerStoreId | string | Leboncoin store id of a professional seller. Always empty for private sellers. |
sellerStats | object | With "Add seller statistics": registration date, number of ads, reply rate, reply time, badges and rating. |
searchQuery | string | Keyword of the search that found this listing. |
searchUrl | string | Search link that found this listing. |
Input settings (25)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Search keyword | query | string | "vélo électrique" |
| Category | category | string | "" |
| Place | location | string | |
| Minimum price (€) | minPrice | integer | |
| Maximum price (€) | maxPrice | integer | |
| Max listings per search | maxItems | integer | 20 |
| Search links | searchUrls | array | |
| Listing links or ids | adUrls | array | |
| More search keywords | moreQueries | array | |
| Radius around the place (km) | radiusKm | integer | |
| Seller type | sellerType | string | "all" |
| Sort by | sortBy | string | "newest" |
| Maximum listing age (days) | maxAgeDays | integer | |
| Minimum rooms | minRooms | integer | |
| Maximum rooms | maxRooms | integer | |
| Minimum surface (m²) | minSurface | integer | |
| Maximum surface (m²) | maxSurface | integer | |
| Listing type | adType | string | "offer" |
| Search in titles only | titleOnly | boolean | false |
| Urgent listings only | urgentOnly | boolean | false |
| Free items only | freeOnly | boolean | false |
| Shippable items only | shippableOnly | boolean | false |
| Exclude words in titles | excludeTerms | array | |
| Add seller statistics | includeSellerStats | boolean | false |
| Only new listings since last run | onlyNew | boolean | false |
