# Bien'ici Scraper - French Real Estate Listings (`smolder/bienici-scraper`) Actor

Scrape Bien'ici (bienici.com) property listings for sale and rent across France: price, €/m², surface, rooms, DPE energy class, location and agency. Fast HTTP-only scraper with filters and new-listing monitoring.

- **URL**: https://apify.com/smolder/bienici-scraper.md
- **Developed by:** [Yassine Cherkaoui](https://apify.com/smolder) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 listing scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Bien'ici Scraper: French Real Estate Listings (vente & location)

Extract property listings from **[Bien'ici](https://www.bienici.com)**, one of France's largest real estate portals, into a clean spreadsheet. You get price, **price per m²**, surface, rooms, **DPE energy class**, location, agency and 60+ other fields for apartments, houses, land and commercial property, for sale or for rent, anywhere in France.

**🇫🇷 En bref :** scraper Bien'ici pour exporter les annonces immobilières (vente et location) en Excel, CSV ou JSON : prix, prix au m², surface, pièces, DPE, ville, agence. Idéal pour la pige immobilière, l'estimation et l'étude de marché.

### What does Bien'ici Scraper do?

- 🔎 **Searches like the website:** location, buy or rent, property type, price, surface, rooms, bedrooms, DPE class, new build, furnished.
- 📈 **Goes past the website's limit:** Bien'ici only shows 2,500 results per search. This scraper automatically splits big searches into price ranges, so you can export **up to 100,000 listings in one run**.
- 🔔 **Monitors new listings:** turn on *monitoring mode* and schedule the scraper daily. Each run returns only listings you haven't seen before.
- ⚡ **Fast and cheap:** it reads Bien'ici's own data feed, with no browser. In our tests on Apify (512 MB memory, Gironde), 10,000 listings took about 2 minutes.
- 🧹 **Clean, flat output:** one row per listing, ready for Excel, Google Sheets, Power BI or your database.

### Who is it for?

- **Real estate agents and networks:** daily *pige*, new listings in your area, competitor stock.
- **Investors:** compare **€/m²** across cities and districts, find price drops, yield studies.
- **Proptech and data teams:** feed valuation models (AVM), dashboards and market reports.
- **Researchers and journalists:** rent levels, energy-efficiency (DPE) statistics, housing supply.

### How to use it

1. Click **Try for free**.
2. Enter one or more **locations**: a city (`Lyon`), an arrondissement (`Paris 11e`), a department (`Gironde` or `33`) or a postal code (`69003`).
3. Choose **buy or rent**, property types and any filters.
4. Set **Maximum listings** and click **Start**.
5. Download your data as **Excel, CSV, JSON or HTML**, or connect it to Google Sheets, Make, Zapier or n8n.

To get only fresh listings every day, enable **Only new listings (monitoring mode)**, give the search a **monitoring key** like `bordeaux-t3`, and [schedule](https://docs.apify.com/platform/schedules) the run.

### Input example

```json
{
    "locations": ["Bordeaux", "Mérignac"],
    "transactionType": "buy",
    "propertyTypes": ["flat"],
    "minRooms": 3,
    "maxPrice": 400000,
    "energyClasses": ["A", "B", "C", "D"],
    "sortBy": "newest",
    "maxItems": 500
}
```

Every option is explained in the **Input** tab. Prices are in euros; for rentals, the price is the monthly rent.

### Output example

Each listing is one row. Here is a real example (description and photos shortened):

```json
{
    "id": "netty-nicolasimmo-appt-2700",
    "url": "https://www.bienici.com/annonce/netty-nicolasimmo-appt-2700",
    "transactionType": "buy",
    "propertyType": "flat",
    "isNewBuild": false,
    "title": "Appartement T3 60,70 m² avec balcon – Bordeaux Sainte-Catheri",
    "price": 299000,
    "currency": "EUR",
    "pricePerSquareMeter": 4925.05,
    "feesChargedTo": "seller",
    "surfaceArea": 60.71,
    "rooms": 3,
    "bedrooms": 2,
    "bathrooms": 1,
    "floor": 2,
    "floorsInBuilding": 5,
    "hasElevator": false,
    "hasBalcony": true,
    "heating": "électrique individuel",
    "exposition": "Ouest",
    "energyClass": "D",
    "energyConsumption": 245,
    "ghgClass": "B",
    "estimatedEnergyCostMin": 1410,
    "estimatedEnergyCostMax": 1930,
    "city": "Bordeaux",
    "postalCode": "33000",
    "departmentCode": "33",
    "district": "Saint-Pierre",
    "latitude": 44.84088,
    "longitude": -0.57329,
    "locationPrecision": "disk",
    "locationRadiusMeters": 250,
    "sellerType": "agency",
    "sellerName": "NICOLAS IMMOBILIER",
    "isExclusiveMandate": true,
    "priceHasDecreased": false,
    "photoCount": 12,
    "mainPhotoUrl": "https://file.bienici.com/photo/netty-nicolasimmo-appt-2700_img…jpg",
    "description": "Appartement à vendre à Bordeaux centre, secteur Sainte-Catherine : ce T3 de 60,70 m² Carrez…",
    "publicationDate": "2026-10-23T12:25:22.577Z",
    "modificationDate": "2026-10-24T18:54:01.997Z",
    "scrapedAt": "2026-10-24T19:38:48.836Z"
}
```

Other fields include rent without charges, monthly charges, deposit, co-ownership fees, land area, year built, pool, garden, terrace, cellar, parking, new-build price ranges (`priceMax`, `surfaceAreaMax`), all photo URLs, virtual tour and availability dates. The full list with descriptions is in the **Output** tab.

### How much does it cost?

You pay **$1.50 per 1,000 listings**, plus a tiny fee per run. Platform usage is included.

| Listings | Price  |
| -------- | ------ |
| 100      | $0.15  |
| 1,000    | $1.50  |
| 10,000   | $15.00 |

The **Apify Free plan** includes monthly credit, enough for thousands of listings to try it out. You can set a **maximum cost per run** in the run options; the scraper stops when that budget is reached, you are never charged more than it, and you only pay for listings you receive.

### Tips

- **Big exports:** set `maxItems` up to 100,000. Searches over 2,500 listings are split by price automatically. The log shows each range.
- **Sort order:** for searches under 2,500 listings, results follow your chosen sort. For larger ones, the sort applies within each price range.
- **Regions:** Bien'ici's location search doesn't support regions, so list the departments instead (for example `Finistère`, `Morbihan`, `Côtes-d'Armor`, `Ille-et-Vilaine` for Bretagne).
- **Check your locations:** the log shows what each location matched, for example `Location "69003" → Lyon 3e (69003), arrondissement`.
- **Monitoring:** use a different monitoring key for each saved search so their histories don't mix.

### FAQ

**Is it legal to scrape Bien'ici?**
This scraper only collects publicly visible listing data published by real estate professionals. It does not log in, bypass any protection or collect phone numbers or email addresses; any that appear in a title or description are replaced with `[phone removed]` / `[email removed]`. Bien'ici's terms of use may restrict automated access and reuse of its content, so make sure your use complies with them and with the GDPR, especially if you republish data. If in doubt, consult a lawyer. Read more in Apify's post on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

**Why is `publicationDate` sometimes empty?**
Bien'ici doesn't share the publication date for every listing. `modificationDate` is almost always available. When you use *Posted within the last N days*, listings without a date are skipped.

**How precise are the coordinates?**
Many agencies hide the exact address. `locationPrecision` tells you how precise each position is: `exact`, `disk` (the property is within `locationRadiusMeters` of the point, typically 125–500 m, at most 1 km), `postalCode` or `cityOrArrondissement` (centre of the town).

**Why is `sellerName` empty for some listings?**
Not every advertiser shares a display name in Bien'ici's data. Private individuals are never named.

**Do I need a proxy?**
The default Apify datacenter proxy works well. If the log shows blocked requests, switch to residential proxies with country France.

**Can I get a custom field or another portal (SeLoger, Leboncoin, PAP)?**
Open an issue in the **Issues** tab. Feedback shapes the roadmap.

### Limitations

- Only listings currently on the market are returned (no sold-price history).
- A single price point with more than 2,500 listings (rare, for example thousands of parking spaces at the same price) can only be fetched up to 2,500. The log tells you when that happens.
- Data is as accurate as what agencies publish on Bien'ici.

### Support

Found a bug or need a feature? Open an issue in the **Issues** tab and include your run ID.

# Actor input Schema

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

Cities, Paris/Lyon/Marseille arrondissements, departments or postal codes, for example "Lyon", "Paris 11e", "Gironde", "33" or "69003". Each entry is matched against Bien'ici's own location search and the match is shown in the log. Regions are not supported, so list their departments instead. Leave empty to search all of France.

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

Listings for sale (vente) or for rent (location).

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

Which kinds of property to include. Defaults to apartments and houses.

## `propertyCondition` (type: `string`):

Restrict to new-build developments (programmes neufs) or to existing properties (ancien).

## `minPrice` (type: `integer`):

Lowest price in euros. For rentals this is the monthly rent.

## `maxPrice` (type: `integer`):

Highest price in euros. For rentals this is the monthly rent.

## `minArea` (type: `integer`):

Smallest living area in square metres.

## `maxArea` (type: `integer`):

Largest living area in square metres.

## `minRooms` (type: `integer`):

Fewest rooms, counted the French way (T2 = 2 pièces).

## `maxRooms` (type: `integer`):

Most rooms, counted the French way (T2 = 2 pièces).

## `minBedrooms` (type: `integer`):

Fewest bedrooms (chambres).

## `energyClasses` (type: `array`):

Only include listings with these DPE energy ratings. Leave empty for all.

## `furnished` (type: `string`):

Furnished (meublé) or unfurnished (vide) rentals. Ignored for sales.

## `postedWithinDays` (type: `integer`):

Only return listings published in the last N days, sorted newest first. Listings without a publication date are skipped when this is set. Leave empty for no date limit.

## `sortBy` (type: `string`):

Order of results. For searches over 2,500 listings, results are fetched in price ranges and this order applies within each range.

## `maxItems` (type: `integer`):

Stop after saving this many listings. Searches larger than 2,500 listings are split into price ranges automatically, so you can collect up to 100,000 in one run.

## `includeDescription` (type: `boolean`):

Add the full listing description. Turn off for smaller exports. Phone numbers and emails in descriptions are always removed.

## `monitoringMode` (type: `boolean`):

Skip listings already returned by earlier runs that used the same monitoring key. Ideal for a daily schedule that delivers only fresh listings.

## `monitoringKey` (type: `string`):

Name for this saved search, for example "lyon-t3-under-300k". Runs with the same key share their history. Use different keys for different searches.

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

Apify Proxy keeps requests reliable. The default datacenter proxy is usually enough. Switch to residential proxies (country FR) only if you see blocked requests in the log.

## Actor input object example

```json
{
  "locations": [
    "Lyon"
  ],
  "transactionType": "buy",
  "propertyTypes": [
    "flat",
    "house"
  ],
  "propertyCondition": "any",
  "energyClasses": [],
  "furnished": "any",
  "sortBy": "newest",
  "maxItems": 100,
  "includeDescription": true,
  "monitoringMode": false,
  "monitoringKey": "default",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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": [
        "Lyon"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("smolder/bienici-scraper").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": ["Lyon"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("smolder/bienici-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).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": [
    "Lyon"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call smolder/bienici-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,smolder/bienici-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/hbF88yOtMn6gpSQm0/builds/71JBWl8PYvd0skuAW/openapi.json
