Bien'ici Property Scraper avatar

Bien'ici Property Scraper

Pricing

from $2.98 / 1,000 results

Go to Apify Store
Bien'ici Property Scraper

Bien'ici Property Scraper

Collect Bien'ici listings for rent or purchase and get fields such as price, surface area, rooms, city, postal code, description, energy and greenhouse-gas classes, photos and coordinates. Choose property types and filters, with an option to fetch additional details for each listing.

Pricing

from $2.98 / 1,000 results

Rating

0.0

(0)

Developer

Axiom Works

Axiom Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Share

Returns: one row per property listing with id, sourceUrl, price, surfaceArea, bedroomsQuantity, city, and energyClassification. Input: {"places": ["Lyon"], "transactionType": "rent", "propertyTypes": ["flat"], "maxItems": 30} Best for: real-estate market research, rental and price monitoring, lead and comparable lists for France.

{
"id": "ag335407-494683130",
"sourceUrl": "https://www.bienici.com/annonce/ag335407-494683130",
"transactionType": "buy",
"propertyType": "flat",
"price": 49000,
"surfaceArea": 7,
"city": "Bordeaux",
"energyClassification": "NS"
}

What does Bienici Property Listings Scraper do?

Bienici Property Listings Scraper is a Bien'ici scraper and Bien'ici API alternative. Supply French place names or search URLs, choose buy or rent, and collect prices, surface, rooms, location, descriptions, energy classes and photos. It reads public JSON without login or a browser. Details are off by default.

Use listingIds or listingUrls to refresh specific properties. Direct targets run first, share maxItems with searches, and fetch details once per unique ID. Unavailable targets are skipped without placeholder rows. Direct URLs support /annonce/

  • Build lists of flats and houses for sale or rent in any French city.
  • Track asking prices and price per square metre over time for a neighbourhood.
  • Compare energy performance classes across a market.
  • Feed listings, photos and coordinates into a database, spreadsheet or map.

Large searches are split into price bands to work around the source offset limit. Records are merged without duplicate IDs.

This Actor is independent and is not affiliated with or endorsed by Bien'ici.

What data can you get?

Each record is one listing. Fields that a listing does not provide are returned as null.

FieldTypeDescription
idstringBien'ici listing identifier, unique per record.
sourceUrlstringListing page on Bien'ici.
titlestringListing title (seller-provided, or generated when details are included); often empty.
transactionTypestringbuy or rent.
propertyTypestringflat, house, parking, shop, etc.
pricenumberPrice in euros (monthly rent for rentals).
pricePerSquareMeternumberPrice divided by surface area.
surfaceAreanumberSurface in square metres.
roomsQuantitynumberNumber of rooms.
bedroomsQuantitynumberNumber of bedrooms.
citystringCity or arrondissement name.
postalCodestringFrench postal code.
districtstringNeighbourhood name.
descriptionstringFull listing description in French.
energyClassificationstringDPE energy class A-G.
greenhouseGazClassificationstringGES class A-G.
accountTypestringAdvertiser type: agency, network, owner...
agencyNamestringAdvertiser name: from details for direct targets or when includeDetails is true, otherwise the display name in the search result when the advertiser gives one.
photosarrayPhoto URLs on file.bienici.com.
publishedAtstringPublication date (ISO); falls back to the last modification date when the listing has no real publication date, null if neither is known.
modifiedAtstringLast modification date (ISO).
priceWithoutFeesnumberAsking price excluding agency fees, copied from the listing when provided.
agencyFeePercentagenumberAdvertised agency fee percentage; null when not provided.
feesChargedTostringSource code identifying who pays agency fees, such as purchaser or seller.
isInCondominiumbooleanWhether the listing is explicitly marked as part of a condominium.
annualCondominiumFeesnumberAdvertised annual condominium fees in euros, when provided.
condominiumPartsQuantitynumberAdvertised number of condominium parts or lots; not the room count.
isCondominiumInProcedurebooleanWhether the listing explicitly reports a condominium procedure.
landSurfaceAreanumberAdvertised plot or land area in square metres; separate from living area.
hasGardenbooleanWhether the listing explicitly reports a garden.
hasPoolbooleanWhether the listing explicitly reports a pool.
hasTerracebooleanWhether the listing explicitly reports a terrace.
energyPerformanceDiagnosticDatestringDPE diagnostic date as supplied by Bien’ici; null when not provided.
useJuly2021EnergyPerformanceDiagnosticbooleanSource flag indicating use of the July 2021 DPE method; no legal assessment is inferred.
latitudenumberBlurred latitude of the listing.
longitudenumberBlurred longitude of the listing.
yearOfConstructionnumberAdvertiser-reported construction year, nullable.
floorQuantitynumberSource-reported number of floors, nullable.
terracesQuantitynumberSource-reported terrace count, nullable.
greenhouseGazValuenumberSource-reported numeric greenhouse emissions, nullable.
referencestringAdvertiser reference.
floornumberFloor number.
hasElevatorbooleanWhether the building has an elevator.
isFurnishedbooleanWhether the property is furnished.
newPropertybooleanWhether it is a new build.
monthlyChargesnumberMonthly charges in euros (rentals).
agencyRentalFeenumberRental agency fee in euros, when the listing supplies it.
inventoryOfFixturesFeesnumberInventory of fixtures fee in euros, when supplied.
safetyDepositnumberRental security deposit in euros, when supplied.
bathroomsQuantitynumberNumber of bathrooms.
parkingPlacesQuantitynumberNumber of parking places.
balconyQuantitynumberNumber of balconies.
priceHasDecreasedbooleanWhether Bien'ici marks a price decrease.
energyValuenumberEnergy consumption value reported with the DPE class.

