Leboncoin Scraper: Ads, Prices, Real Estate & Cars
Pricing
from $0.57 / 1,000 ads
Leboncoin Scraper: Ads, Prices, Real Estate & Cars
Scrape Leboncoin ads by keyword, category, town, postal code, department or region, or from search and ad links, no login. Rows carry the full description, price, photos, every attribute, immobilier surface, rooms and DPE, car make, year and mileage. New ad monitor, CSV or API; pay per ad.
Pricing
from $0.57 / 1,000 ads
Rating
0.0
(0)
Developer
Automation Craft
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Leboncoin Scraper: Ads, Prices, Real Estate & Cars
Leboncoin Scraper turns Leboncoin (leboncoin.fr), France's classifieds site, into clean rows: one row per ad with the title, the full description, the price, the category, the town, postal code, department and region, map coordinates, photo links, every attribute with Leboncoin's own labels, named real estate fields (surface, rooms, bedrooms, DPE, price per m2, notary fees, rent and charges) and named car fields (make, model, year, mileage, fuel, gearbox, Leboncoin's own price range). Search by keyword, category and place (a town, a postal code, a department, a region or coordinates with a radius), paste Leboncoin search links, give ad links, or read a seller's ads. No login, no browser.
Turn on Ad details for each ad's favourites count, and Seller profiles for the seller's public profile (member since, reply rate, ratings, badges; a professional's company, SIREN, SIRET, address and shop). Name a monitor and schedule the Actor: each run delivers and bills only ads it has not delivered before, and can send them to your webhook or Telegram chat.
Who uses it
- Buyers and resellers watching a town or a department for new ads in a category, newest first, on a schedule.
- Real estate investors and agents reading Ventes immobilières and Locations with surface, rooms, DPE, price per m2, notary fees, rent and charges.
- Car dealers and car buyers reading Voitures with make, model, year, mileage, fuel, gearbox and Leboncoin's own price range for the car.
- Market analysts and data teams who need French classifieds as rows in JSON, CSV or Excel, through the Apify API.
Features
| Feature | Settings | Event billed |
|---|---|---|
| Keyword search, in titles only if you like, with words to leave out | keywords, searchInTitleOnly, excludeKeywords | Ad |
| Leboncoin's 96 categories by id, French name or slug (a parent category covers its children) | categories | Ad |
| Places: a town, a town with its postal code, a postal code, a department (name or number), a region, coordinates; a radius in km | locations, radiusKm | Ad |
| Pasted Leboncoin search links, every parameter read | searchUrls | Ad |
| Single ads by link or id | adUrls | Ad by URL |
| Every active ad of a seller | sellerIds | Ad |
| Price range, private or professional sellers, offers or wanted ads, urgent ads, free items (dons), shippable ads | minPrice, maxPrice, sellerType, adType, urgentOnly, freeItemsOnly, shippableOnly | no charge |
| Posted within N days or N hours (Leboncoin's first publication date), or on or after a date | postedWithinDays, postedWithinHours, postedAfter | no charge |
On the market at least N days (every row carries daysOnMarket and longOnMarket, 90 days or more; Leboncoin orders by last update and renewed ads keep their first publication date, so older ads are spread through every order), ads with photos only, ads you already have left out | minDaysOnMarket, withPhotosOnly, excludeAdIds | no charge |
| Real estate filters: property type, rooms, bedrooms, living area, land area, DPE, furnished | propertyTypes, roomsMin, roomsMax, bedroomsMin, bedroomsMax, surfaceMin, surfaceMax, landSurfaceMin, landSurfaceMax, energyClasses, furnished | no charge |
| Car filters: make, fuel, gearbox, year, mileage | carBrands, fuelTypes, gearbox, yearMin, yearMax, mileageMin, mileageMax | no charge |
| Any other Leboncoin filter by its own key (floor, elevator, holiday capacity, vehicle type, condition) | filters | no charge |
| Sort: newest, oldest, price low or high, relevance | sort | no charge |
| Caps per run, per search and per search in pages | maxItems, maxItemsPerSearch, maxPagesPerSearch | no charge |
| Favourites count and the ad's newest state, read from each ad's own record | includeAdDetails | Ad detail |
| Seller profiles, once per seller per run; sellers you already have can be skipped | includeSellerProfiles, skipSellerIds | Seller profile |
| A monitor: only ads new to it, run after run | monitorName | Ad (new ads only) and Results page |
| Price changes and removals: a known ad whose price moved comes back with its previous price, price history and drop; an ad your complete searches no longer find gets a removed row (sold, withdrawn, expired) | trackChanges (with a monitor) | Ad update |
| Leboncoin's own price drop on the ad (its old price) in percent | always | included |
| Webhook (signed with HMAC SHA-256) and Telegram notifications of each run's ads | webhookUrl, webhookSecret, telegramBotToken, telegramChatId | free |
| A private seller's name, written phone numbers and e-mail addresses, exact coordinates (off by default) | includePersonalData | free |
| Fail the run when a search could not be read to its end | failIfIncomplete | free |
| Apify residential proxies in France (included in the price) or your own proxy links; a gentle pace | proxyConfiguration, requestsPerSecond | included |
A coverage row per search, free status rows for misses (20 a run plus one per paid event, then the first of each kind), a run summary that counts every miss, and an HTML run report (key REPORT) | always | free |
Quick start
- Type a keyword (for example
velo electrique,appartement T3orclio 4) and a place (for exampleParis,Lyon 69003,33000,Rhône,69orBretagne). - Optional: pick a category (
Voitures,Ventes immobilières,Locationsor an id such as2), a price range, a seller type, or the real estate and car filters. - Set Maximum ads and press Start.
- Download the rows as JSON, CSV or Excel, or read them through the API.
Example input, the Actor's own prefill:
{"keywords": ["velo"],"locations": ["Paris"],"maxItems": 20}
Apartments for sale in Lyon with 3 rooms or more and a DPE of A to C, with seller profiles:
{"categories": ["Ventes immobilières"],"locations": ["Lyon"],"propertyTypes": ["apartment"],"roomsMin": 3,"energyClasses": ["a", "b", "c"],"includeSellerProfiles": true,"maxItems": 200}
Cars from professionals in Gironde, 2018 or newer, under 80,000 km, cheapest first:
{"categories": ["Voitures"],"locations": ["33"],"sellerType": "pro","yearMin": 2018,"mileageMax": 80000,"sort": "price_low","maxItems": 100}
What you get
One row per ad (type: "ad"), one coverage row per search (type: "search"), free status rows for anything that did not end
as an ad (type: "status"), with Track price changes a removed row per ad a monitor no longer finds (type: "removed"), and
one run summary at the end (type: "summary"). Fill rates below were measured on 1,200 ads
(the 100 newest of each of 12 categories).
Ad fields
| Field | What it holds | Filled |
|---|---|---|
listId, url, title, description | Leboncoin's ad id, the ad's link, the title and the full description | 100 % |
price, priceCents, currency, oldPrice | the asking price in euros (currency EUR), the price before a drop where Leboncoin shows one | price 95.8 % |
priceDropPercent | how far the price is below the old price Leboncoin shows (percent) | where Leboncoin shows an old price (26 of 600 ads) |
publishedAt, updatedAt, expiresAt | first published, last updated, expiry (UTC) | published and updated 100 %, expiry 21.4 % |
daysOnMarket, longOnMarket | whole days since the first publication at the run's start; whether that is 90 days or more | 100 % |
status, adType | active; offer or wanted | 100 % |
categoryId, categoryName, parentCategoryId, parentCategoryName | the ad's category and its parent in Leboncoin's own tree | category 100 % |
city, zipcode, departmentId, departmentName, regionId, regionName | the ad's place | town 99.4 %, the rest 100 % |
latitude, longitude, locationPrecision, coordinatesRounded | map coordinates, address or city level, whether they were rounded (private sellers with includePersonalData off) | coordinates 100 %, address level 44.5 % |
imageUrls, imageCount, thumbnailUrl | photo links | 99.0 % (median 4 photos) |
attributes, features | every attribute of the ad: {key: {value, values, label, valueLabel}}, and equipment lists | attributes 100 % (median 18 an ad) |
sellerType, sellerUserId, sellerStoreId | private or pro, the seller's ids (the same on all ads of one seller) | 100 % |
sellerName, sellerSiren, sellerActivitySector, sellerStoreName | the seller's shown name (a private seller's only with includePersonalData), a professional's SIREN and shop | SIREN on 328 of 332 pro ads |
sellerRatingScore, sellerRatingCount, sellerRefusesCanvassing, proRatesLink | the seller's rating on the ad, whether the seller refuses canvassing, an agency's fee scale link | where Leboncoin shows them |
hasPhone | whether the seller shows a phone number on Leboncoin (the number itself is never read) | 100 %, true on 23.7 % |
urgent, boosted, featuredInGallery, highlighted, topList, extraPhotos | Leboncoin's paid options | at least one true on 7.2 % |
condition, shippable, shippingType, onlinePurchase | item condition, delivery and online purchase | where Leboncoin has them |
favorites, detailsIncluded | how many users saved the ad (with Ad details on, and on every ad link row), whether a search row's own record was read | Ad details on and ad links |
sellerProfile, sellerProfileCharged | the seller's public profile (with Seller profiles on); whether this row carried the seller's one charged profile of the run | Seller profiles on |
change | with Track price changes: on a known ad delivered again because its price moved, changeType, previousPrice, firstSeenPrice, firstSeenAt, priceChangeCount, priceDropPercentSinceFirstSeen, priceHistory (up to 6 dated prices), daysSinceLastChange, lastPriceChangeAt; null on other rows | Track price changes on |
source, searchKey, searchLabel, page, rank, monitorName, deliveryId, scrapedAt | what found the ad (fields, searchUrl, seller or adUrl), the search, its page and rank, the monitor (monitor runs), when the row was made | set by the Actor on every row |
Removed rows (trackChanges)
listId, reason (notFoundByCompleteSearches), message, lastPrice, firstSeenPrice, priceChangeCount, firstSeenAt,
publishedAt (day), daysOnMarket, monitorName, scrapedAt. Written only when every search of the run was read to its end,
the monitor has no ad links and no posted window, and fewer than half of the tracked ads are missing at once (more points to a
fault at the source; the next complete run compares again). An ad is reported once; if it comes back it is tracked again.
Real estate, car and holiday rental fields
| Object | Fields | Filled (100 ads each) |
|---|---|---|
realEstate (Ventes immobilières, Locations, Colocations, Bureaux & Commerces, Immobilier Neuf) | propertyType, saleType, surface, rooms, bedrooms, bathrooms, landSurface, energyClass, gesClass, furnished, floor, floorsInBuilding, elevator, parkingSpaces, buildingYear, heating, condition, outsideAccess, pricePerSquareMeter, estimatedNotaryFees, estimatedTotalPrice, priceExceptFees, agencyFeesPercent, monthlyCharges, annualCharges, propertyTax, rentExcludingCharges, chargesIncluded, securityDeposit, availableFrom, annualEnergyCostMin, annualEnergyCostMax | sales: property type 100 %, surface 92 %, rooms 89 %, bedrooms 81 %, DPE 77 %, GES 72 %, price per m2 96 %, notary fees 98 %; rentals: surface and rooms 89 %, furnished 88 %, charges 86 %, deposit 83 % |
car (Voitures, Utilitaires) | make, model, version, trim, year, firstRegistration, mileageKm, fuel, gearbox, vehicleType, color, doors, seats, fiscalHorsepower, horsepowerDin, critAir, technicalInspectionValid, leboncoinPriceMin, leboncoinPriceMax, leboncoinPricePositioning, historyReportUrl | make, model, year, mileage, fuel, gearbox 100 %, fiscal horsepower 99 %, Leboncoin's price range 81 % |
holidayRental (Locations saisonnières) | capacity, bedrooms, accommodationType, bookable, rate with ratePeriod (nightly or weekly, as the owner set it), nightlyRate, weeklyRate, minNights, petsAccepted, smokersAccepted, guestRatingScore, guestRatingCount, checkIn, checkOut (the row's price is Leboncoin's price per night) | capacity, type, rate and its period, pets and smokers 100 %, nightly rate 57 %, weekly rate 43 %, bedrooms 90 % |
Each object also has orMore: the count fields where the seller chose Leboncoin's "or more" option (for example seats 7 for "7 ou plus", parkingSpaces 6 for "6 et plus", capacity 12 for "12+ pers."). Rows outside these categories carry realEstate, car and holidayRental as null; their own attributes are in attributes.
Sample row (a real row of the prefill run; some fields and attributes left out)
{"type": "ad","listId": "3269893436","url": "https://www.leboncoin.fr/ad/velos/3269893436","title": "2 Velo pour enfants","description": "Je vends ces 2 vélos pour enfants, parfaits pour accompagner les plus petits dans leurs premières aventures à deux roues.\n- Type de vélo : Vélo enfant\n- Univers : Enfant\n- Marque : B'Twin (Decathlon)\n- Quantité : Lot de 2\n 95€ rose pour fille\n 75€ blan pour garçon\nLes 2 a: 150 €","price": 75,"currency": "EUR","adType": "offer","status": "active","categoryId": "55","categoryName": "Vélos","parentCategoryName": "Loisirs","publishedAt": "2026-09-14T20:24:55.000Z","daysOnMarket": 29,"city": "Paris","zipcode": "75012","departmentName": "Paris","regionName": "Ile-de-France","latitude": 48.85,"longitude": 2.41,"locationPrecision": "address","coordinatesRounded": true,"imageCount": 2,"imageUrls": ["https://img.leboncoin.fr/api/v1/lbcpb1/images/3e/70/31/3e7031507fd71dbdc454d3a3468ff21f975af7d9.jpg?rule=ad-large","https://img.leboncoin.fr/api/v1/lbcpb1/images/94/75/7c/94757c659e3230cc7a099c3a4efa64a6a7d39e55.jpg?rule=ad-large"],"sellerType": "private","sellerUserId": "0b2f0229-be4e-4d2c-9aac-333370240192","sellerName": null,"hasPhone": false,"urgent": false,"condition": null,"shippable": false,"attributes": {"rating_score": {"value": "1","values": ["1"],"label": null,"valueLabel": "1"},"rating_count": {"value": "3","values": ["3"],"label": null,"valueLabel": "3"},"estimated_parcel_weight": {"value": "40000","values": ["40000"],"label": null,"valueLabel": "40000"}},"realEstate": null,"car": null,"source": "fields","searchLabel": "\"velo\" in Paris (75)","page": 1,"rank": 16,"scrapedAt": "2026-10-14T19:39:39.438Z"}
Seller profile (includeSellerProfiles)
memberSince, area, replyRatePercent, replyTimeText, replyMinutes, ratingScore, ratingCount, ratingScores,
badges, activeAds; for a professional also name, description, lastActive, companyName, siren, siret,
activitySector, address, storeName, storeId, storeDescription, storeOpeningHours, storeWebsite, storePhone (the shop's phone, when the shop shows one; Leboncoin limits that call, so a run reads phones until its first refusal,
about 5 shops per run in our tests, then stops asking, and the summary counts storePhonesRead and storePhonesNotRead), storeLogoUrl,
storeAddress, storeActiveSince and storeRating (the shop's rating as Leboncoin shows it). A private seller's profile
carries their name, description, pictureUrl and lastActive only with includePersonalData on. A seller's profile is billed once per run; their later rows carry it
free. A profile that could not be read leaves the row without one, and nothing is billed for it.
Coverage row (one per search)
searchKind, searchLabel, searchKeyword, searchCategoryId, searchPlace, searchRadiusKm, searchSellerId, sort,
adsOnLeboncoin (Leboncoin's total for the search), adsOnLeboncoinPro, adsOnLeboncoinPrivate, pagesRead, adsSeen,
adsDelivered, alreadyDelivered, knownToMonitor, filteredOut and filteredOutBy (per filter), removedOrGone,
detailsFailed, newAdsMayLieBeyond (a monitor), complete, stoppedBy, morePagesOffered and a note.
Free status rows
Each status row has scope (input, place, ad, search or run), key, status, message, input and details: a setting
or an item the Actor refused (invalid), a category or place name that several share or that Leboncoin's place search
answers with another spelling or town (ambiguous, with what it found), a place Leboncoin does not know (unknown_place), an ad that was removed, sold or expired or an id that
never existed (not_found), an ad or a page that could not be read (failed), a search Leboncoin refused as sent
(search_not_applied), an ad link the monitor already delivered (skipped), a webhook or Telegram failure
(notification_failed), and the reason a run stopped (limit_reached, source_unavailable, monitor_unavailable).
The platform bills every row written, so a run writes 20 rows about single ads, places, inputs or searches plus one per paid
event; past that it writes the first row of each kind, counts the rest in the summary (statusRowsNotWritten) and says so in
one run row. The run report (key REPORT) keeps up to 200 coverage rows.
How searches are read
- Past 3,500 ads. Leboncoin's page numbers stop at 3,500 ads (100 pages of 35). Newest first (the default), oldest first
and the price orders are walked with Leboncoin's own cursor past that point, ads without a price included (a platform run read
3,784 of the 3,785 ads Leboncoin counted for one search; an ad added or moved while a walk runs can be missed, and when
Leboncoin's cursor serves a page already read the walk ends there with
stoppedBy: "repeat"). The relevance order is read page by page and stops at 3,500 ads, and the coverage row says so (stoppedBy: "searchCap"). - In order. Ad links are read first, then the searches one after the other (for each place, each keyword with each
category), then search links and sellers, so the first search can take the whole
maxItems; setmaxItemsPerSearchto spread a run over its searches. - Checked on every ad. Leboncoin applies the search's filters, and ignores some values without a word, so every ad of a
search is checked again against your category, place, price, seller type, ad type and every filter before it is delivered
(ad links are delivered as given). An ad
that fails a check is left out free and counted on the coverage row. A count where the seller chose Leboncoin's "or more"
option (seats "7 ou plus") is that number or more: it passes a minimum at or under that number and never a maximum, and is
otherwise left out free, counted as
filter:<key>:orMore. - Places. Departments and regions need no lookup. A town or a postal code is looked up with Leboncoin's own place
search, and only an exact answer is used; another spelling or another town is a free
ambiguousrow naming what Leboncoin found, a place it does not know a freeunknown_placerow, and that place's searches are not read. - Access. Requests leave through one Apify residential exit in France at a gentle pace (0.8 a second by default). An
exit Leboncoin refuses is replaced by a fresh one, up to 6 times a run; after that the run ends with a free
source_unavailablerow. - One row per ad. An ad found by several keywords, places or links in one run is delivered and billed once.
How much does it cost to scrape Leboncoin?
You pay per ad row delivered, plus a small start fee per run. Platform usage and the residential proxy are included.
| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| Ad (per 1,000 ads from searches, search links and sellers) | $0.80 | $0.73 | $0.66 | $0.57 |
Ad by URL (per 1,000 ads from adUrls) | $2.00 | $1.80 | $1.60 | $1.40 |
Ad detail (per 1,000 rows, only with includeAdDetails) | $0.50 | $0.45 | $0.40 | $0.35 |
Seller profile (per 1,000 sellers, only with includeSellerProfiles) | $1.00 | $0.90 | $0.80 | $0.70 |
| Results page (per 1,000 pages of up to 35 ads, monitor runs only) | $4.50 | $4.20 | $3.90 | $3.50 |
Ad update (per 1,000 price changes and removed rows, monitor runs with trackChanges only) | $0.80 | $0.73 | $0.66 | $0.57 |
| Actor start (per run) | $0.0075 | $0.0075 | $0.0075 | $0.0075 |
Platinum and Diamond plans pay the Gold price. The Actor start event is a flat $0.0075, charged once per run, with no plan discount. The Store pricing card shows these same prices per 1,000 events: "$0.73 / 1,000" on the Ad row means one ad costs $0.00073, and "$4.20 / 1,000" on the Results page row means one results page costs 0.42 cents.
- 1,000 ads on the Bronze plan cost 1,000 x $0.00073 = $0.73, plus $0.0075 for the run: $0.7375. The same run costs $0.8075 on Free and $0.5775 on Gold. With Ad details on, 1,000 ads cost $0.73 + $0.45 + $0.0075 = $1.1875 on Bronze.
- 100 ad links on Bronze cost 100 x $0.0018 = $0.18, plus $0.0075: $0.1875.
- A monitor run on Bronze over 2 searches reads at most 3 pages each (6 x $0.0042 = $0.0252); with 12 new ads it costs $0.0252 + 12 x $0.00073 + $0.0075 = $0.04146. Runs without a monitor never pay Results page.
- A tracked monitor run (
trackChanges) on Bronze over a 108 ad search read to its end in 4 pages, finding 3 price changes, 2 removed ads and 1 new ad: 4 x $0.0042 + 5 x $0.00073 + 1 x $0.00073 + $0.0075 = $0.02868. Known ads whose price did not move are free. - What is never billed: ads left out by your filters, an ad found twice in one run, ads a monitor already delivered (unless Track price changes finds their price moved), removed, sold or expired ads and unknown ids, places Leboncoin's place search does not match exactly, a seller's profile on their later rows, coverage, status and summary rows, the run report and the notifications.
- Limits: set Maximum ads and, in the run options, a maximum charge for the run: the Actor stops before it would pass either, and a row whose events do not all fit is withheld whole. A run also spends a small allowance on work that delivers nothing billable (pages whose ads your filters leave out, ads that no longer exist, place lookups), USD 0.0006 plus a share of every paid event it delivers; a long list of searches that mostly find nothing, or a day when Leboncoin answers very slowly, stops early with a free run row that says so. A run writes 20 free rows about single ads, places or searches plus one per paid event; past that it writes the first row of each kind and counts the rest in the summary. Maximum ads counts ads, price changes and removed rows together.
Input
| Setting | What it does |
|---|---|
keywords | search words as you would type them on Leboncoin, up to 100 characters each |
locations | a town (Paris), a town with its postal code (Lyon 69003), a postal code (33000), a department by name or number (Rhône, 69, 2A), a region (Bretagne, or today's Auvergne-Rhône-Alpes), or coordinates (48.8566, 2.3522); without places a search covers all of France |
radiusKm | 1 to 200 km around a town, a postal code or coordinates (coordinates default to 10 km) |
categories | Leboncoin categories by id (2), French name (Voitures) or slug (ventes_immobilieres); every category when left empty |
searchUrls | https://www.leboncoin.fr/recherche?... links (the first page); a parameter the Actor cannot read refuses that link with a free row |
adUrls | ad links (/ad/<category>/<id> or the older .htm links) or ids, each read by id and billed as an Ad by URL |
sellerIds | a seller's id (sellerUserId on every row) or profile link: every active ad of that seller |
minPrice, maxPrice, sellerType, adType, urgentOnly, freeItemsOnly, shippableOnly | price in euros, any, private or pro, offer or wanted, urgent, free items, shippable |
postedWithinDays, postedAfter | ads first published within N days of the run's start, or on or after a date (one of the two) |
| real estate and car filters | propertyTypes, roomsMin to landSurfaceMax, energyClasses, furnished; carBrands (in capitals, as Leboncoin writes them), fuelTypes, gearbox, yearMin to mileageMax |
filters | up to 10 other Leboncoin filters by their own keys: a list of values or {"min": n, "max": n} |
sort | newest (default), oldest, price_low, price_high, relevance |
maxItems | the most ad rows a run delivers (100 when left empty, up to 100,000) |
maxItemsPerSearch, maxPagesPerSearch | caps per search, search link or seller |
includeAdDetails, includeSellerProfiles, skipSellerIds | the two add-ons, and sellers whose profile you already have |
monitorName, webhookUrl, webhookSecret, telegramBotToken, telegramChatId | the monitor and the notifications |
includePersonalData | a private seller's personal data as Leboncoin shows it logged out (off by default; see Privacy) |
failIfIncomplete | mark the run failed when a search or an ad link could not be read to its end (your own caps never count) |
proxyConfiguration, requestsPerSecond | Apify residential in France (default) or your own proxy links; 0.2 to 1 requests a second (0.8 default) |
A run may hold up to 100 searches (places x keywords x categories, plus one per search link and one per seller) and up to 5,000 ad links.
The monitor and notifications
Name a monitor (monitorName) and schedule the Actor (every hour, for example). The monitor remembers every ad it delivered
in a named store this Actor creates for itself, so each run delivers and bills only ads it never delivered before; ads it
already knows are skipped for free. Each run reads the newest 3 pages of 35 ads of each search (set maxPagesPerSearch to
change it) and pays a Results page for each page it reads; when the coverage row says newAdsMayLieBeyond, raise the pages or
run more often. A monitor needs the newest first order. One monitor name belongs to one set of settings: a run with other
settings delivers nothing and gets a free row saying so. A monitor remembers up to 100,000 ads. Runs on one monitor name
should not overlap: a run that finds the name in use by another run reads nothing and gets a free row.
Track price changes and removals (trackChanges, with a monitor; it can be switched on for an existing monitor): the
monitor also remembers each ad's price. A known ad met again with another price is delivered again with change (previous
price, first seen price, up to 6 dated prices, drop in percent since first seen, number of changes, days since the last
change), billed as an Ad update; a known ad whose price did not move stays free. When every search of a run was read to its
end (set maxPagesPerSearch high enough for your searches; the summary's removalCheck says whether the check ran), each ad
the monitor tracks that the run did not meet gets a removed row, also an Ad update: sold, withdrawn, expired, or changed so
that your searches no longer find it. A run that misses more than half of the tracked ads at once reports none (a fault at
the source is likelier) and the next complete run compares again. Not with ad links or a posted window, which let ads leave
the searches for other reasons.
Notifications (free, with or without a monitor) send the ads a run delivered after they were delivered and billed:
- Webhook (
webhookUrl, an https address): JSON batches of 100 ads, up to 1,000 a run, each ad withlistId,url,title,price,city,zipcode,categoryName,sellerType,publishedAt,imageUrlandsearchLabel. WithwebhookSecret, the headerx-signature-sha256carries the HMAC SHA-256 of the body. - Telegram (
telegramBotTokenof your own bot andtelegramChatId): one message per ad with its title, price, place and link, up to 30 messages a run, the last one counting the rest.
A failed call never fails the run: it is a free notification_failed row, without your address or token.
Privacy and personal data
A private seller's personal data is delivered only when you turn on includePersonalData (off by default). With it off, a
private seller's shown name (sellerName) and profile picture are not delivered, their street view link is left out, their
address level coordinates are rounded to 2 decimals (about 1 km), phone numbers and e-mail addresses written into their title,
description and attribute values are replaced with [numéro masqué] and [e-mail masqué] (a wide rule: another 10 digit
figure starting with 0 can be replaced too; a number written in words is not detected), and their shown name is replaced with
[nom masqué] in their own title and description. With it on, all of these come as Leboncoin shows them logged out, and the
seller profile add-on adds the private seller's name, profile description, picture and last activity. An ad whose seller type
Leboncoin does not state counts as private. A professional's row is business data and is never masked: name, SIREN, SIRET,
address, shop and the contact details written into its texts. The seller's ids stay in every case, so ads of one seller can be
grouped. Phone numbers that Leboncoin shows only to signed in users are never read. Photos are delivered as links to
Leboncoin's image host; they belong to the people who posted them. You are responsible for a lawful use of personal data,
GDPR included.
Legal
This Actor is not affiliated with, endorsed by or sponsored by Leboncoin or LBC France. Leboncoin is a trademark of its owner. Leboncoin's terms forbid automated extraction, and French law protects its database (the database producer's right, articles L342-1 to L343-4 of the Code de la propriété intellectuelle). You are responsible for a lawful use of the data, which means a use of non substantial parts of the database and no repeated and systematic extraction of non substantial parts that goes beyond a normal use of it (article L342-2, which matters for a monitor run on a schedule), and for complying with the GDPR for any personal data.
What this Actor does NOT do
- No phone numbers behind an ad's "show number" button. Leboncoin shows them only to signed in users and this Actor
never signs in. A professional's shop phone comes with Seller profiles (
storePhone), and numbers the seller writes into the ad come with the ad (a private seller's withincludePersonalData, see Privacy). - No messages, offers, posting or anything else that needs a Leboncoin account.
- No data from other sites: no e-mails from a professional's own website, no payment provider detection, no Google lookups, no energy certificate (ADEME DPE) or recorded sale price (DVF) look ups, no street address recovered from government registers, no other property portals and no merging across portals. The shop rating is delivered only as Leboncoin itself shows it; the DPE and GES classes only as the ad states them.
- No nearby transport or points of interest. The website's map draws them from a map provider's data; they are not in the ad's own record.
- No holiday rental availability dates. Leboncoin serves its booking calendar only to signed in users, and its date
filter is not applied without one. Capacity, bookable and accommodation type are available through
filters. - No free allowance of ads per account. Every ad is billed at the per ad price, which is kept low instead.
FAQ
Does Leboncoin have an API?
Leboncoin offers no public API for its listings. This Actor reads the same public ad data any visitor sees, with no login, and gives it to you as rows you can read through the Apify API (examples below).
Is it legal to scrape Leboncoin?
This Actor reads only public ads without logging in and never asks for phone numbers; a private seller's personal data comes only when you turn it on. Leboncoin's terms forbid automated extraction and French law protects its database, so you are responsible for a lawful use: non substantial parts of the database, no repeated and systematic extraction beyond a normal use, and the GDPR for any personal data (see Legal).
Can I get the seller's phone number from Leboncoin?
Not the number behind an ad's "show number" button: Leboncoin shows it only to signed in users, and this Actor never signs in.
The hasPhone field tells you whether the seller shows a number on Leboncoin. A professional's shop phone comes with Seller
profiles (storePhone). Numbers written into the ad's own texts come
as written for professionals, and for private sellers when you turn on includePersonalData.
How do I get alerts for new Leboncoin ads?
Name a monitor and schedule the Actor, every hour for example. Each run delivers only ads the monitor has not delivered before, newest first, bills only those, and can send them to your webhook or to a Telegram chat through your own bot.
How many ads can one Leboncoin search return?
Leboncoin's page numbers stop at 3,500 ads (100 pages of 35). Newest first (the default), oldest first and the price orders are walked with Leboncoin's own cursor past that point, to the end of the search as Leboncoin serves it (the relevance order stops at 3,500); the coverage row gives Leboncoin's total for the search and says whether it was read to its end.
Why does this Actor run with limited permissions?
It needs nothing beyond its own storages: it reads Leboncoin's public ads and writes to its own dataset and key-value store. Limited permissions keep it from touching anything else in your account. A monitor's memory is a named store the Actor creates for itself.
API
Each example starts a run and waits for its rows (the run-sync endpoint suits short runs; use maxItems to keep them short).
curl -X POST "https://api.apify.com/v2/acts/automation_craft~leboncoin-scraper/run-sync-get-dataset-items" \-H "Authorization: Bearer <YOUR_API_TOKEN>" \-H "Content-Type: application/json" \-d '{"keywords": ["velo"], "locations": ["Paris"], "maxItems": 20}'
const res = await fetch('https://api.apify.com/v2/acts/automation_craft~leboncoin-scraper/run-sync-get-dataset-items', {method: 'POST',headers: { Authorization: 'Bearer <YOUR_API_TOKEN>', 'Content-Type': 'application/json' },body: JSON.stringify({ keywords: ['velo'], locations: ['Paris'], maxItems: 20 }),});const rows = await res.json();console.log(rows.filter((r) => r.type === 'ad'));
import requestsres = requests.post("https://api.apify.com/v2/acts/automation_craft~leboncoin-scraper/run-sync-get-dataset-items",headers={"Authorization": "Bearer <YOUR_API_TOKEN>"},json={"keywords": ["velo"], "locations": ["Paris"], "maxItems": 20},timeout=330,)ads = [r for r in res.json() if r["type"] == "ad"]
Changelog
See the Changelog tab. 0.1: first release.