How to Scrape Bien'ici France Real Estate Data in 2026
Extract French property listings from Bien'ici — prices, €/m², DPE energy class, GPS and agency data — from its own JSON search endpoint. No API key.
Bien’ici (bienici.com) is one of France’s largest property portals, with hundreds of thousands of active sale and rental ads. It has no official public API for third parties, so most people trying to build a French real-estate dataset end up either paying for a data vendor or writing a fragile HTML scraper that breaks every time the front end ships a redesign. There is a cleaner path. Bien’ici is a single-page app that loads its listings from an internal JSON search endpoint, and that endpoint returns far richer structured data than the rendered page shows. This guide walks through what that endpoint exposes, how to query it reliably from France, and what the real access friction is.
What’s worth extracting
Bien’ici’s realEstateAds.json endpoint returns 60+ fields per listing. The fields that matter for most French market work group into a few clusters:
- Pricing —
price(sale price or monthly rent),priceCurrency(EUR),pricePerSqm(€/m²),priceHasDecreased(a recent-drop flag), andpriceWithoutFees(sale price excluding agency commission). - Fees & charges —
agencyFeePercentage,feesChargedTo(who pays),annualCondominiumFeesfor co-ownership (copropriété) buildings, and for rentalsmonthlyCharges,rentWithoutCharges,safetyDeposit,inventoryFeesandagencyRentalFee. - Rent control —
isRentControlled(encadrement des loyers) andmaxReferenceRent, the legal maximum reference rent — essential if you work with Paris or Lille rentals. - Physical attributes —
surfaceArea(living area, m²),landSurfaceArea(plot),rooms(pièces),bedrooms(chambres),floor,totalFloors,heating,hasFirePlace. - Energy —
energyClassification(DPE class A–G),greenhouseGazClassification(GES class A–G), plus the rawenergyValue(kWh/m²/yr) andgreenhouseGazValue(kg CO₂/m²/yr) and the diagnostic date. - Location —
city(with arrondissement),postalCode,departmentCode,district(quartier),districtInsee, plus approximatelatitude/longitude. - Advertiser / lead data —
accountType(agency, mandatary or private),accountDisplayName,customerId,adCreatedByProandisBienIciExclusive. - Media & dates —
mainImageUrl,imageUrls,imageCount,with360,with3dModel,publicationDateandmodificationDate(both ISO 8601).
For a €/m² heatmap you only need price, surface, and location. For investment screening you also want the rent fields and DPE class. The energy fields are what make this source stand out — DPE class is on every listing, which lets you segment inventory by energy performance without a separate data source.
How the source actually works
Bien’ici’s website loads listings by POSTing a filter object to its own search API, which returns JSON. The scraper reads that same endpoint directly, so there is no browser rendering and no HTML parsing. The flow is:
- You supply a French place name —
Paris,Lyon 6e,Bordeaux, or a postal code like33000. - The place name is resolved to a Bien’ici internal zone ID through the site’s own geo-suggest (Paris, for example, maps to zone
-7444). For ambiguous names you can passzoneIdsdirectly. - The search endpoint is queried with your transaction, property type, price/area/room filters and sort order, then paginated until your
maxListingscap is reached.
A realistic run configuration — apartments and houses for sale across two cities — looks like this:
{
"locations": ["Paris", "Lyon"],
"transaction": "buy",
"propertyTypes": ["flat", "house"],
"priceMin": 200000,
"priceMax": 800000,
"areaMin": 40,
"areaMax": 120,
"roomsMin": 2,
"sort": "newest",
"maxListings": 500,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "FR" }
}
Each entry in locations becomes its own task, so passing ["Paris", "Lyon", "Marseille", "Bordeaux"] runs four searches in one job and tags every row with its searchLocation. Property types cover the full French taxonomy: flat, house, loft, townhouse, castle, building, terrain, parking, shop, office, premises and others. Sorting supports relevance, newest, price_asc/price_desc, area_asc/area_desc and price_per_m_asc/price_per_m_desc.
▶ Run the Bien’ici Scraper on Apify — one run pulls thousands of French listings with price, €/m², DPE energy class, GPS and agency data. No API key, no login. Export to JSON, CSV, Excel or XML.
The access reality
The endpoint is public in the sense that no key or login is required, but it is served from France and it does care where requests come from. A few things to plan for:
- Geography matters. The API is French-hosted and datacenter IPs from outside France get inconsistent responses. Residential proxies with
apifyProxyCountry: "FR"are strongly recommended — this is the single biggest reliability lever. - Pace your requests. Keep
requestDelayat 500 ms or higher. Hammering the endpoint invites throttling; a polite pace runs cleanly. - Rotate on error. Set
maxRetriesso that HTTP or proxy errors rotate to a fresh IP rather than retrying on a burned one. - Pagination has a practical ceiling. A single filter combination only exposes so many pages of results before the API stops returning new ads. To reach deeper inventory in a dense city, split the search by price band or arrondissement and combine
pageSize(1–100) withmaxPagesPerTaskrather than trying to page through one enormous unfiltered query. - Coordinates are deliberately blurred. Bien’ici returns an approximate
latitude/longitudeand anaddressKnownflag; the exact address is not disclosed for most ads. Treat GPS as neighborhood-level, not door-level.
The naive approach — curl the rendered page and regex the DOM — fails because the listings aren’t in the initial HTML; they’re loaded client-side from this endpoint. Going straight to the JSON is both faster and more stable, since payload shapes change far less often than the rendered layout.
Example output
One representative record (trimmed) from a Paris 15e sale search:
{
"adId": "64f2a1c8d3e9b40012ab34cd",
"detailUrl": "https://www.bienici.com/annonce/vente/paris-15e/appartement/3pieces/64f2a1c8d3e9b40012ab34cd",
"title": "Appartement 3 pièces - 68 m² - Paris 15e",
"transactionType": "buy",
"propertyType": "flat",
"price": 745000,
"priceCurrency": "EUR",
"pricePerSqm": 10956,
"surfaceArea": 68,
"rooms": 3,
"bedrooms": 2,
"energyClassification": "D",
"greenhouseGazClassification": "D",
"energyValue": 187,
"city": "Paris 15e",
"postalCode": "75015",
"district": "Saint-Lambert",
"latitude": 48.8412,
"longitude": 2.2996,
"accountType": "agency",
"accountDisplayName": "Immo Prestige Paris",
"isBienIciExclusive": true,
"publicationDate": "2026-07-02T09:14:00Z"
}
Use cases
What French real-estate data at this granularity is actually used for:
- €/m² market research — build price-per-square-meter heatmaps by région, département, city and quartier. The
pricePerSqmfield is already computed per listing. - Investment screening — scrape both
buyandrentfor the same area, then compute gross rental yield by matching comparable properties. The separated rent/charges/deposit fields make this clean. - Energy-transition analysis — segment inventory by DPE/GES class to flag “passoires thermiques” (energy-inefficient F/G properties) that face progressive rental bans under French law.
- Agency lead generation — cluster listings by
accountDisplayNameandcustomerIdto map the most active agencies in a market, or filter toaccountType: "private"for direct-owner outreach. - Price-drop tracking — re-run on a schedule and diff against prior datasets using
publicationDate,modificationDateand thepriceHasDecreasedflag to catch reductions early. - New-build monitoring — set
newBuildOnly: trueto track fresh developer (neuf) programs separately from resale stock.
Build-it-yourself vs. managed actor
You can write this yourself — the endpoint is discoverable and the JSON is clean. The costs that accumulate are:
- French residential proxy bandwidth. A respectable residential pool runs a few hundred dollars a month. The managed actor bundles Apify residential proxy, so you pay per row instead of maintaining a proxy budget.
- Geo-resolution logic. You’ll need to replicate Bien’ici’s place-name → zone-ID lookup, handle ambiguous names, and keep it current.
- Retry and rotation plumbing. Getting IP rotation to trigger on the right error codes, at the right pace, is the difference between a scraper that runs for ten minutes and one that runs cleanly to completion.
- Maintenance. Any time the filter payload shape or a field name shifts, your parser needs updating.
The managed actor is pay-per-result: a 5,000-listing run across ten cities lands in the low single digits of dollars including proxy. For most teams the deciding factor isn’t the proxy bill — it’s not spending a week reverse-engineering the zone lookup and rotation logic before you get your first clean row.
Common pitfalls
Specific gotchas when working with Bien’ici data:
- Rent vs. sale price sharing one field. For rentals,
priceis the monthly rent, not a sale price. Always branch ontransactionTypebefore you aggregate, or you’ll average rents into sale prices. - DPE can be pending. New-build and some recent listings may carry a provisional or missing energy class. Check for empty
energyClassificationbefore filtering out “bad” energy stock, or you’ll drop valid new inventory. - Arrondissement naming.
cityfor Paris/Lyon/Marseille includes the arrondissement (Paris 15e), whilepostalCode(75015) is the stable geographic key. Join on postal code ordistrictInsee, not the display name. - Fees change the true price.
pricefor a sale may or may not include agency fees depending on the listing; usepriceWithoutFees,agencyFeePercentageandfeesChargedToif you’re comparing net acquisition cost across ads. - Approximate coordinates. Don’t use the returned GPS for anything requiring exact positioning — it’s blurred by design.
postalCode+districtis the reliable spatial join. - Image URLs rotate.
mainImageUrlandimageUrlspoint to a CDN whose paths change over time. Store them if you need thumbnails, but don’t treat them as permanent.
Wrapping up
If you need a one-off snapshot of a single arrondissement, the endpoint is approachable enough to hit yourself with a French residential IP. If you need a refreshed, multi-city French property feed with DPE energy data on every row — for yield models, market dashboards or agency lead lists — a managed actor that already solves the geo-resolution, proxy and rotation problems will save you the reverse-engineering week.
▶ Open the Bien’ici Scraper on Apify — reads Bien’ici’s own
realEstateAds.jsonendpoint to return price, €/m², DPE/GES energy classes, GPS, city/district and agency details per listing. No API key, no login, residential-FR proxy ready. Export to JSON, CSV, Excel or XML. Start on Apify’s free monthly credit.
Related guides
EU Company Registry Data Export — Germany, France, Netherlands
How to extract company-registry records from Handelsregister, INPI, and KvK in a unified schema — for KYC, B2B lead generation, and compliance workflows.
How to Scrape Allabolag.se Sweden Company Leads in 2026
Extract Swedish company data from allabolag.se — org number, revenue, CEO, phone and email — without an API key. A guide to bulk firmographics and B2B leads.
How to Scrape the Australia Business Register (ABN/ABR)
Bulk-export Australian business names, ABNs, status and registration dates from the official data.gov.au CKAN register — no API key, no browser, no captcha.