Bien'ici Scraper [$1/1K💰] | French Real Estate & DPE Data avatar

Bien'ici Scraper [$1/1K💰] | French Real Estate & DPE Data

Pricing

from $0.90 / 1,000 results

Go to Apify Store
Bien'ici Scraper [$1/1K💰] | French Real Estate & DPE Data

Bien'ici Scraper [$1/1K💰] | French Real Estate & DPE Data

Scrape bienici.com French property listings: price, price per m², surface, rooms, DPE/GES energy classes, agency and coordinates. Ideal for real-estate market research, valuation and price monitoring in France.

Pricing

from $0.90 / 1,000 results

Rating

0.0

(0)

Developer

Ahmed Jasarevic

Ahmed Jasarevic

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

3 days ago

Last modified

Categories

Share

Bien'ici Scraper: French Real Estate Listings & DPE Data

Scrape real-estate listings from bienici.com (Bien'ici), one of France's largest property portals backed by the FNAIM agency network, and export price, price per m², surface, rooms/bedrooms, DPE/GES energy classes, GPS coordinates, city/district, agency names, photos and full descriptions as clean structured JSON. It calls Bien'ici's own internal JSON API, so no browser is needed and runs are cheap.

Built for French real-estate investors, proptech and valuation tools, and agency lead-generation teams who need données immobilières from buy or rent searches.

Main use cases

  • Marché immobilier research: analyze asking prices, price per m² and inventory by city, district and department.
  • Property and valuation data: build a structured dataset of French listings with surface, rooms and DPE/GES energy classes.
  • Real estate lead generation: pull agency names and contacts from active listings for outreach and partner research.
  • Price and DPE monitoring: schedule recurring snapshots to track price changes (priceHasDecreased) and energy-class distribution.
  • Comp and estimation tooling: filter by price, surface, rooms and property type to line up comparables for estimation immobilière.
  • Proptech and market datasets: assemble buy or rent listings for analytics, dashboards and market reports.

How it works

Bien'ici is a client-side SPA, so the served HTML contains no listings. Instead of rendering the page, this actor calls Bien'ici's own internal JSON API, the exact endpoints the site's frontend uses. Both are plain, unauthenticated JSON endpoints that are not Cloudflare-walled and need no cookies and no browser:

StepEndpointPurpose
Geo resolutionGET https://www.bienici.com/suggest.json?q=<place>Resolve a place name / postal code (e.g. Paris, Paris 15e, 69000) to Bien'ici zoneIds
ListingsGET https://www.bienici.com/realEstateAds.json?filters=<url-encoded JSON>Paginated search results with every field needed

The filters parameter is a URL-encoded JSON object:

{
"size": 60, "from": 0, "page": 1, "resultsPerPage": 60,
"filterType": "buy", "propertyType": ["flat"],
"sortBy": "publicationDate", "sortOrder": "desc",
"onTheMarket": [true],
"zoneIdsByTypes": { "zoneIds": ["-7444"] },
"minPrice": 200000, "maxPrice": 600000, "minRooms": 2
}

Because the data is already structured JSON, the actor uses Crawlee's HttpCrawler (plain HTTP, no browser and no HTML parsing). No Playwright or Puppeteer is required, so it is cheap to run and can execute from datacenter IPs.

Build A French Property Database Without A Bien'ici API

Bien'ici does not document an open or public API; only its internal JSON endpoints (geo-suggest plus realEstateAds.json) are used here. The reverse-engineering order followed was: embedded JSON blobs (none present) then third-party search backend (none found) then the internal/mobile JSON API (used here) then static HTML then a browser. The internal JSON API is both the cheapest and the most complete surface.

Known limitations

  • New-build ("programme") ads frequently omit DPE/GES and bedroom counts, so those fields come back null for such listings.
  • Bien'ici caps how deep pagination can go for very large result sets; the actor requests maxAuthorizedResults accordingly and stops cleanly.
  • Residential Apify proxies are not required (the JSON API is not bot-walled), but the standard proxy input is available if you want to spread requests.

Input Parameters

FieldTypeRequiredDefaultNotes
startUrlsarray (requestListSources)Nohttps://www.bienici.com/recherche/achat/paris-75000Bien'ici search-result URLs, e.g. .../recherche/achat/paris-75000 or .../recherche/location/lyon-69000. Transaction and location are read from each link.
locationsarray (stringList)No-French place names to search, e.g. Paris, Paris 15e, Lyon, 69000, Bordeaux. Each is resolved to a Bien'ici zone via geo-suggest.
transactionstring (enum)Nobuybuy (achat) or rent (location). Only used for entries in locations (search URLs define their own transaction).
propertyTypesarray (stringList)NoallLeave empty for all types. Allowed: flat, house, terrain, parking, building, loft, castle, townhouse, premises, shop, office, others.
minPriceintegerNo-Minimum price in euros.
maxPriceintegerNo-Maximum price in euros.
minAreaintegerNo-Minimum living surface in square metres.
maxAreaintegerNo-Maximum living surface in square metres.
minRoomsintegerNo-Minimum number of rooms.
maxRoomsintegerNo-Maximum number of rooms.
minBedroomsintegerNo-Minimum number of bedrooms.
maxBedroomsintegerNo-Maximum number of bedrooms.
maxItemsintegerNo300Maximum listings to return across all searches. Free users are capped at 10.
maxPagesintegerNo5Maximum result pages (60 listings each) per search task. Hard-capped at 50.
maxConcurrencyintegerNo3Maximum number of parallel requests.
proxyobject (proxy)NouseApifyProxy: falseStandard Apify proxy picker. Off by default; available if you want to spread requests.

Output Fields

One dataset item per listing. The default overview view shows Title, Price, €/m², Surface, Rooms, Bedrooms, DPE, GES, City, Postal code, Agency and URL.

FieldTypeDescription
idstringBien'ici listing id.
urlstringDirect bienici.com listing URL.
titlestringListing title.
descriptionstringFull ad text.
pricenumberAsking price in euros.
priceWithoutFeesnumberPrice excluding fees.
pricePerSquareMeternumberPrice per m².
surfaceAreanumberLiving surface (m²).
roomsQuantitynumberNumber of rooms.
bedroomsQuantitynumberNumber of bedrooms.
bathroomsQuantitynumberNumber of bathrooms.
energyClassstringDPE class (A-G).
gesClassstringGES class (A-G).
energyValuenumberRaw DPE value.
gesValuenumberRaw GES value.
citystringCity.
postalCodestringPostal code.
districtstringDistrict / quartier.
departmentCodestringDepartment code.
latitudenumberGPS latitude.
longitudenumberGPS longitude.
agencyNamestringAgency / broker name.
accountTypestringAdvertiser account type.
agencyIdstringAgency id.
adTypestringTransaction type (buy/rent).
propertyTypestringProperty type.
referencestringAdvertiser reference.
photoCountintegerNumber of photos.
photosarrayPhoto URLs (full list).
virtualToursarrayVirtual-tour URLs.
with360booleanWhether the listing has 360°/3D media.
isNewbooleanNew-build listing flag.
isExclusivebooleanExclusive listing flag.
isProbooleanProfessional (agency) listing flag.
hasTerracebooleanTerrace flag.
hasBalconybooleanBalcony flag.
hasCellarbooleanCellar flag.
floornumberFloor number.
floorQuantitynumberNumber of floors.
heatingstringHeating type.
feesChargedTostringWho pays the fees.
isInCondominiumbooleanCondominium flag.
annualCondominiumFeesnumberAnnual condominium fees.
priceHasDecreasedbooleanWhether the price has dropped.
publicationDatestringPublication date.
modificationDatestringLast modification date.
searchTaskstringSearch that produced the row.
scrapedAtstringISO timestamp of extraction.

Example Input And Output

Input

{
"locations": ["Paris 15e"],
"transaction": "buy",
"propertyTypes": ["flat"],
"minRooms": 3,
"maxPrice": 900000,
"maxItems": 200,
"maxPages": 5
}

Output (one dataset row)

{
"id": "abc123def456",
"url": "https://www.bienici.com/annonce/vente/paris-15e/appartement-3pieces-abc123def456",
"title": "Appartement 3 pièces 68 m² Paris 15e",
"description": "Bel appartement lumineux au 4e étage ...",
"price": 795000,
"priceWithoutFees": 780000,
"pricePerSquareMeter": 11691,
"surfaceArea": 68,
"roomsQuantity": 3,
"bedroomsQuantity": 2,
"bathroomsQuantity": 1,
"energyClass": "D",
"gesClass": "D",
"energyValue": 198,
"gesValue": 34,
"city": "Paris",
"postalCode": "75015",
"district": "Necker",
"departmentCode": "75",
"latitude": 48.84123,
"longitude": 2.30112,
"agencyName": "Agence Exemple",
"accountType": "pro",
"agencyId": "agency-99",
"adType": "buy",
"propertyType": "flat",
"reference": "REF-12345",
"photoCount": 12,
"photos": ["https://.../photo1.jpg"],
"virtualTours": [],
"with360": false,
"isNew": false,
"isExclusive": false,
"isPro": true,
"hasTerrace": true,
"hasBalcony": false,
"hasCellar": true,
"floor": 4,
"floorQuantity": 6,
"heating": "individuel",
"feesChargedTo": "buyer",
"isInCondominium": true,
"annualCondominiumFees": 1800,
"priceHasDecreased": true,
"publicationDate": "2026-09-02",
"modificationDate": "2026-10-01",
"searchTask": "buy:Paris 15e",
"scrapedAt": "2026-10-11T09:00:00.000Z"
}

Integrations & Automation

Every Apify actor is reachable through the Apify API, and this one plugs into webhooks, Zapier and Make so results can flow into a Google Sheet, Airtable base, CRM or data warehouse. For market research and price monitoring, run it on a schedule: a daily or weekly snapshot of your target cities is enough to track new listings, price changes and DPE distributions, and recurring runs also improve the actor's Store recommendation signals.

FAQ

Existe-t-il une API Bien'ici ?

No open or public API is documented. Bien'ici is a client-side SPA whose listings are loaded from internal JSON endpoints (suggest.json for geo resolution and realEstateAds.json for listings). This actor calls those same endpoints, so you get structured French listings without an API key and without a browser.

What are the alternatives to this actor / this data source?

For French property data you can combine this with SeLoger, PAP, Logic-Immo or Leboncoin scrapers. Bien'ici is backed by the FNAIM network and is one of the largest French portals, so it is worth having alongside the others to widen coverage of buy and rent listings and DPE data.

How do I get French property listings with DPE/GES and price per m²?

Provide locations (e.g. Paris 15e) or startUrls, set transaction to buy or rent, and add any price/surface/room filters. The actor resolves each place to a Bien'ici zone and returns one row per listing with pricePerSquareMeter, energyClass, gesClass, surfaceArea, roomsQuantity and coordinates.

Why are DPE, GES or bedroom counts null on some rows?

New-build ("programme") ads frequently omit energy classes and bedroom counts on Bien'ici, so those fields come back null for such listings. This is expected and not a scrape failure.

Do I need a proxy or a browser?

Neither is required. The internal JSON API is not Cloudflare-walled, so the actor runs on plain HTTP from datacenter IPs. The proxy input is available if you want to spread requests across IPs.

How deep can a run paginate?

Bien'ici caps how deep pagination can go for very large result sets. The actor requests maxAuthorizedResults accordingly and stops cleanly; maxPages (default 5, hard cap 50) bounds each search and maxItems (default 300) bounds the total.

SEO Keywords

bienici, bien ici, annonces immobilieres, scraper immobilier, donnees immobilieres, prix immobilier, dpe, marche immobilier, api immobilier, estimation immobiliere, prix m2 immobilier, achat immobilier, location appartement, base de donnees immobiliere, agences immobilieres france, bienici api, bienici alternative, immobilier france, annonces immobilieres france, prix immobilier france

For AI Agents & LLM Apps

Purpose: return one structured French property-listing row per Bien'ici ad for a given set of locations or search URLs and transaction type.

Minimal working input:

{ "locations": ["Paris 15e"], "transaction": "buy", "maxItems": 60 }

Variant input (scrape explicit search URLs):

{ "startUrls": [{ "url": "https://www.bienici.com/recherche/location/lyon-69000" }], "maxItems": 60 }

Output fields: id, url, title, description, price, priceWithoutFees, pricePerSquareMeter, surfaceArea, roomsQuantity, bedroomsQuantity, bathroomsQuantity, energyClass, gesClass, energyValue, gesValue, city, postalCode, district, departmentCode, latitude, longitude, agencyName, accountType, agencyId, adType, propertyType, reference, photoCount, photos, virtualTours, with360, isNew, isExclusive, isPro, hasTerrace, hasBalcony, hasCellar, floor, floorQuantity, heating, feesChargedTo, isInCondominium, annualCondominiumFees, priceHasDecreased, publicationDate, modificationDate, searchTask, scrapedAt.

Behaviors an agent should know:

  • Two discovery modes: locations (French place names resolved via geo-suggest, using transaction) or startUrls (search URLs that carry their own transaction and location).
  • transaction applies only to locations entries; buy is the default.
  • maxItems defaults to 300; free-plan runs are capped at 10 listings.
  • maxPages defaults to 5 (60 listings per page) and is hard-capped at 50.
  • energyClass/gesClass and bedroomsQuantity can be null for new-build listings; do not treat that as a failure.
  • No browser or proxy is required; plain HTTP HttpCrawler is used.

Billing: pay-per-event: $0.001 per result ($1.00 / 1,000 listings) plus a $0.00005 actor-start event.

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Bien'ici or the FNAIM network. It accesses only publicly available Bien'ici listing data through the site's own internal JSON endpoints; it does not log in, bypass authentication, or solve CAPTCHAs on anyone's behalf. Users are responsible for ensuring their use complies with Bien'ici's Terms of Service and with applicable data-protection law (including the GDPR, since the data concerns French/EU listings). Where output includes agency contact details, it must not be used for unsolicited commercial outreach in violation of applicable law.