# Bien'ici Scraper — France Real Estate Data (`logiover/bien-ici-fr-scraper-france-real-estate`) Actor

Scrape France real estate listings from Bien'ici (bienici.com) via its public JSON API — no browser. Filter by location, buy/rent, property type, price (€), area, rooms, bedrooms. Returns price, €/m², DPE energy class, GPS, city/district, agency and images per listing.

- **URL**: https://apify.com/logiover/bien-ici-fr-scraper-france-real-estate.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Real estate, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Bien'ici Scraper — France Real Estate Data, Prices & Leads (No API)

![Apify Actor](https://img.shields.io/badge/Apify-Actor-00A67E?logo=apify&logoColor=white) ![No API key](https://img.shields.io/badge/No%20API%20key-required-2ea44f) ![Pay per result](https://img.shields.io/badge/Pricing-Pay%20per%20result-1C7ED6) ![Real Estate](https://img.shields.io/badge/Category-Real%20Estate-8B5CF6) ![Export](https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel-F59E0B)

Scrape property listings from **Bien'ici (bienici.com)**, one of France's major real estate portals with hundreds of thousands of active ads — apartments, houses, lofts, townhouses, châteaux, land, parking, shops and offices, for **sale or rent**. Get **price, price/m², DPE energy class, GES class, GPS coordinates, French city & district, agency details and full image galleries** in clean structured JSON, straight from Bien'ici's own public `realEstateAds.json` search endpoint. **Fast, no browser, no HTML parsing, no API key, no login.**

> ### 🏆 Why this Bien'ici scraper?
> **60+ fields per listing** · **thousands of listings per run** · direct JSON API (no browser) · DPE/GES energy data on every ad · residential-proxy ready · export to JSON / CSV / Excel. The unofficial **Bien'ici API alternative** for French real-estate market research, investment screening and agency lead generation.

---

### ✨ What this Actor does / Key features

- 🏠 **12 property categories** — apartments (appartement), houses (maison), lofts, townhouses, châteaux, buildings, land (terrain), parking, shops, offices and premises, for sale or rent.
- 📍 **Nationwide location targeting** — search all of France, any region, département, city, arrondissement or postal code by simply typing the place name (`Paris`, `Lyon 6e`, `Bordeaux`, `33000`).
- 💰 **Powerful filters** — price range (€), living-area range (m²), total rooms, bedrooms and a new-build (neuf) toggle.
- 🔀 **Flexible sorting** — by relevance, newest, price, price/m² or area, ascending or descending.
- 🔋 **DPE & GES energy data** — energy-performance class, greenhouse-gas class, plus the underlying consumption and emission values for every listing.
- 🗺️ **Location & GPS** — city (with arrondissement), postal code, département, neighborhood/quartier and INSEE code, plus approximate latitude/longitude.
- 🏢 **Advertiser lead data** — agency name, account type, customer ID, professional flag and Bien'ici exclusivity flag.
- 🖼️ **Image galleries** — main image URL plus the full list of photo URLs and image count, with 360°/3D-tour flags.
- ⚡ **Direct JSON API extraction** — reads Bien'ici's `realEstateAds.json` endpoint; no browser, no DOM walking, no fragile HTML parsing.
- 🛡️ **Proxy support** — Apify Proxy integration; residential + country=FR strongly recommended for reliable access.

### 🚀 Quick start (3 steps)

1. **Configure** — type one or more French place names into `locations` (e.g. `Paris`, `Lyon`) and pick `buy` or `rent`. Add price/area/room filters if you want.
2. **Run** — click **Start**. The Actor resolves each place to a Bien'ici zone, paginates the search API and streams listings into your dataset.
3. **Get your data** — open the **Output** tab and export to **JSON, CSV, Excel or XML**, or pull it via the Apify API.

### 📥 Input

Give the Actor at least one `locations` value (or leave it empty to search all of France). Everything else is optional.

#### Example — apartments & houses for sale in Paris and Lyon
```json
{
  "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" }
}
````

#### Example — rentals in a single arrondissement (yield & rent-control study)

```json
{
  "locations": ["Paris 15e"],
  "transaction": "rent",
  "propertyTypes": ["flat"],
  "roomsMin": 1,
  "roomsMax": 3,
  "sort": "newest",
  "maxListings": 1000
}
```

#### Example — new-build (neuf) developer programs in Bordeaux

```json
{
  "locations": ["Bordeaux"],
  "transaction": "buy",
  "newBuildOnly": true,
  "maxListings": 300
}
```

| Field | Type | Description |
|-------|------|-------------|
| `locations` | array | French place names (e.g. `Paris`, `Lyon 6e`, `Bordeaux 33000`). Each becomes its own task, resolved to a Bien'ici zone via geo-suggest. Leave empty to search all of France. |
| `zoneIds` | array | Advanced: Bien'ici internal zone IDs (e.g. `-7444` for Paris) for ambiguous names. |
| `transaction` | string | `buy` (achat/vente) or `rent` (location). |
| `propertyTypes` | array | One or more of `flat`, `house`, `loft`, `townhouse`, `castle`, `building`, `terrain`, `parking`, `shop`, `office`, `premises`, `others`. |
| `priceMin` / `priceMax` | integer | Price range in €. 0 = no bound. |
| `areaMin` / `areaMax` | integer | Living-area range in m². 0 = no bound. |
| `roomsMin` / `roomsMax` | integer | Total-rooms (pièces) range. 0 = no bound. |
| `bedroomsMin` | integer | Minimum bedrooms (chambres). 0 = no minimum. |
| `newBuildOnly` | boolean | Only return new-build (neuf) developer properties. |
| `sort` | string | relevance, newest, price\_asc/desc, area\_asc/desc, price\_per\_m\_asc/desc. |
| `pageSize` | integer | Listings per API page (1–100). |
| `maxListings` | integer | Total cap across all location tasks. 0 = unlimited. |
| `maxPagesPerTask` | integer | Pagination depth per location. |
| `requestDelay` | integer | Delay between requests in ms (keep ≥ 500 ms). |
| `maxRetries` | integer | Retries per request on HTTP/proxy errors (rotates proxy IP). |
| `proxyConfiguration` | object | Apify Proxy settings. Residential + country=FR strongly recommended. |

> **Finding a location:** just type a French place name — `Paris`, `Marseille`, `Nice`, `Toulouse`, `Bordeaux`, an arrondissement like `Paris 15e`, a département name, or a postal code like `69000`. Bien'ici's own geo-suggest resolves it to the correct zone. Leave `locations` and `zoneIds` empty to scrape all of France.

### 📤 Output

One row per listing — **60+ fields**, exportable to JSON, CSV, Excel or XML. Here is a trimmed sample record:

```json
{
  "adId": "64f2a1c8d3e9b40012ab34cd",
  "detailUrl": "https://www.bienici.com/annonce/vente/paris-15e/appartement/3pieces/64f2a1c8d3e9b40012ab34cd",
  "reference": "VA2078-PARIS15",
  "title": "Appartement 3 pièces - 68 m² - Paris 15e",
  "transactionType": "buy",
  "adTypeFR": "vente",
  "propertyType": "flat",
  "isNewBuild": false,
  "price": 745000,
  "priceCurrency": "EUR",
  "pricePerSqm": 10956,
  "priceHasDecreased": false,
  "surfaceArea": 68,
  "rooms": 3,
  "bedrooms": 2,
  "floor": 4,
  "totalFloors": 7,
  "energyClassification": "D",
  "greenhouseGazClassification": "D",
  "energyValue": 187,
  "greenhouseGazValue": 32,
  "city": "Paris 15e",
  "postalCode": "75015",
  "departmentCode": "75",
  "district": "Saint-Lambert",
  "latitude": 48.8412,
  "longitude": 2.2996,
  "mainImageUrl": "https://v.seloger.com/s/cdn/x/visuels/…/main.jpg",
  "imageUrls": ["https://…/1.jpg", "https://…/2.jpg", "…"],
  "imageCount": 12,
  "with360": false,
  "accountType": "agency",
  "accountDisplayName": "Immo Prestige Paris",
  "customerId": "ag-390215",
  "adCreatedByPro": true,
  "isBienIciExclusive": true,
  "publicationDate": "2026-07-02T09:14:00Z",
  "modificationDate": "2026-07-04T11:20:00Z",
  "searchLocation": "Paris",
  "scrapedAt": "2026-07-06T12:00:00Z"
}
```

<details>
<summary><b>📋 Full field reference (click to expand)</b></summary>

| Field | Description |
|-------|-------------|
| `adId` | Bien'ici's stable listing ID |
| `detailUrl` / `reference` | Full listing detail URL / agency reference code |
| `title` / `description` | Listing title and full French description |
| `transactionType` / `adTypeFR` / `propertyType` | buy/rent, French label (vente/location), property type |
| `isNewBuild` | Whether it is a new-build (neuf) property |
| `price` / `priceCurrency` / `pricePerSqm` | sale price or monthly rent, currency (EUR), price per m² |
| `priceHasDecreased` / `priceWithoutFees` | recent price drop flag; sale price excluding agency fees |
| `agencyFeePercentage` / `feesChargedTo` | agency commission % (buy); who pays the fee |
| `annualCondominiumFees` / `isInCondominium` | annual co-ownership charges (€/yr); copropriété flag |
| `monthlyCharges` / `rentWithoutCharges` / `safetyDeposit` | rental charges, rent excluding charges, deposit |
| `inventoryFees` / `agencyRentalFee` | inventory-of-fixtures fee; tenant agency fee (rentals) |
| `isRentControlled` / `maxReferenceRent` | rent-control (encadrement) flag; legal max reference rent |
| `surfaceArea` / `landSurfaceArea` | living area / plot area in m² |
| `rooms` / `bedrooms` / `floor` / `totalFloors` | rooms (pièces), bedrooms, floor, building floors |
| `hasFirePlace` / `heating` | fireplace flag; heating type |
| `energyClassification` / `greenhouseGazClassification` | DPE class A–G; GES class A–G |
| `energyValue` / `greenhouseGazValue` / `energyPerformanceDate` | kWh/m²/yr; kg CO₂/m²/yr; diagnostic date |
| `city` / `postalCode` / `departmentCode` / `district` / `districtInsee` | full location breakdown |
| `latitude` / `longitude` / `addressKnown` | approximate GPS (Bien'ici blurs exact position); address-disclosed flag |
| `mainImageUrl` / `imageUrls` / `imageCount` | image gallery |
| `with360` / `with3dModel` | 360° tour and 3D-model flags |
| `accountType` / `accountDisplayName` / `customerId` / `adCreatedByPro` | agency/mandatary/private, name, account ID, professional flag |
| `isBienIciExclusive` | Bien'ici exclusive listing flag |
| `publicationDate` / `modificationDate` | publication / last-modification dates (ISO 8601) |
| `searchTransaction` / `searchLocation` / `searchZoneIds` | search context |
| `scrapedAt` | scrape timestamp (ISO 8601) |

</details>

### 💡 Use cases

- **Market research** — build €/m² heatmaps by région, département, city and quartier across France.
- **Investment screening** — compute gross rental yield by scraping both sale and rent listings for the same area.
- **Energy-transition analysis** — segment inventory by DPE/GES class to track energy-inefficient "passoires thermiques" that face rental bans.
- **Lead generation** — cluster listings by `accountDisplayName` / `customerId` to map active agencies, or filter by advertiser type.
- **Price tracking** — re-run on a schedule and diff against prior datasets using `publicationDate`, `modificationDate` and `priceHasDecreased`.
- **New-build monitoring** — use `newBuildOnly: true` to track fresh developer (neuf) programs.
- **Cross-city comparison** — pass multiple `locations` in one run to benchmark Paris, Lyon, Marseille, Bordeaux and beyond.

### 👥 Who uses it

Real-estate agencies & proptech teams · property investors & flippers · mortgage and valuation analysts · energy-performance and urban-policy researchers · market researchers & data journalists · lead-gen agencies building agency contact lists.

### 💰 Pricing

This Actor runs on a simple **pay-per-result** model — you pay for the listings you extract, with no separate Apify platform fees to calculate. Try it on the **free tier** first, then scale up. See the **Pricing** tab on this page for the current rate.

### ❓ Frequently Asked Questions

**Is it legal to scrape Bien'ici?**
The Actor only collects publicly available property listing data. You are responsible for using the data in compliance with Bien'ici's terms and applicable laws such as the GDPR.

**Does Bien'ici have a public API?**
Bien'ici does not publish an official open data API for third parties. Its website is a single-page app that loads listings from an internal JSON endpoint, which this Actor reads directly — giving you structured French real estate data without any API key.

**Do I need an API key or a login?**
No. There is no Bien'ici account, login or API key required — only an Apify account.

**Do I need a proxy?**
Yes, and Apify Proxy is built in. Bien'ici's API is served from France, so residential proxies with country=FR are strongly recommended; the Actor runs cleanly with them at a ≥500 ms request delay.

**How much data can I get?**
You can scrape thousands of listings per run. Use `maxPagesPerTask` and `pageSize` to control depth, and narrow with price, area and room filters to reach deeper inventory across multiple locations.

**Does it return rental charges and deposit separately?**
Yes. For rentals, `price` is the monthly rent, `monthlyCharges` holds the charges, `safetyDeposit` the deposit, and rent-control fields (`isRentControlled`, `maxReferenceRent`) are included where they apply.

#### Is this a Bien'ici API alternative?

Yes. Bien'ici has no official public listings API, so this Actor works as an unofficial Bien'ici API alternative — it reads the site's own `realEstateAds.json` search endpoint and returns clean, structured French real estate data with no API key.

#### Can I scrape Bien'ici without an API or login?

Yes. No Bien'ici account, login or API key is needed — only an Apify account. The Actor pulls publicly available property listings over direct HTTP.

#### How do I export Bien'ici data to CSV or JSON?

Run the Actor, then export the resulting dataset as CSV, JSON, Excel or XML from the Apify console or via the Apify API.

#### Does the scraper return the DPE energy rating for French listings?

Yes. Every listing includes `energyClassification` (DPE class A–G) and `greenhouseGazClassification` (GES class A–G), along with the underlying `energyValue` (kWh/m²/yr) and `greenhouseGazValue` — ideal for analysing France's energy-performance rules and filtering out "passoires thermiques".

### 🔗 More real estate scrapers by logiover

Building a cross-country property dataset? Pair Bien'ici with the rest of the European real-estate suite:

| Country | Actor |
|---|---|
| 🇵🇱 Poland | [Otodom.pl Scraper](https://apify.com/logiover/otodom-pl-scraper-polish-real-estate-data) |
| 🇩🇪 Germany | [ImmobilienScout24 Scraper](https://apify.com/logiover/immobilienscout24-de-scraper-germany-real-estate) · [WG-Gesucht Scraper](https://apify.com/logiover/wg-gesucht-scraper) |
| 🇨🇿 Czechia | [Sreality.cz Scraper](https://apify.com/logiover/sreality-cz-scraper-czech-real-estate-data) |
| 🇬🇷 Greece | [Spitogatos Scraper](https://apify.com/logiover/spitogatos-gr-real-estate-scraper-greece-properties-data) · [XE.gr Scraper](https://apify.com/logiover/xe-gr-real-estate-scraper-greece-property-data) |
| 🇮🇹 Italy | [Casa.it Scraper](https://apify.com/logiover/casa-it-scraper-italy-real-estate) · [Subito Scraper](https://apify.com/logiover/subito-it-property-scraper) |
| 🇵🇹 Portugal | [Imovirtual Scraper](https://apify.com/logiover/imovirtual-pt-scraper-portugal-real-estate) |
| 🇪🇸 Spain | [Habitaclia Scraper](https://apify.com/logiover/habitaclia-com-spain-scraper) · [Pisos.com Scraper](https://apify.com/logiover/pisos-com-property-scraper) |
| 🇷🇴 Romania | [Storia.ro Scraper](https://apify.com/logiover/storia-ro-scraper-romania-real-estate) |
| 🇮🇪 Ireland | [Daft.ie Scraper](https://apify.com/logiover/daft-ie-scraper) · [MyHome.ie Scraper](https://apify.com/logiover/myhome-ie-scraper) |
| 🇦🇹 Austria | [Willhaben Scraper](https://apify.com/logiover/willhaben-at-scraper) |
| 🇺🇸 USA | [Realtor.com Scraper](https://apify.com/logiover/realtor-com-scraper) · [Redfin Scraper](https://apify.com/logiover/redfin-scraper) |
| 🇦🇪 UAE | [Property Finder Scraper](https://apify.com/logiover/propertyfinder-scraper) |

👉 Browse all **[logiover scrapers on Apify Store](https://apify.com/logiover)** — 180+ actors across real estate, jobs, crypto, social media & B2B data.

### ⏰ Scheduling & integration

Schedule this Actor on Apify to track the French property market daily or weekly. Export results to JSON, CSV or Excel, sync to Google Sheets, or push to your database, BI tools and webhooks through the Apify API. Connect it to **Make, n8n or Zapier** to build automated real-estate pipelines.

### ⭐ Support & feedback

Found a bug or need an extra field? Open an issue on the **Issues** tab — response is usually fast. If this Actor saves you time, a **★★★★★ review** on the Store page genuinely helps and is hugely appreciated. 🙏

### ⚖️ Legal

This Actor extracts only publicly available data and is intended for legitimate research, analytics and lead-generation use. You are responsible for complying with Bien'ici's terms of service, GDPR and any applicable local laws.

***

### 📝 Changelog

#### 2026-07-06

- ✨ README overhaul: richer output sample, ready-to-run example scenarios, cross-country real-estate suite links, and clearer quick-start.

#### 2026-07-06 — Initial release

- First public version. Scrapes French real estate listings from Bien'ici (bienici.com) via the site's own public JSON search API — no browser, no HTML parsing, no API key.
- Location targeting by city, arrondissement, département or postal code (auto-resolved via Bien'ici geo-suggest), plus an advanced Zone ID escape hatch.
- Filters for transaction (buy/rent), property type, price (€), area (m²), rooms, bedrooms and new-build, with flexible sorting and pagination.
- Returns price, €/m², DPE/GES energy classes, surface, rooms, GPS, city/district, agency details and full image galleries per listing.

# Actor input Schema

## `locations` (type: `array`):

French place names to search — e.g. `Paris`, `Lyon`, `Marseille`, `Bordeaux 33000`, `Paris 15e`, `Nice`, `Toulouse`. Each entry is resolved to a Bien'ici zone via the site's own geo-suggest and becomes its own scraping task. Cities, arrondissements, départements and postal codes all work. Leave empty (and leave Zone IDs empty) to search all of France.

## `zoneIds` (type: `array`):

Optional Bien'ici internal zone IDs (e.g. `-7444` for Paris). Advanced escape hatch when a place name is ambiguous — grab them from a bienici.com search URL's `filters` parameter. All IDs listed here are combined into a single search. Usually you can ignore this and just use Locations.

## `transaction` (type: `string`):

Buy (achat / vente) or rent (location).

## `propertyTypes` (type: `array`):

One or more Bien'ici property categories. Combine freely (e.g. flat + house).

## `priceMin` (type: `integer`):

Minimum price in euros. For rent this is monthly rent. 0 = no minimum.

## `priceMax` (type: `integer`):

Maximum price in euros. For rent this is monthly rent. 0 = no maximum.

## `areaMin` (type: `integer`):

Minimum living area in square meters. 0 = no minimum.

## `areaMax` (type: `integer`):

Maximum living area in square meters. 0 = no maximum.

## `roomsMin` (type: `integer`):

Minimum total rooms (pièces). In France a studio = 1 room, a 2-room flat = T2, etc. 0 = no minimum.

## `roomsMax` (type: `integer`):

Maximum total rooms (pièces). 0 = no maximum.

## `bedroomsMin` (type: `integer`):

Minimum number of bedrooms (chambres). 0 = no minimum.

## `newBuildOnly` (type: `boolean`):

Only return brand-new / off-plan developer properties (immobilier neuf).

## `sort` (type: `string`):

Result ordering.

## `pageSize` (type: `integer`):

Page size for the API (1–100). Larger pages mean fewer requests.

## `maxListings` (type: `integer`):

Total cap across all location tasks (0 = unlimited).

## `maxPagesPerTask` (type: `integer`):

Pagination depth per location. Combined with page size this caps listings per location. Narrow with price/area filters to reach deeper inventory.

## `requestDelay` (type: `integer`):

Delay between sequential requests. Keep ≥ 500 ms to stay polite.

## `maxRetries` (type: `integer`):

Retries per request on HTTP / proxy errors (rotates proxy IP each attempt).

## `proxyConfiguration` (type: `object`):

Apify Proxy is required. Bien'ici's API is served from France — RESIDENTIAL with country=FR is strongly recommended for reliable access.

## Actor input object example

```json
{
  "locations": [
    "Paris"
  ],
  "zoneIds": [],
  "transaction": "buy",
  "propertyTypes": [
    "flat",
    "house"
  ],
  "priceMin": 0,
  "priceMax": 0,
  "areaMin": 0,
  "areaMax": 0,
  "roomsMin": 0,
  "roomsMax": 0,
  "bedroomsMin": 0,
  "newBuildOnly": false,
  "sort": "relevance",
  "pageSize": 24,
  "maxListings": 200,
  "maxPagesPerTask": 5,
  "requestDelay": 700,
  "maxRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FR"
  }
}
```

# Actor output Schema

## `adId` (type: `string`):

Bien'ici listing ID

## `detailUrl` (type: `string`):

Full URL to the listing page

## `reference` (type: `string`):

Agency reference code

## `title` (type: `string`):

Listing title

## `description` (type: `string`):

Full listing description (French)

## `transactionType` (type: `string`):

buy / rent

## `adTypeFR` (type: `string`):

French transaction label (vente / location)

## `propertyType` (type: `string`):

flat / house / terrain / parking / ...

## `isNewBuild` (type: `string`):

True for new-build (neuf) properties

## `price` (type: `string`):

Sale price, or monthly rent for rentals

## `priceCurrency` (type: `string`):

Currency (EUR)

## `pricePerSqm` (type: `string`):

Price per square meter

## `priceHasDecreased` (type: `string`):

True if the price recently decreased

## `priceWithoutFees` (type: `string`):

Sale price excluding agency fees

## `agencyFeePercentage` (type: `string`):

Agency commission percentage (buy)

## `feesChargedTo` (type: `string`):

Who pays the agency fee (buyer/seller)

## `annualCondominiumFees` (type: `string`):

Annual co-ownership charges (€/yr)

## `isInCondominium` (type: `string`):

Whether property is in a copropriété

## `monthlyCharges` (type: `string`):

Monthly rental charges (€, rentals)

## `rentWithoutCharges` (type: `string`):

Monthly rent excluding charges (rentals)

## `safetyDeposit` (type: `string`):

Security deposit (€, rentals)

## `inventoryFees` (type: `string`):

Inventory of fixtures fee (€, rentals)

## `agencyRentalFee` (type: `string`):

Tenant agency fee (€, rentals)

## `isRentControlled` (type: `string`):

Subject to rent control (encadrement)

## `maxReferenceRent` (type: `string`):

Legal max reference rent (rent control)

## `surfaceArea` (type: `string`):

Living area in m²

## `landSurfaceArea` (type: `string`):

Land / plot area in m² (houses, terrain)

## `rooms` (type: `string`):

Total rooms (pièces)

## `bedrooms` (type: `string`):

Number of bedrooms (chambres)

## `floor` (type: `string`):

Floor number (étage)

## `totalFloors` (type: `string`):

Total floors in the building

## `hasFirePlace` (type: `string`):

Has a fireplace (cheminée)

## `heating` (type: `string`):

Heating type (chauffage)

## `energyClassification` (type: `string`):

Energy performance class A–G (DPE)

## `greenhouseGazClassification` (type: `string`):

Greenhouse gas class A–G (GES)

## `energyValue` (type: `string`):

Energy consumption (kWh/m²/yr)

## `greenhouseGazValue` (type: `string`):

CO₂ emissions (kg/m²/yr)

## `energyPerformanceDate` (type: `string`):

Date of the energy diagnostic

## `city` (type: `string`):

City / commune (with arrondissement)

## `postalCode` (type: `string`):

Postal code

## `departmentCode` (type: `string`):

French département code

## `district` (type: `string`):

Neighborhood / quartier

## `districtInsee` (type: `string`):

INSEE code of the district

## `latitude` (type: `string`):

Approx GPS latitude (Bien'ici blurs exact position)

## `longitude` (type: `string`):

Approx GPS longitude (Bien'ici blurs exact position)

## `addressKnown` (type: `string`):

Whether the exact address is disclosed

## `mainImageUrl` (type: `string`):

Cover photo URL

## `imageUrls` (type: `string`):

All listing image URLs

## `imageCount` (type: `string`):

Number of images

## `with360` (type: `string`):

Has a 360° virtual tour

## `with3dModel` (type: `string`):

Has a 3D model

## `accountType` (type: `string`):

agency / mandatary / private

## `accountDisplayName` (type: `string`):

Agency / advertiser display name

## `customerId` (type: `string`):

Bien'ici advertiser account ID

## `adCreatedByPro` (type: `string`):

True if posted by a professional

## `isBienIciExclusive` (type: `string`):

Bien'ici exclusive listing flag

## `publicationDate` (type: `string`):

Publication date (ISO 8601)

## `modificationDate` (type: `string`):

Last modification date (ISO 8601)

## `searchTransaction` (type: `string`):

Transaction used in search

## `searchLocation` (type: `string`):

Resolved location label used in search

## `searchZoneIds` (type: `string`):

Bien'ici zone IDs used in search

## `scrapedAt` (type: `string`):

ISO timestamp

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        "Paris"
    ],
    "zoneIds": [],
    "propertyTypes": [
        "flat",
        "house"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "FR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/bien-ici-fr-scraper-france-real-estate").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "locations": ["Paris"],
    "zoneIds": [],
    "propertyTypes": [
        "flat",
        "house",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "FR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/bien-ici-fr-scraper-france-real-estate").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    "Paris"
  ],
  "zoneIds": [],
  "propertyTypes": [
    "flat",
    "house"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FR"
  }
}' |
apify call logiover/bien-ici-fr-scraper-france-real-estate --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=logiover/bien-ici-fr-scraper-france-real-estate",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Bien'ici Scraper — France Real Estate Data",
        "description": "Scrape France real estate listings from Bien'ici (bienici.com) via its public JSON API — no browser. Filter by location, buy/rent, property type, price (€), area, rooms, bedrooms. Returns price, €/m², DPE energy class, GPS, city/district, agency and images per listing.",
        "version": "1.0",
        "x-build-id": "a0z0ALchZdmgpMgWn"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~bien-ici-fr-scraper-france-real-estate/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-bien-ici-fr-scraper-france-real-estate",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/logiover~bien-ici-fr-scraper-france-real-estate/runs": {
            "post": {
                "operationId": "runs-sync-logiover-bien-ici-fr-scraper-france-real-estate",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/logiover~bien-ici-fr-scraper-france-real-estate/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-bien-ici-fr-scraper-france-real-estate",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "locations": {
                        "title": "Locations (city / district names)",
                        "type": "array",
                        "description": "French place names to search — e.g. `Paris`, `Lyon`, `Marseille`, `Bordeaux 33000`, `Paris 15e`, `Nice`, `Toulouse`. Each entry is resolved to a Bien'ici zone via the site's own geo-suggest and becomes its own scraping task. Cities, arrondissements, départements and postal codes all work. Leave empty (and leave Zone IDs empty) to search all of France.",
                        "default": [
                            "Paris"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "zoneIds": {
                        "title": "Zone IDs (advanced)",
                        "type": "array",
                        "description": "Optional Bien'ici internal zone IDs (e.g. `-7444` for Paris). Advanced escape hatch when a place name is ambiguous — grab them from a bienici.com search URL's `filters` parameter. All IDs listed here are combined into a single search. Usually you can ignore this and just use Locations.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "transaction": {
                        "title": "Transaction Type",
                        "enum": [
                            "buy",
                            "rent"
                        ],
                        "type": "string",
                        "description": "Buy (achat / vente) or rent (location).",
                        "default": "buy"
                    },
                    "propertyTypes": {
                        "title": "Property Types",
                        "type": "array",
                        "description": "One or more Bien'ici property categories. Combine freely (e.g. flat + house).",
                        "items": {
                            "type": "string",
                            "enum": [
                                "flat",
                                "house",
                                "loft",
                                "townhouse",
                                "castle",
                                "building",
                                "terrain",
                                "parking",
                                "shop",
                                "office",
                                "premises",
                                "others"
                            ],
                            "enumTitles": [
                                "Apartment (appartement)",
                                "House (maison)",
                                "Loft",
                                "Townhouse (hôtel particulier)",
                                "Castle (château)",
                                "Building (immeuble)",
                                "Land / plot (terrain)",
                                "Parking / garage",
                                "Shop (local commercial)",
                                "Office (bureau)",
                                "Premises (local / fonds)",
                                "Other"
                            ]
                        },
                        "default": [
                            "flat",
                            "house"
                        ]
                    },
                    "priceMin": {
                        "title": "Min Price (€)",
                        "minimum": 0,
                        "maximum": 1000000000,
                        "type": "integer",
                        "description": "Minimum price in euros. For rent this is monthly rent. 0 = no minimum.",
                        "default": 0
                    },
                    "priceMax": {
                        "title": "Max Price (€)",
                        "minimum": 0,
                        "maximum": 1000000000,
                        "type": "integer",
                        "description": "Maximum price in euros. For rent this is monthly rent. 0 = no maximum.",
                        "default": 0
                    },
                    "areaMin": {
                        "title": "Min Area (m²)",
                        "minimum": 0,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Minimum living area in square meters. 0 = no minimum.",
                        "default": 0
                    },
                    "areaMax": {
                        "title": "Max Area (m²)",
                        "minimum": 0,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Maximum living area in square meters. 0 = no maximum.",
                        "default": 0
                    },
                    "roomsMin": {
                        "title": "Min Rooms",
                        "minimum": 0,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Minimum total rooms (pièces). In France a studio = 1 room, a 2-room flat = T2, etc. 0 = no minimum.",
                        "default": 0
                    },
                    "roomsMax": {
                        "title": "Max Rooms",
                        "minimum": 0,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum total rooms (pièces). 0 = no maximum.",
                        "default": 0
                    },
                    "bedroomsMin": {
                        "title": "Min Bedrooms",
                        "minimum": 0,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Minimum number of bedrooms (chambres). 0 = no minimum.",
                        "default": 0
                    },
                    "newBuildOnly": {
                        "title": "New Build Only (neuf)",
                        "type": "boolean",
                        "description": "Only return brand-new / off-plan developer properties (immobilier neuf).",
                        "default": false
                    },
                    "sort": {
                        "title": "Sort Order",
                        "enum": [
                            "relevance",
                            "newest",
                            "price_asc",
                            "price_desc",
                            "area_asc",
                            "area_desc",
                            "price_per_m_asc",
                            "price_per_m_desc"
                        ],
                        "type": "string",
                        "description": "Result ordering.",
                        "default": "relevance"
                    },
                    "pageSize": {
                        "title": "Listings per Page",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Page size for the API (1–100). Larger pages mean fewer requests.",
                        "default": 24
                    },
                    "maxListings": {
                        "title": "Max Listings",
                        "minimum": 0,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Total cap across all location tasks (0 = unlimited).",
                        "default": 200
                    },
                    "maxPagesPerTask": {
                        "title": "Max Pages per Task",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Pagination depth per location. Combined with page size this caps listings per location. Narrow with price/area filters to reach deeper inventory.",
                        "default": 5
                    },
                    "requestDelay": {
                        "title": "Request Delay (ms)",
                        "minimum": 0,
                        "maximum": 30000,
                        "type": "integer",
                        "description": "Delay between sequential requests. Keep ≥ 500 ms to stay polite.",
                        "default": 700
                    },
                    "maxRetries": {
                        "title": "Max Retries",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Retries per request on HTTP / proxy errors (rotates proxy IP each attempt).",
                        "default": 3
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify Proxy is required. Bien'ici's API is served from France — RESIDENTIAL with country=FR is strongly recommended for reliable access.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "FR"
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
