# SeLoger Scraper - France Real Estate Listings (`igolaizola/seloger-scraper`) Actor

Find French listings on seloger.com for sale and rent. Search by city, postcode, or neighborhood; filter by property type, price, size, rooms, amenities, energy, furnishing, and availability, then export JSON, CSV, or Excel-ready data with images, links, locations, pricing, and contact details.

- **URL**: https://apify.com/igolaizola/seloger-scraper.md
- **Developed by:** [Iñigo Garcia Olaizola](https://apify.com/igolaizola) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 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 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

## SeLoger.com Real Estate Scraper

Find French homes and commercial properties for sale or rent with the SeLoger.com Real Estate Scraper. Search a city, postcode, department, or neighborhood, apply practical property filters, and receive useful listing data with pricing, location, images, links, property details, and contact information when published.

### 🏠 What you can do

- Discover apartments, houses, land, parking, offices, shops, and other property categories.
- Monitor asking prices, floor area, rooms, bedrooms, plots, and construction years.
- Find furnished rentals, new builds, investment properties, accessible homes, properties with gardens, parking, pools, balconies, or elevators.
- Build datasets for market research, investment screening, agency prospecting, relocation research, and rental monitoring.

### 🚀 Run the actor

#### Apify Console

1. Open the SeLoger.com Real Estate Scraper in Apify Console.
2. Enter a location or keep the prefilled `Paris` location.
3. Choose `For sale` or `For rent` and add optional filters.
4. Click **Start** and open the Dataset tab when the run finishes.

### 🧭 Input parameters

| Input | Type | Description |
| --- | --- | --- |
| `maxItems` | Integer | Maximum listings to save. `0` means unlimited or the maximum allowed by the run. Default: `100`. |
| `location` | String | City, postcode, department, or search phrase. Default: `Paris`. |
| `locationType` | Enum | Choose whether the location is a `country`, `region`, `department`, `city`, `district`, `neighborhood`, `postalCode`, `street`, or `houseNumber`. |
| `latitude`, `longitude` | Number | Optional center point for a radius search. Use both together; coordinates take precedence over `location`. |
| `distanceKm` | Integer | Radius around the coordinate point in kilometers. Default: `20`. |
| `operation` | `buy` | `rent` | Search for `For sale` or `For rent`. Default: `buy`. |
| `propertyType` | Enum | `apartmentOrHouse`, `apartment`, `house`, `building`, `seniorLiving`, `land`, `parking`, `office`, `shop`, `restaurantOrHotel`, `storageOrProduction`, `agriculture`, or `other`. |
| `propertySubtypes` | Array of strings | Choose from `loft`, `multiStorey`, `penthouse`, `studio`, `terrace`, `bungalow`, `castle`, `chalet`, `farmhouse`, `finca`, `manorHouse`, `mansion`, `multiFamilyHouse`, `rustico`, `semiDetachedHouse`, `singleFamilyHouse`, `terraceHouse`, `townHouse`, or `villa`. |
| `minSize`, `maxSize` | Integer | Living area limits in square metres. |
| `minRooms`, `maxRooms` | Integer | Room count limits. |
| `minBedrooms`, `maxBedrooms` | Integer | Bedroom count limits. |
| `minPrice`, `maxPrice` | Integer | Asking-price limits in euros. |
| `minFloor`, `maxFloor` | Integer | Floor limits. |
| `minPlotSize`, `maxPlotSize` | Integer | Plot-size limits in square metres. |
| `minYearBuilt`, `maxYearBuilt` | Integer | Construction-year limits. |
| `features` | Array of strings | Choose from `balcony`, `elevator`, `bathtub`, `windowInBathroom`, `fittedKitchen`, `cellar`, `parking`, `petsAllowed`, `pool`, `accessible`, `renovationNeeded`, `garden`, or `vacant`. |
| `energyRatings` | Array of strings | Choose one or more ratings: `a`, `b`, `c`, `d`, `e`, `f`, or `g`. |
| `furnished` | `furnished` | `unfurnished` | Furnishing requirement. |
| `projectTypes` | Array of strings | Choose from `newBuild`, `investment`, `resale`, `shortTermRental`, `shared`, `foreclosure`, `lifeAnnuity`, `stock`, or `swap`. |
| `energyHeating` | Array of strings | Choose from `collective`, `heatPump`, or `solarElectricity`. |
| `keywords` | String | Words to match in listing search text. |
| `matchAnyKeyword` | Boolean | Match at least one keyword instead of all keywords. Default: `false`. |
| `availableFrom` | Date string | Latest rental availability date in `YYYY-MM-DD` format. |
| `warmRent` | `basic` | `total` | Match base rent or total monthly rent. |

### 🧪 Example inputs

#### Apartments for sale in Paris

```json
{
  "location": "Paris",
  "operation": "buy",
  "propertyType": "apartment",
  "minSize": 45,
  "maxPrice": 650000,
  "minRooms": 2,
  "features": ["balcony", "elevator"],
  "energyRatings": ["a", "b", "c"],
  "maxItems": 100
}
```

#### Furnished rentals in Lyon

```json
{
  "location": "Lyon",
  "operation": "rent",
  "propertyType": "apartment",
  "minBedrooms": 1,
  "maxPrice": 1800,
  "furnished": "furnished",
  "features": ["petsAllowed", "accessible"],
  "availableFrom": "2026-09-01",
  "warmRent": "total",
  "maxItems": 50
}
```

#### Properties within a radius of Paris

```json
{
  "latitude": 48.8566,
  "longitude": 2.3522,
  "distanceKm": 10,
  "operation": "buy",
  "propertyType": "apartment",
  "maxItems": 100
}
```

### 📦 Output

Each result contains the information available for a SeLoger property listing. The `Overview` view highlights useful fields such as:

- Listing identity, title, description, operation, and listing URL.
- Numeric price when available and the displayed price label.
- Area, rooms, bedrooms, property type, energy rating, and features.
- City, postal code, address, images, agency, contact, and phone information.

Fields may be omitted when SeLoger does not publish them for a listing.

### 💡 Tips and common recipes

- Start with `maxItems` between 25 and 100 while tuning filters.
- Use a postcode when you need a compact area around a large city.
- Use `latitude`, `longitude`, and `distanceKm` when you want a radius around a specific point instead of a named location.
- Use `locationType` when a name can refer to more than one kind of place, such as a city or region.
- Combine `minPrice` and `maxPrice` with `minSize` for investment screening.
- Use `furnished`, `availableFrom`, and `warmRent: "total"` for rental comparisons.
- Use `energyRatings` and `features` to prioritize efficient or accessible properties.

### ⚖️ Legal and ethical considerations

Use the data only for lawful purposes and respect applicable privacy, consumer protection, copyright, and data-protection rules. Do not use listing or contact information for unsolicited spam. Respect the source platform’s terms, robots directives, access limits, and intellectual-property rights. You are responsible for checking that your use case and retention period are allowed in your jurisdiction.

### ❓ FAQ

#### Which locations can I search?

You can enter a French city, postcode, department, or descriptive search phrase. For ambiguous names, use `locationType` to choose a country, region, department, city, district, neighborhood, postal code, street, or house number. If no matching type is selected, the most relevant suggestion is used. Alternatively, provide latitude, longitude, and distanceKm for a radius search.

#### Can I search both sales and rentals?

Yes. Set `operation` to `buy` for sales or `rent` for rentals.

#### What happens when a listing has missing fields?

The actor preserves the available listing data and omits fields that were not published for that listing.

#### Can I export the results?

Yes. Download JSON, CSV, Excel, or other supported formats from the Apify Dataset tab.

#### How can I get help?

Contact the developer at [igolaizola.com/#contact](https://igolaizola.com/#contact).

# Actor input Schema

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

Maximum listings to save; 0 means unlimited (or the maximum allowed by the run).

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

French city, postcode, department, or search phrase. Optional when latitude and longitude are provided.

## `locationType` (type: `string`):

Optional filter applied to suggestions returned by SeLoger's location search. Choose country, region, department, city, district, neighborhood, postal code, street, or house number.

## `latitude` (type: `number`):

Latitude of the center point for a radius search. Use together with longitude; coordinates take precedence over Location.

## `longitude` (type: `number`):

Longitude of the center point for a radius search. Use together with latitude; coordinates take precedence over Location.

## `distanceKm` (type: `integer`):

Radius around the latitude and longitude point, in kilometers. Used only for coordinate searches.

## `operation` (type: `string`):

Whether to find properties for sale or rent.

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

Main property category.

## `propertySubtypes` (type: `array`):

Optional subtype labels: loft, multiStorey, penthouse, studio, terrace, bungalow, castle, chalet, farmhouse, finca, manorHouse, mansion, multiFamilyHouse, rustico, semiDetachedHouse, singleFamilyHouse, terraceHouse, townHouse, or villa.

## `minSize` (type: `integer`):

Minimum living area in square metres.

## `maxSize` (type: `integer`):

Maximum living area in square metres.

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

Minimum number of rooms.

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

Maximum number of rooms.

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

Minimum number of bedrooms.

## `maxBedrooms` (type: `integer`):

Maximum number of bedrooms.

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

Minimum advertised price in euros.

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

Maximum advertised price in euros.

## `minFloor` (type: `integer`):

Minimum floor number.

## `maxFloor` (type: `integer`):

Maximum floor number.

## `minPlotSize` (type: `integer`):

Minimum land or plot size in square metres.

## `maxPlotSize` (type: `integer`):

Maximum land or plot size in square metres.

## `minYearBuilt` (type: `integer`):

Earliest construction year.

## `maxYearBuilt` (type: `integer`):

Latest construction year.

## `features` (type: `array`):

Property features to include: balcony, elevator, bathtub, windowInBathroom, fittedKitchen, cellar, parking, petsAllowed, pool, accessible, renovationNeeded, garden, or vacant.

## `energyRatings` (type: `array`):

Energy performance ratings to include: a, b, c, d, e, f, or g.

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

Furnishing requirement.

## `projectTypes` (type: `array`):

Optional property project categories: newBuild, investment, resale, shortTermRental, shared, foreclosure, lifeAnnuity, stock, or swap.

## `energyHeating` (type: `array`):

Heating energy sources: collective, heatPump, or solarElectricity.

## `keywords` (type: `string`):

Words that should appear in the listing search.

## `matchAnyKeyword` (type: `boolean`):

Return listings matching at least one keyword instead of all keywords.

## `availableFrom` (type: `string`):

Latest date by which a rental should be available, in YYYY-MM-DD format.

## `warmRent` (type: `string`):

Whether rent matching should use base or total monthly rent.

## Actor input object example

```json
{
  "maxItems": 100,
  "location": "Paris",
  "distanceKm": 20,
  "operation": "buy",
  "matchAnyKeyword": false
}
```

# 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 = {
    "location": "Paris"
};

// Run the Actor and wait for it to finish
const run = await client.actor("igolaizola/seloger-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" }

# Run the Actor and wait for it to finish
run = client.actor("igolaizola/seloger-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"
}' |
apify call igolaizola/seloger-scraper --silent --output-dataset

```

## MCP server setup

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