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

Scrape real estate listings from bienici.com — major French property portal backed by the FNAIM network. Extract prices, price per m², surface, rooms, energy grades, photos, and agency names for apartments, houses, and more. Filter by city, transaction type, and budget. No login required.

- **URL**: https://apify.com/studio-amba/bienici-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Real estate
- **Stats:** 1 total users, 1 monthly users, 97.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 result 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 — French Real Estate Listings

Scrape real estate listings from [bienici.com](https://www.bienici.com), one of France's largest property portals, backed by the FNAIM agency network. The site carries close to a million for-sale ads and tens of thousands of rentals across the whole country.

This scraper takes a free-text location (any French city, department, or region) and returns structured listing data: prices, price per m², surface, rooms, energy grades, photos, and agency names. No login, no cookies, no browser.

### What you get

- **Prices** in EUR, plus computed price per square meter
- **Property details**: surface, rooms, bedrooms, property type
- **Location**: city, postal code, and district / neighbourhood when available
- **Energy data**: DPE energy grade and greenhouse gas grade (A–G)
- **Photos**: up to 5 photo URLs per listing
- **Agency name** when the listing displays one
- **Direct URL** to every listing on bienici.com

### Use cases

- Market research on French residential real estate
- Price monitoring for a city, department, or region
- Feeding property data into valuation or investment models
- Tracking new listings for a specific budget range
- Building datasets of energy performance (DPE) across French housing stock

### Input

| Field | Type | Description |
|-------|------|-------------|
| `location` | string | French city, department, or region (e.g. `Paris`, `Lyon`, `Rhône`). Default: `Paris` |
| `transaction` | string | `buy` (for sale) or `rent`. Default: `buy` |
| `propertyType` | array | Optional filter: `flat`, `house`, `terrain`, `parking`, `building`, `loft`, `castle`, `townhouse`, `premises`, `shop`, `office`, `others` |
| `minPrice` / `maxPrice` | integer | Optional price bounds in EUR |
| `maxResults` | integer | Maximum listings to return. Default: 100 |
| `proxyConfiguration` | object | Proxy settings. Default: Apify proxy |

Example input:

```json
{
    "location": "Lyon",
    "transaction": "buy",
    "propertyType": ["flat"],
    "maxPrice": 400000,
    "maxResults": 100
}
```

### Output

One dataset item per listing. Real sample from a live run:

```json
{
    "id": "adapt-immo-85002126339",
    "title": "Appartement",
    "propertyType": "flat",
    "transaction": "buy",
    "price": 535000,
    "currency": "EUR",
    "pricePerSqm": 9892.79,
    "surface": 52,
    "rooms": 3,
    "bedrooms": 1,
    "city": "Paris 15e",
    "postalCode": "75015",
    "district": "Paris 15e Arrondissement - Cambronne - Garibaldi",
    "energyGrade": "E",
    "gasGrade": "C",
    "photos": [
        "https://file.bienici.com/photo/adapt-immo-85002126339_photos.exportadapt.com_85002_85002126339_12.jpg",
        "https://file.bienici.com/photo/adapt-immo-85002126339_photos.exportadapt.com_85002_85002126339_7.jpg"
    ],
    "agencyName": null,
    "approximateLocation": true,
    "url": "https://www.bienici.com/annonce/vente/paris-15e/appartement/adapt-immo-85002126339",
    "publicationDate": "2026-07-11T18:20:15.068Z",
    "scrapedAt": "2026-07-11T18:51:12.621Z"
}
```

A note on `approximateLocation`: Bien'ici blurs listing coordinates to a city or arrondissement centroid, so exact addresses and GPS positions are not public. This scraper does not output coordinates to avoid pretending precision that isn't there. City, postal code, and district are exact.

`publicationDate` can be `null` — many agency-feed ads carry no real publication date.

### How to scrape Bien'ici data

1. Open the [Bien'ici Scraper](https://apify.com/jelledesramaults/bienici-scraper) on Apify
2. Enter a location (any French city, department, or region — "Paris", "Bordeaux", "Rhône" all work)
3. Pick the transaction type: for sale or for rent
4. Optionally narrow down by property type and price range
5. Set how many listings you want and click **Start**
6. Download the results as JSON, CSV, or Excel from the dataset tab

You can also run it programmatically via the [Apify API](https://docs.apify.com/api/v2) or schedule it to track a market over time:

```bash
curl -X POST "https://api.apify.com/v2/acts/jelledesramaults~bienici-scraper/runs?token=YOUR_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{"location": "Marseille", "transaction": "rent", "maxResults": 200}'
```

### Large searches

Bien'ici's search API returns at most 2,500 results per query. When your search matches more than that (Paris alone has over 12,000 for-sale ads), the scraper automatically splits the search into price bands and pages each band separately, deduplicating on listing ID. You can request tens of thousands of listings from a single run without doing anything special.

### FAQ

**Does it need a login or cookies?**
No. All data comes from Bien'ici's public search, the same one every visitor uses.

**How fresh is the data?**
Live at run time. Bien'ici caches search responses for up to an hour on its CDN, so back-to-back identical runs may return identical data.

**Can I get exact addresses or GPS coordinates?**
No. Bien'ici does not publish exact addresses — positions are blurred to the city or arrondissement level by the portal itself. That's why items carry `approximateLocation: true` and no coordinate fields.

**Can I search the whole of France?**
Yes — use a region or department as the location, or run multiple searches. For nationwide extracts, run one search per department for cleaner sharding.

**Are rentals supported?**
Yes, set `transaction` to `rent`. Prices are then monthly rents in EUR.

**Is scraping this data legal?**
The scraper only collects publicly available listing data, no personal accounts and no data behind a login. You are responsible for how you use the data — respect applicable laws in your jurisdiction.

### Related scrapers

More European real estate scrapers from the same developer:

- [SeLoger Scraper](https://apify.com/jelledesramaults/seloger-scraper) — French real estate listings from seloger.com
- [Leboncoin Scraper](https://apify.com/jelledesramaults/leboncoin-scraper) — France's biggest classifieds site
- [Logic-Immo Scraper](https://apify.com/jelledesramaults/logicimmo-scraper) — French property listings from logic-immo.com
- [Idealista Scraper](https://apify.com/jelledesramaults/idealista-scraper) — Spanish real estate listings
- [Immobiliare.it Scraper](https://apify.com/jelledesramaults/immobiliare-scraper) — Italian real estate listings
- [Immoweb Scraper](https://apify.com/jelledesramaults/immoweb-scraper) — Belgium's #1 property portal
- [Zimmo Scraper](https://apify.com/jelledesramaults/zimmo-scraper) — Belgian real estate listings

### Support

If something breaks or you need an extra field, open an issue on the [Issues tab](https://apify.com/jelledesramaults/bienici-scraper/issues). Custom scraper requests are welcome too.

# Actor input Schema

## `location` (type: `string`):

French city, department, or region to search (e.g. 'Paris', 'Lyon', 'Rhône', 'Bordeaux'). Resolved automatically via Bien'ici's location search.

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

Search listings for sale or for rent.

## `propertyType` (type: `array`):

Filter by property type. Leave empty to include all types.

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

Minimum price in euros.

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

Maximum price in euros.

## `maxResults` (type: `integer`):

Maximum number of listings to return. Searches matching more than 2,500 ads are automatically split into price bands to get around the API result window.

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

Proxy settings for reliability at scale.

## Actor input object example

```json
{
  "location": "Paris",
  "transaction": "buy",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "location": "Paris",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/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 = {
    "location": "Paris",
    "maxResults": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/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 '{
  "location": "Paris",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/bienici-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/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/b9hXJZq442XmMh9Oj/builds/PVQH6uGicgmBnxuk8/openapi.json