The dataset also includes the nullable fields availableDate, rentWithoutCharges, showerRoomsQuantity, toiletQuantity, heating, exposition, hasBalcony, hasCellar, isStudio and flatSharing, copied from the same response. They are null when the advertiser did not state them.

The sale-price fields priceWithoutFees, agencyFeePercentage and feesChargedTo help compare advertised amounts and fee responsibility. Condominium records can include isInCondominium, annualCondominiumFees, condominiumPartsQuantity and isCondominiumInProcedure. Annual fees are distinct from rental monthlyCharges; missing values remain null, including missing boolean flags. The source may contain unusual figures, so verify an advertisement before relying on its financial details.

Outdoor fields landSurfaceArea, hasGarden, hasPool and hasTerrace distinguish plot area from living area and describe explicitly supplied amenities. energyPerformanceDiagnosticDate preserves the source date, while useJuly2021EnergyPerformanceDiagnostic preserves its diagnostic-method flag. These fields are copied from public listing JSON without extra detail requests and can be absent for individual properties. They describe the advertisement rather than certifying building condition, legal compliance or the availability of an amenity.

How to use

  1. Open the Actor and type one or more places into Places, such as Lyon. Place names are resolved to Bien'ici zones automatically, including arrondissements like Lyon 3e.
  2. Choose Transaction type: buy or rent.
  3. Choose Property types, for example flat and house.
  4. Optionally set price, surface, room or bedroom bounds. For rental research, Furnished only limits results to listings marked furnished.
  5. Set Max items to the number of listings you want. The Actor stops at that shared total across all places and URLs, or sooner if fewer listings match or your spending limit is reached.
  6. Press Start and download the dataset as JSON, CSV, Excel or via the API.

You can also paste Bien'ici search URLs into Start URLs. The place, transaction type, property type and price or surface bounds are read from the URL. If a place name cannot be found, it is skipped. If no target returns listings, the run succeeds with zero records and a status message suggesting another place, a search URL, or less restrictive filters. A malformed URL or missing target fails input validation. A failed target does not prevent other targets from running.

For search targets, turn on Include details to make one extra request per listing and add the advertiser name (agencyName) and a generated title when the seller left the title empty. This is slower, so leave it off when you only need the search data.

Input

FieldTypeDescription
placesarray of stringsPlaces to search, e.g. "Lyon". Required by the schema; use [] for a URL-only search.
startUrlsarrayOptional bienici.com search URLs.
transactionTypestringbuy or rent. Default buy.
propertyTypesarrayflat, house, parking, shop, loft, castle, building, office, terrain. Default flat and house.
maxItemsintegerShared maximum across all places, URLs and pages. Default 50.
minPrice, maxPriceintegerPrice bounds in euros (monthly rent when renting).
minArea, maxAreaintegerSurface bounds in square metres.
minRooms, maxRoomsintegerRoom count bounds.
minBedrooms, maxBedroomsintegerBedroom count bounds. Leave empty for no bound.
furnishedOnlybooleanReturn only listings marked furnished. Default false.
includeDetailsbooleanAdd agencyName and a generated title with one extra request per listing. Default false.
proxyConfigurationobjectApify Proxy settings. Default is no proxy, with automatic fallback when requests are blocked.
listingIdsarray of stringsDirect IDs; default empty. Use places: [] for IDs only.
listingUrlsarray of URLsDirect public listing links, as strings or URL objects; default empty.

Direct target example:

{"places": [], "listingIds": ["immo-facile-61288997"], "maxItems": 1}

Example input:

{
"places": ["Bordeaux"],
"transactionType": "buy",
"propertyTypes": ["house", "flat"],
"minBedrooms": 2,
"maxPrice": 600000,
"maxItems": 50
}

Output

