# Bien'ici Scraper — French Property Listings & Prices (`haketa/bienici-scraper`) Actor

Scrape French property listings from Bien'ici: sale & rental prices, price per m², surface, rooms, DPE energy rating, price-drop signals, district & photos. Filter by city, price, area and type across France. Export to JSON, CSV or Excel for market research & valuation.

- **URL**: https://apify.com/haketa/bienici-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Real estate
- **Features:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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/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 Property Listings, Prices & DPE Energy Ratings 🇫🇷🏠

> **Turn [Bien'ici](https://www.bienici.com/) — one of France's premier real estate portals — into structured property market intelligence.** This **Bien'ici scraper** extracts active **sale and rental property listings** across France, capturing transaction prices, **price per square meter (€/m²)**, living area, room counts, official **DPE energy efficiency ratings (A-G)**, greenhouse gas emissions (GES), monthly charges, price-reduction flags, professional agency details, geographic districts, and high-resolution photo galleries. **No login, no coding, no captcha.**

Export to **JSON, CSV, Excel, or API** — or connect directly into PostgreSQL, BigQuery, Airtable, Google Sheets, Make, Zapier, and n8n.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue)](https://apify.com/haketa/bienici-scraper)
[![Portal Coverage](https://img.shields.io/badge/Data%20Source-Bien'ici%20France-success)]()
[![Deep Pagination](https://img.shields.io/badge/Pagination-1%2C000%2B%20Unlocked-brightgreen)]()
[![Coverage](https://img.shields.io/badge/Coverage-Nationwide%20\(France\)-red)]()
[![Energy Ratings](https://img.shields.io/badge/Metrics-DPE%20%7C%20GES%20%7C%20%E2%82%AC%2Fm%C2%B2-purple)]()
[![Output Formats](https://img.shields.io/badge/Format-JSON%20%7C%20CSV%20%7C%20Excel-orange)]()

> **Built for:** real estate investors, PropTech developers, valuation & CMA appraisers, mortgage brokers, housing market analysts, data journalists, and asset management funds tracking French residential and commercial property markets.

***

### ⚡ At a glance

| Feature | Details |
|---|---|
| **Data Source** | Bien'ici (bienici.com) — Premier French Real Estate Marketplace |
| **Geographic Scope** | All 101 French departments, major metros (Paris, Lyon, Marseille, Bordeaux, Toulouse), and overseas territories |
| **Transaction Types** | Properties for sale (`buy`), rentals (`rent`), and life annuity sales (*viager*) |
| **Property Types** | Flats/Apartments, Houses, Lofts, Townhouses, Castles (*Châteaux*), Entire Buildings, Land (*Terrain*), Offices |
| **Key Output Fields** | Listing ID, canonical URL, transaction type, property category, title, price, €/m², surface area, rooms, DPE, location |
| **Energy Metrics** | Official French DPE rating (`A` to `G`) and value (kWh/m²/year), GES rating and value (kg CO₂/m²/year) |
| **Price Drop Signal** | Automatic tracking of price reduction flags (`priceHasDecreased: true`) to identify motivated sellers |
| **Export Formats** | JSON, CSV, Excel (XLSX), XML, HTML table, webhook & REST API |
| **Max Capacity** | Scalable from 100 sample records to 1,000+ listings with automatic multi-city expansion |
| **Execution Speed** | Up to 500 listings per request; fast prefill runs finish in under 15 seconds |

***

### 🔎 Why scrape Bien'ici?

**Bien'ici** is one of the most comprehensive property portals in France, founded by major real estate federations and syndicates (including FNAIM, SNPI, and UNIS). It aggregates hundreds of thousands of residential and commercial listings directly from verified estate agencies (*agences immobilières*) and developers across metropolitan France.

Unlike generic classifieds, Bien'ici listings carry standardized, high-integrity regulatory attributes:

- **Comparable Market Analysis (CMA) & Property Valuation:** Real estate agents, surveyors, and automated valuation models (AVMs) require verified asking prices and calculated price per square meter (`pricePerSquareMeter`) across specific arrondissements and neighborhoods to benchmark true market value.
- **Energy Efficiency & Renovation Arbitrage (DPE):** Under recent French energy transition legislation (Loi Climat et Résilience), properties with poor energy ratings (*passoires thermiques* — classes F and G) face rental restrictions and impending lease bans. Investors use this scraper to identify underpriced F/G properties prime for energy retrofit and capital appreciation.
- **Motivated Seller & Price Drop Alerts:** Monitor the `priceHasDecreased` boolean flag to detect price corrections in cooling markets, allowing buyers and institutional funds to negotiate favorable acquisitions before competing bids emerge.
- **Rental Yield & Cash-Flow Modeling:** Compare monthly rental revenues against acquisition costs across student towns (Lille, Rennes, Montpellier) and commercial hubs to calculate gross rental yields.
- **PropTech & Aggregator Feeds:** Fuel property search engines, map visualizations, and regional market barometers with clean, de-duplicated listing data.

***

### 🗂️ Covered Property Categories

This scraper supports filtering and extraction across all major French property classifications:

1. **Flats & Apartments (`flat`):** Studio apartments, T1/T2/T3/T4/T5 residential flats, duplexes, triplexes, and rooftop penthouses across urban metros.
2. **Houses & Villas (`house`):** Detached single-family homes, suburban pavilions, country properties, and luxury villas.
3. **Lofts & Workshops (`loft`):** Converted industrial lofts and open-plan residential spaces.
4. **Townhouses (`townhouse`):** Historic and modern urban townhomes (*hôtels particuliers*).
5. **Castles & Manors (`castle`):** French châteaux, historic estates, manoirs, and rural prestige domains.
6. **Investment Buildings (`building`):** Entire residential and mixed-use buildings (*immeubles de rapport*) for multi-family investors.
7. **Building Land (`terrain`):** Residential plots, subdividable land, and commercial development parcels.
8. **Offices & Retail (`office`, `shop`, `premises`):** Commercial workspaces, boutique retail stores, and light industrial facilities.

***

### ✨ Key Features & Capabilities

- ✅ **Automatic Location Resolution:** Type any French city name (e.g., `"Paris"`, `"Lyon"`, `"Bordeaux"`, `"Nice"`), district, or department code; the scraper automatically maps it to official Bien'ici geographic zone identifiers.
- ✅ **Deep 1,000+ Record Pagination:** Unlocked pagination engine retrieves hundreds of records per batch and scales smoothly to 1,000+ listings without hitting arbitrary limits.
- ✅ **Calculated Price per m²:** Computes accurate €/m² metrics for every listing based on declared living surface area and purchase or rental figures.
- ✅ **Full DPE & GES Climate Ratings:** Extracts standardized energy classifications (`energyClassification`) and greenhouse gas emission scores (`greenhouseGazClassification`).
- ✅ **Detailed Architectural Features:** Captures floor number, total building floors, construction year, heating type, elevator presence, balconies, terraces, and private gardens.
- ✅ **Condominium Financials:** Extracts annual co-ownership charges (*charges annuelles de copropriété*) and security deposits for rental listings.
- ✅ **Zero Duplicates Guarantee:** Maintains an in-memory SHA-based ID index across pagination pages to guarantee 100% unique records in every dataset.

***

### 📊 Extracted Data Fields

The scraper maps raw portal listings into a unified, developer-ready schema:

#### 🏠 Property Identification & Core Attributes

| Field | Coverage | Description |
|---|---|---|
| `id` | 🟢 High (100%) | Unique Bien'ici listing identifier (e.g., `bienici-1234567`) |
| `url` | 🟢 High (100%) | Canonical URL to the live listing page on Bien'ici |
| `adType` | 🟢 High (100%) | Transaction classification: `buy` (sale), `rent` (rental), or `lifeAnnuitySale` |
| `propertyType` | 🟢 High (100%) | Standardized property type: `flat`, `house`, `loft`, `building`, `terrain`, etc. |
| `title` | 🟢 High (100%) | Headline listing title provided by the marketing agency |
| `description` | 🟢 High (98%) | Full textual property description formatted in clean text |

#### 💶 Pricing & Transaction Intelligence

| Field | Coverage | Description |
|---|---|---|
| `price` | 🟢 High (99%) | Total sale price or monthly rent in Euros (€) |
| `pricePerSquareMeter` | 🟢 High (98%) | Computed price per square meter in €/m² |
| `priceHasDecreased` | 🟢 High (100%) | Boolean flag: `true` if listing price was recently marked down |
| `priceWithoutFees` | 🟡 Conditional | Net seller price excluding agency commissions (*prix net vendeur*) |
| `annualCondominiumFees`| 🟡 Conditional | Declared annual building co-ownership maintenance fees (*charges*) |
| `guaranteeAmount` | 🟡 Conditional | Security deposit amount required for rental leases |

#### 📐 Space, Layout & Interior Specifications

| Field | Coverage | Description |
|---|---|---|
| `surfaceArea` | 🟢 High (99%) | Living interior surface area in square meters (m²) |
| `landSurfaceArea` | 🟡 Conditional | Total exterior plot or garden area in m² (houses and land) |
| `roomsQuantity` | 🟢 High (99%) | Total number of rooms (T1, T2, T3, etc.) |
| `bedroomsQuantity` | 🟢 High (92%) | Dedicated bedroom count |
| `floor` | 🟡 Conditional | Specific floor level in multi-story residential buildings |
| `floorQuantity` | 🟡 Conditional | Total number of floors in the residential building |
| `yearOfConstruction` | 🟡 Conditional | Original building construction year |
| `heating` | 🟡 Conditional | Heating type (collective, individual electric, gas radiator, heat pump) |
| `features` | 🟢 High (100%) | Array of amenities: garden, terrace, balcony, cellar, elevator, parking, etc. |

#### ⚡ DPE & GES Environmental Ratings

| Field | Coverage | Description |
|---|---|---|
| `energyClassification` | 🟢 High (90%) | Official French DPE energy label: `A`, `B`, `C`, `D`, `E`, `F`, `G` |
| `energyValue` | 🟢 High (85%) | Energy consumption value measured in kWh/m²/year |
| `greenhouseGazClassification` | 🟢 High (88%) | Greenhouse gas emissions rating: `A` to `G` |
| `greenhouseGazValue` | 🟢 High (83%) | Climate impact measured in kg CO₂/m²/year |

#### 📍 Location & Agency Details

| Field | Coverage | Description |
|---|---|---|
| `city` | 🟢 High (100%) | Municipality name (e.g., `Paris`, `Lyon 6e Arrondissement`) |
| `postalCode` | 🟢 High (100%) | Official 5-digit French postal code (e.g., `75011`, `69006`) |
| `district` | 🟡 Conditional | Specific neighborhood or micro-district name |
| `latitude` | 🟢 High (95%) | Approximate latitude for GIS mapping and geographic clustering |
| `longitude` | 🟢 High (95%) | Approximate longitude for GIS mapping and geographic clustering |
| `accountName` | 🟡 Conditional | Name of the listing real estate agency or network |
| `accountType` | 🟢 High (100%) | Entity type: `agency` (professional) or `individual` |
| `photos` | 🟢 High (98%) | Array of high-resolution property image URLs |
| `scrapedAt` | 🟢 High (100%) | ISO 8601 UTC timestamp of record extraction |

***

### ⚙️ Input Parameters

Configure your crawl easily through the Apify Console or pass JSON parameters via API:

```json
{
  "searchLocations": ["Paris", "Lyon"],
  "filterType": "buy",
  "propertyTypes": ["flat", "house"],
  "minPrice": 200000,
  "maxPrice": 850000,
  "minArea": 40,
  "onlyPriceDrops": false,
  "sortBy": "relevance",
  "maxItems": 500
}
```

| Parameter | Type | Default | Description |
|---|---|---|---|
| `searchLocations` | `array` | `["Paris"]` (prefill), `[]` (default) | One or more French cities, districts, or departments to search. Leave empty for all of France. |
| `filterType` | `string` | `"buy"` | Transaction filter: `"buy"` for properties for sale, or `"rent"` for long-term rentals. |
| `propertyTypes` | `array` | `["flat", "house"]` | Selected property categories: `flat`, `house`, `loft`, `townhouse`, `building`, `terrain`, `office`, etc. |
| `minPrice` | `integer` | `null` | Minimum sale price or monthly rent in Euros (€). |
| `maxPrice` | `integer` | `null` | Maximum sale price or monthly rent in Euros (€). |
| `minArea` | `integer` | `null` | Minimum living surface area in square meters (m²). |
| `maxArea` | `integer` | `null` | Maximum living surface area in square meters (m²). |
| `minRooms` | `integer` | `null` | Minimum room count. |
| `onlyPriceDrops` | `boolean` | `false` | When true, isolates listings whose price has recently decreased. |
| `sortBy` | `string` | `"relevance"` | Result ordering: `relevance`, `newest`, `price-asc`, `price-desc`. |
| `maxItems` | `integer` | `100` (prefill), `0` (default) | Maximum total listings to return. Set to `0` for unlimited extraction. |
| `proxyConfiguration` | `object` | `{"useApifyProxy": true}` | Proxy configuration. Apify Datacenter proxies ensure fast, reliable downloads. |

***

### 📦 Sample Output

Every extracted listing is normalized into clean JSON:

```json
{
  "id": "bienici-immo-98765432",
  "url": "https://www.bienici.com/annonce/vente/appartement/paris-11e/bienici-immo-98765432",
  "adType": "buy",
  "propertyType": "flat",
  "title": "Appartement 3 pièces 68 m² Paris 11ème",
  "description": "Exclusivité. Au cœur du 11ème arrondissement, magnifique appartement traversant lumineux...",
  "price": 645000,
  "pricePerSquareMeter": 9485,
  "priceHasDecreased": true,
  "priceWithoutFees": 620000,
  "annualCondominiumFees": 2400,
  "surfaceArea": 68.0,
  "roomsQuantity": 3,
  "bedroomsQuantity": 2,
  "floor": 3,
  "floorQuantity": 6,
  "yearOfConstruction": 1910,
  "energyClassification": "D",
  "energyValue": 198,
  "greenhouseGazClassification": "D",
  "greenhouseGazValue": 42,
  "features": ["balcony", "cellar", "elevator", "intercom"],
  "city": "Paris 11e Arrondissement",
  "postalCode": "75011",
  "district": "Folie-Méricourt",
  "latitude": 48.8654,
  "longitude": 2.3762,
  "accountName": "AGENCE IMMOBILIERE DE L'EST",
  "accountType": "agency",
  "createdByPro": true,
  "photosCount": 12,
  "publicationDate": "2026-10-15T09:30:00Z",
  "scrapedAt": "2026-11-10T12:00:00.000Z"
}
```

***

### 💡 Practical Real Estate Use Cases

#### 1. DPE Renovation & Energy Arbitrage Screening

Under the French Climate Law, properties rated `G` face rental bans starting in 2025, with `F` following by 2028. Real estate flippers and green retrofit funds can scrape properties for sale with `energyClassification` in `['F', 'G']` and negotiate aggressive purchase discounts to execute thermal insulation retrofits.

#### 2. Comparable Market Analysis (CMA) for Appraisers

Before listing a property, estate agents can pull all active listings within the same postal code or micro-district. Filter by matching room counts and compare `pricePerSquareMeter` distributions to establish competitive pricing recommendations.

#### 3. Automated Price Reduction Monitoring

Run a daily scheduled crawl with `onlyPriceDrops: true` across major French cities. Feed newly reduced properties directly into Telegram, Slack, or CRM channels to contact listing agents ahead of retail buyers.

#### 4. French Buy-to-Let Rental Yield Modeling

Extract rental listings across student cities (e.g., Toulouse, Montpellier, Rennes) to determine median monthly rent per square meter by neighborhood. Cross-reference with asking sale prices to identify sub-markets delivering gross rental yields above 7%.

***

### 🗺️ French Regional & Metropolitan Coverage

The scraper provides complete coverage across metropolitan France and overseas departments:

- **Île-de-France (Greater Paris):** Paris (all 20 arrondissements), Hauts-de-Seine (92), Seine-Saint-Denis (93), Val-de-Marne (94), Yvelines (78), Essonne (91), Val-d'Oise (95), and Seine-et-Marne (77).
- **Auvergne-Rhône-Alpes:** Lyon metropolitan area, Villeurbanne, Grenoble, Saint-Étienne, Annecy, and Clermont-Ferrand.
- **Provence-Alpes-Côte d'Azur (PACA):** Marseille, Nice, Toulon, Cannes, Antibes, and Aix-en-Provence.
- **Nouvelle-Aquitaine & Occitanie:** Bordeaux, Toulouse, Montpellier, Nîmes, Pau, and La Rochelle.
- **Grand Est & Hauts-de-France:** Strasbourg, Lille, Reims, Nancy, and Metz.
- **Northwest & Atlantic Coast:** Nantes, Rennes, Brest, Angers, and Le Mans.

***

### 🚀 How to Run via Apify API

Trigger the actor programmatically from your Node.js, Python, or shell workflows:

#### Node.js (Apify Client)

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

const run = await client.actor('haketa/bienici-scraper').call({
    searchLocations: ['Bordeaux', 'Toulouse'],
    filterType: 'buy',
    propertyTypes: ['flat'],
    maxPrice: 400000,
    maxItems: 500,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Scraped ${items.length} French property listings.`);
```

#### Python (Apify Client)

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.getenv('APIFY_TOKEN'))

run = client.actor('haketa/bienici-scraper').call(run_input={
    'searchLocations': ['Lyon'],
    'filterType': 'buy',
    'minArea': 50,
    'onlyPriceDrops': True,
    'maxItems': 1000,
})

dataset_items = client.dataset(run['defaultDatasetId']).list_items().items
print(f'Retrieved {len(dataset_items)} price-reduced listings in Lyon.')
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/haketa~bienici-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchLocations": ["Paris"],
    "filterType": "buy",
    "propertyTypes": ["flat"],
    "maxItems": 250
  }'
```

***

### ❓ Frequently Asked Questions

**Are phone numbers and direct agency email addresses included?**
Bien'ici routes user inquiries through internal contact forms and obfuscates direct agent phone numbers and emails to protect customer privacy. The scraper extracts the verified agency business name (`accountName`), agency classification, and direct listing link.

**Can I request 1,000+ listings in a single run?**
Yes. You can set `maxItems` to `1000`, `5000`, or `0` (unlimited). When requesting 1,000+ items across broad criteria, the scraper paginates in batches of 500 listings and automatically expands across major French metropolitan zones if your primary search reaches exhaustion.

**How does price per m² calculation handle missing values?**
If the source listing does not explicitly declare a square meter price, the scraper automatically computes `pricePerSquareMeter = Math.round(price / surfaceArea)` for standard sales and rental properties, ensuring near 100% field coverage.

**What is the difference between buy, rent, and life annuity (viager)?**
`buy` covers standard freehold acquisitions. `rent` extracts monthly tenancy listings. `lifeAnnuitySale` (*viager*) covers the unique French life-annuity mechanism, where the purchase price represents an initial lump sum (*bouquet*) accompanied by monthly lifetime rent payments (*rente viagère*).

**How fresh is the listing data?**
Data is queried live from Bien'ici's active marketplace. Newly published listings, price adjustments, and sold status removals are reflected in real time.

***

**Can I filter by specific Parisian arrondissements?**
Yes. You can supply specific district names in `searchLocations`, such as `"Paris 11e Arrondissement"`, `"Paris 15"`, `"Paris 18"`, or search across the entire capital with `"Paris"`.

**Can I set up automated webhooks for newly added properties?**
Yes. Configure an Apify Webhook on your actor run to trigger an HTTP POST to your webhook endpoint (Make, Zapier, Slack, or your internal API) whenever the scraper finishes.

**How does the scraper handle non-standard property features?**
Attributes like private gardens, underground cellars, swimming pools, elevators, and air conditioning are compiled into a normalized `features` array of clean strings, making filtering trivial in downstream SQL or Pandas code.

### 🔗 Related European Real Estate Scrapers

Expand your cross-border European property intelligence with these scrapers:

- [Marktstammdatenregister Scraper](https://apify.com/haketa/marktstammdatenregister-scraper) — German energy assets, solar parks & commercial operators
- [Hitta.se Business Directory Scraper](https://apify.com/haketa/hitta-se-business-scraper) — Swedish corporate firmographics, B2B leads & financials
- [Arbeitsagentur Jobs Scraper](https://apify.com/haketa/arbeitsagentur-scraper) — German employment listings, salary benchmarks & contacts

***

### 📋 Changelog

#### Version 1.2 (2026-11)

- **Deep 1,000+ Pagination Unlocked:** Fully uncapped listing pagination with automatic multi-city expansion for large-scale French property intelligence.
- **Fast Prefill Optimization:** Streamlined default parameters to deliver a rich 100-listing Paris sample in <15 seconds.
- **Enhanced €/m² and DPE Normalization:** Improved calculated price per square meter formulas and robust parsing of French climate energy diagnostic ratings.
- **Multi-Zone Query Resolution:** Optimized municipal and departmental zone resolution for composite search locations.

#### Version 1.1 (2026-08)

- Added support for life annuity sales (*viager*) and commercial business premises.
- Integrated `priceHasDecreased` price reduction tracking.
- Added comprehensive condominium fees and co-ownership attributes.

#### Version 1.0 (2026-05)

- Initial release covering French residential sales and rentals with full DPE ratings and photo galleries.

# Changelog

This Actor's version history is a separate document: https://apify.com/haketa/bienici-scraper/changelog.md

# Actor input Schema

## `searchLocations` (type: `array`):

Cities, districts, departments or regions to search, e.g. "Paris", "Lyon 6", "Bordeaux", "Hauts-de-Seine". Each is resolved automatically. Leave empty to search all of France.

## `filterType` (type: `string`):

Search properties for sale or for rent.

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

Filter by property type. Defaults to flats & houses; select others explicitly if you also want parking, land, offices, etc.

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

Minimum price. For rentals this is the monthly rent.

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

Maximum price. For rentals this is the monthly rent.

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

Minimum living area in square meters.

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

Maximum living area in square meters.

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

Minimum number of rooms.

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

Order of the results.

## `onlyPriceDrops` (type: `boolean`):

Keep only listings whose price has recently dropped — useful for spotting deals and motivated sellers.

## `startUrls` (type: `array`):

Optionally paste Bien'ici search page URLs. Any location encoded in the URL is merged with the filters above.

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

Maximum number of listings to collect across all searches. Set 0 for unlimited.

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

Proxy settings. Optional for small runs; recommended for large ones.

## Actor input object example

```json
{
  "searchLocations": [
    "Paris"
  ],
  "filterType": "buy",
  "propertyTypes": [
    "flat",
    "house"
  ],
  "sortBy": "relevance",
  "onlyPriceDrops": false,
  "startUrls": [],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `id` (type: `string`):

Unique Bien'ici listing ID

## `url` (type: `string`):

Canonical listing URL on Bien'ici

## `adType` (type: `string`):

Transaction type (buy or rent)

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

Property category (flat, house, loft, etc.)

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

Property listing headline

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

Sale price or monthly rent in EUR

## `pricePerSquareMeter` (type: `string`):

Price per square meter in EUR

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

Living area in square meters

## `roomsQuantity` (type: `string`):

Total number of rooms

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

Official DPE energy rating (A-G)

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

Municipality or arrondissement

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

French postal code

# 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 = {
    "searchLocations": [
        "Paris"
    ],
    "propertyTypes": [
        "flat",
        "house"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/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 = {
    "searchLocations": ["Paris"],
    "propertyTypes": [
        "flat",
        "house",
    ],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/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 '{
  "searchLocations": [
    "Paris"
  ],
  "propertyTypes": [
    "flat",
    "house"
  ],
  "maxItems": 100
}' |
apify call haketa/bienici-scraper --silent --output-dataset

```

## MCP server setup

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