The dataset has one item per listing. Fields from a public Bordeaux search response fetched locally on 15 October 2026:

{
"id": "ag335407-494683130",
"sourceUrl": "https://www.bienici.com/annonce/ag335407-494683130",
"transactionType": "buy",
"propertyType": "flat",
"price": 49000,
"surfaceArea": 7,
"city": "Bordeaux",
"energyClassification": "NS",
"priceWithoutFees": 49000,
"agencyFeePercentage": null,
"feesChargedTo": "seller",
"isInCondominium": true,
"annualCondominiumFees": 120,
"condominiumPartsQuantity": null,
"isCondominiumInProcedure": false,
"landSurfaceArea": null,
"hasGarden": null,
"hasPool": false,
"hasTerrace": false,
"energyPerformanceDiagnosticDate": "2025-12-05",
"useJuly2021EnergyPerformanceDiagnostic": true
}

Notes on the data:

  • Prices are in euros. For rentals the price is the monthly rent. Bedroom and furnishing filters apply to searches; missing source attributes can exclude a listing.
  • The latitude and longitude are the blurred position published by the site, not the exact address.
  • Some imported listings carry no real publication date; publishedAt then uses the last modification date, or is null if that is missing too. Advertiser names can come from search display names or details. Phone numbers are not collected.

How much does it cost?

You are charged per result, which means per listing saved to the dataset. Runs that return nothing do not charge for results. See the Pricing tab of the Actor for the current rate, and set Max items to cap what a run can cost. A spending-limit stop is shown in the final run status; increase that limit only when you want more records.

Use with AI agents (MCP)

For a URL-only tool call, send places: [] and a startUrls array containing strings or URL objects. When both targets are supplied, both are searched under the same maxItems total. Keep includeDetails: false for a quick initial sample. A zero-record success is not evidence that a city has no property listings: inspect the run status and logs, check spelling, relax filters, or retry blocked requests with Apify Proxy.

You can call this Actor from any MCP-capable assistant through the Apify MCP server. Add this server configuration:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=axiomworks/bienici-property-listings-scraper"
}
}
}

Example prompts:

  • "Find 30 flats to rent in Lyon with their price, surface and energy class."
  • "List houses for sale in Bordeaux under 600000 euros with surface and rooms."
  • "Compare the average price per square metre of listings in Paris 11e and Paris 15e."

Integrations and API

Call the Actor with the Apify client.

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("axiomworks/bienici-property-listings-scraper").call(run_input={
"places": ["Lyon"],
"transactionType": "rent",
"propertyTypes": ["flat"],
"maxItems": 50,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["city"], item["price"], item["surfaceArea"])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('axiomworks/bienici-property-listings-scraper').call({
places: ['Lyon'],
transactionType: 'rent',
propertyTypes: ['flat'],
maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((i) => process.stdout.write(`${i.city} ${i.price}\n`));

cURL

curl -X POST "https://api.apify.com/v2/acts/axiomworks~bienici-property-listings-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"places": ["Lyon"], "transactionType": "rent", "propertyTypes": ["flat"], "maxItems": 50}'

Use the Integrations tab for spreadsheets, webhooks and scheduled runs.

FAQ

How many listings can I get? As many as match your search. Searches that match more listings than a single query can return are split by price automatically. Set maxItems to the number you need.

Why is the title empty on some listings? Many advertisers leave the title blank. Enable Include details to get a generated title in those cases, otherwise the field is null.

Does it return the agency name or phone number? The agency name is available for direct listing targets or with Include details. Phone numbers are not collected.

Why does publishedAt sometimes equal modifiedAt? Listings imported from agency software often have no real publication date, so the last modification date is used instead of a placeholder. If neither date exists the value is null.

Can I search a whole department or region? Use place names that Bien'ici resolves to a zone, such as a city, arrondissement or department name, or paste a Bien'ici search URL.

What happens with a place that does not exist? The Actor logs a warning, and if nothing usable remains the run succeeds with zero records and guidance to change the place or filters. Blocked targets are logged and skipped after retries; try enabling proxyConfiguration or a different place. Other targets continue.

Does it need a proxy? Usually not. With the default configuration, requests go directly first and retry through Apify datacenter Proxy when blocked or rate limited. If you supply proxy settings, retries keep those settings and use fresh sessions. Persistent blocks yield no placeholder records and the run succeeds with guidance.

The Actor collects only data that is publicly visible on Bien'ici without logging in, at a modest request rate of about two requests per second. It does not bypass logins or CAPTCHAs. Listing text and photos can be protected by copyright and database rights, and listings can contain personal data, so use the output in line with the website's terms, French and EU law including GDPR, and your own legal advice. You are responsible for how you use the data.

Feedback

Found a bug or missing field? Open an issue from the Actor page and include the input you used.