# SeLoger Scraper — France Sale & Rent Listings (`crawloop/seloger-scraper`) Actor

SeLoger scraper for French apartments and houses for sale and rent. Get price, m2, rooms, DPE, photos, and agency phones. Paste a search or listing URL. API alternative for Python, Node.js, and MCP.

- **URL**: https://apify.com/crawloop/seloger-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (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.85 / 1,000 listings

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 Scraper — France Sale & Rent Listings

> **Disclaimer:** This is an unofficial integration developed independently. It is not affiliated with, sponsored by, or endorsed by Digital Classifieds France SAS, SeLoger, or AVIV Group.
>
> **SeLoger** and related names are trademarks of their respective owners. Data is read from publicly accessible SeLoger France listings. No SeLoger account login is required.
>
> This Actor is provided **for informational, research, lead-generation, and market monitoring purposes**. You are solely responsible for complying with applicable laws (including GDPR), SeLoger's terms of use, and your organization's policies when processing listing and agent data.

**SeLoger scraper** (seloger.com) for **France real estate**: apartments and houses for **sale (achat)** and **rent (location)** with price, €/m², rooms, DPE energy class, photos, **particulier vs agency**, and public **agency phones**. Use it as a **SeLoger API alternative** from **Python**, **Node.js**, **cURL**, or **Apify MCP** / AI assistants — paste any search or listing URL.

**Best for:** France sale and rent comps, PropTech pipelines, FSBO / particulier leads, DPE screening, and dataset export (JSON / CSV) via Apify.

| Actor | Role |
| :--- | :--- |
| SeLoger Scraper ◄── you are here | France listings (sale & rent, DPE, agency phones) |
| [Leboncoin Scraper](https://apify.com/crawloop/leboncoin-scraper) | French classifieds + DPE |
| [Idealista Scraper](https://apify.com/crawloop/idealista-scraper) | Spain Idealista listings + agency leads |
| [ImmobilienScout24 Scraper](https://apify.com/crawloop/immobilienscout24-scraper) | Germany IS24 rent & buy |
| [Rightmove Scraper](https://apify.com/crawloop/rightmove-scraper) | UK sale & rent |

### When to use this Actor

- **SeLoger scraper for search pages** — Copy a filtered browser URL (`/classified-search`, `/recherche/…`, `/immobilier/achat/…`) into Start URLs.
- **Achat / location datasets** — Paris, Lyon, Marseille, Bordeaux, or any city; export JSON/CSV for comps and pipelines.
- **Private-seller (particuliers) lead lists** — Enable **Private sellers only** to keep `isPrivate: true` rows and skip agency inventory.
- **Agency phones on the card** — Public `agencyPhones` when SeLoger already shows them (no contact-unlock).
- **DPE / energy class** — Letter A–G on search cards; full certificate details when listing pages are fetched.
- **Single listing URLs** — Classic `/annonces/…/{id}.htm` and newer `/annonce/…` paths, plus sister-portal ads that SeLoger links to.
- **Scheduled monitoring** — Re-run the same search and emit only **new** or **price-changed** listings.
- **Coverage past the result-page cap** — Large cities are split by price bands automatically when one query would overflow pagination.

### When not to use this Actor

- **Leboncoin / PAP / Bien'ici** — This Actor targets **seloger.com (France)** only. Use [Leboncoin Scraper](https://apify.com/crawloop/leboncoin-scraper) for general French classifieds.
- **Agency directory crawl (`/professionnels-immobilier/`)** — Paste search or listing URLs. Full agency-portfolio crawling is not in this version.
- **Hidden contact reveal** — Public phones already on the card are included. The Actor does not solve SeLoger contact-unlock walls.
- **Legacy `/list.htm` search URLs** — That shape is no longer served. Use `/classified-search` (copy the address bar after filtering on the site).
- **Authenticated actions** — No login, messaging, or saved-search inbox.

### Key features

- **Embedded search JSON** — Reads SeLoger's UFRN `classified-serp-init-data` payload. No headless browser for search; 128–512 MB RAM.
- **Search + listing URLs** — One Actor handles result lists and single ads (`/annonces/…/{id}.htm` or `/annonce/…`, including sister portals that SeLoger links to).
- **Search builder** — Type a city (Paris, Lyon, Marseille), buy vs rent, apartment / house / land, plus price / rooms / m² filters when you do not have a URL.
- **Private vs agency** — `isPrivate` / `advertiserType` on every row; optional private-only filter.
- **Monitor mode** — Key-value store remembers listing IDs and prices across runs.
- **Residential FR proxy** — Recommended on Apify Cloud so datacenter IPs are not blocked by DataDome.

### Input

| Field | What it does |
| :--- | :--- |
| **Start URLs** | Search (`/classified-search`, `/recherche/…`, `/immobilier/achat/…`) or listing (`/annonces/…/{id}.htm`, `/annonce/…`) links. Filters in the URL are kept. |
| **City** | Builder only. `Paris`, `Lyon`, `Marseille`, or a place id `AD08FR31096`. |
| **Buy / rent** / **Property type** | Builder only. Apartment, house, land, office, garage, shop. |
| **Min/max price, rooms, m²** | Builder filters in euros / pièces / surface. |
| **Max listings** | Cap on dataset rows. |
| **Scrape full listing pages** | Default off. Search cards already include price, m², DPE letter, and phones. Turn on for GPS, full description, and extra photos. |
| **Private sellers only** | Drop agency listings. |
| **Monitor mode** | Save new and price-changed rows only. |
| **Proxy** | Apify Residential, country FR. |

```json
{
  "startUrls": [
    { "url": "https://www.seloger.com/classified-search?distributionTypes=Buy&estateTypes=Apartment&locations=AD08FR31096&order=DateDesc" }
  ],
  "maxItems": 50,
  "includeDetails": false,
  "onlyPrivate": false,
  "monitorMode": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "FR"
  }
}
```

Rent example (builder, no URL):

```json
{
  "location": "Lyon",
  "transactionType": "rent",
  "propertyType": "apartment",
  "maxPrice": 1500,
  "minRooms": 2,
  "maxItems": 100
}
```

### Output

One dataset row per listing. Search-card fields (including DPE letter and phones) are present even when details are off.

| Field | Description |
| :--- | :--- |
| `id` / `legacyId` | AVIV classified id + numeric `/annonces/` id |
| `url` | Listing URL |
| `title` / `headline` | Headline |
| `transactionType` | `buy`, `rent`, or `auction` |
| `propertyType` | apartment, house, … |
| `price` / `priceLabel` | Numeric euros + formatted string |
| `pricePerSqm` | €/m² when surface is known |
| `surface` / `rooms` / `bedrooms` | m², pièces, chambres |
| `energyClass` | DPE letter A–G |
| `isPrivate` / `advertiserType` | Private owner vs agency |
| `agencyName` / `agencyUrl` / `agencyPhones` | Public advertiser fields |
| `city` / `zipCode` / `district` / `region` | Location |
| `latitude` / `longitude` | GPS when listing pages are fetched |
| `photos` | Image URLs |
| `description` | Listing text |
| `transportLines` | Nearby metro / bus lines |
| `scrapedAt` | ISO timestamp |

```json
{
  "id": "26T9RUL4DLKP",
  "legacyId": "276406061",
  "url": "https://www.seloger.com/annonces/achat/appartement/saint-denis-93/276406061.htm",
  "title": "Appartement à vendre",
  "transactionType": "buy",
  "propertyType": "apartment",
  "price": 285500,
  "pricePerSqm": 4327,
  "surface": 65.98,
  "rooms": 3,
  "bedrooms": 2,
  "energyClass": "F",
  "isPrivate": false,
  "advertiserType": "agency",
  "agencyName": "CENTURY 21 RIVA Immobilier",
  "agencyPhones": ["0186944374"],
  "city": "Saint-Denis",
  "zipCode": "93200",
  "latitude": 48.93886,
  "longitude": 2.3618,
  "photos": ["https://mms.seloger.com/d/0/2/a/d02a1d17-bfcf-4cfe-baca-abe1fbc134bb.jpg"],
  "scrapedAt": "2026-08-20T14:00:00+00:00"
}
```

### Use cases

- **Agents** — Watch competing inventory by arrondissement; filter to particuliers for new mandates.
- **Investors / PropTech** — City-level sale and €/m² snapshots, GPS for maps, DPE mix.
- **Relocation / HR** — Monthly rent + surface + rooms for employee housing shortlists in Paris or Lyon.
- **Market research** — Schedule daily runs in monitor mode and store only new ads and price cuts.

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/seloger-scraper').call({
  startUrls: [{ url: 'https://www.seloger.com/classified-search?distributionTypes=Buy&estateTypes=Apartment&locations=AD08FR31096' }],
  maxItems: 50,
  includeDetails: false,
  proxyConfiguration: {
    useApifyProxy: true,
    apifyProxyGroups: ['RESIDENTIAL'],
    apifyProxyCountry: 'FR',
  },
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]?.id, items[0]?.price, items[0]?.surface);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("crawloop/seloger-scraper").call(
    run_input={
        "startUrls": [
            {"url": "https://www.seloger.com/classified-search?distributionTypes=Rent&estateTypes=Apartment&locations=AD08FR28808"}
        ],
        "maxItems": 50,
        "includeDetails": False,
        "proxyConfiguration": {
            "useApifyProxy": True,
            "apifyProxyGroups": ["RESIDENTIAL"],
            "apifyProxyCountry": "FR",
        },
    }
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("id"), item.get("price"), item.get("isPrivate"))
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/crawloop~seloger-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{"url": "https://www.seloger.com/immobilier/achat/immo-paris-75/"}],
    "maxItems": 20,
    "includeDetails": false,
    "proxyConfiguration": {
      "useApifyProxy": true,
      "apifyProxyGroups": ["RESIDENTIAL"],
      "apifyProxyCountry": "FR"
    }
  }'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp).
Connect your Apify account, then call this Actor by its Store ID / name (`crawloop/seloger-scraper`).

Example prompts:

- "Run SeLoger Scraper for apartments for sale in Paris, max 30, and return id, price, m², rooms, DPE, agency phones as JSON"
- "Scrape SeLoger Lyon apartments for rent under €1,500 and summarize private vs agency share"
- "Pull SeLoger Paris listings, then compare the field set with Leboncoin Scraper for a France dual-source pipeline"

### Suite next step

After SeLoger portal comps, add private-seller classifieds with [Leboncoin Scraper](https://apify.com/crawloop/leboncoin-scraper) (DPE on FSBO ads), or Spain coverage with [Idealista Scraper](https://apify.com/crawloop/idealista-scraper).

### FAQ

**Is this an official SeLoger API?**\
No. It is an unofficial **SeLoger scraper** / **France real estate API alternative** that reads the public search JSON embedded in SeLoger pages. It is not affiliated with SeLoger or AVIV Group. You can call it from **Python**, **Node.js**, **cURL**, or **MCP**.

**How do I scrape SeLoger with Python or Node.js?**\
Use the Apify client examples above (`crawloop/seloger-scraper`). Pass a search URL or the city builder (`location`, `transactionType`) and read the dataset as JSON.

**Can I scrape achat appartement in Paris (or another city)?**\
Yes. Paste a Paris `/classified-search` or `/immobilier/achat/immo-paris-75/` URL, or use the builder with city `Paris`, buy, and apartment. The same pattern works for Lyon, Marseille, Bordeaux, and other cities.

**Why residential proxies?**\
SeLoger sits behind DataDome. Use RESIDENTIAL + country FR on Cloud.

**Can I paste a browser search URL?**\
Yes. Apply filters on the site, copy the `/classified-search?…` URL, paste into Start URLs. Price, rooms, surface, and `classifiedBusiness=Private` are translated.

**Does it stop at a few hundred results like some scrapers?**\
One query is capped at 50 pages (30 listings each). If the result set is larger, the Actor splits the price range automatically so Paris / Lyon dumps are not truncated.

**Are phone numbers included?**\
Yes, when the card or listing already lists them (`agencyPhones`). Private contact-unlock flows are not automated.

**Do I need full listing pages?**\
Usually no. Search-card rows already have price, m², rooms, DPE letter, photos, and public phones — enough for comps and lead lists. Turn **Scrape full listing pages** on when you need GPS or the long description.

**Can I paste a single listing URL?**\
Yes. Classic `/annonces/…/{id}.htm` and newer `/annonce/…` paths both work. For bulk dumps, a `/classified-search` URL is faster.

### Related Actors

| Actor | What it covers |
| :--- | :--- |
| [Leboncoin Scraper](https://apify.com/crawloop/leboncoin-scraper) | France classifieds + DPE / vehicles |
| [Idealista Scraper](https://apify.com/crawloop/idealista-scraper) | Spain sale/rent listings + agency phones |
| [ImmobilienScout24 Scraper](https://apify.com/crawloop/immobilienscout24-scraper) | Germany IS24 rent & buy |
| [Rightmove Scraper](https://apify.com/crawloop/rightmove-scraper) | UK Rightmove sale & rent |
| [Yad2 Scraper](https://apify.com/crawloop/yad2-scraper) | Israel classifieds |

# Actor input Schema

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

Paste SeLoger search URLs (/classified-search, /recherche/, /immobilier/achat/…) or individual listing URLs (/annonces/…/{id}.htm or /annonce/…). Filters in the search URL (city, price, rooms, private sellers) are applied automatically.

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

Used only when Start URLs are empty. City name (Paris, Lyon, Marseille) or a SeLoger place id such as AD08FR31096.

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

Builder only. Achat (buy) or location (rent).

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

Builder only. Apartment, house, land, office, garage, or shop.

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

Minimum sale price or monthly rent in euros. Builder only, or ignored when the Start URL already has a price filter.

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

Maximum sale price or monthly rent in euros.

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

Minimum room count (pièces), e.g. 2.

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

Maximum room count (pièces), e.g. 4.

## `minSurface` (type: `integer`):

Minimum surface in square metres.

## `maxSurface` (type: `integer`):

Maximum surface in square metres.

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

Maximum number of listings to save per run.

## `includeDetails` (type: `boolean`):

Fetch each listing page for full description, GPS, all photos, energy certificate details, and extra features. Search cards already include price, m², rooms, DPE letter, and public agency phones. Leave off for faster runs; turn on only when you need GPS or the full text.

## `onlyPrivate` (type: `boolean`):

Keep only private-owner listings (isPrivate=true). Useful for FSBO / particulier lead generation.

## `monitorMode` (type: `boolean`):

On scheduled re-runs, save only listings that are new or whose price changed since the last run on this Actor.

## `maxConcurrency` (type: `integer`):

How many listing HTML requests to run in parallel when details are on. Default 8.

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

Apify Proxy. France RESIDENTIAL is recommended for stable access to SeLoger on Apify Cloud (DataDome).

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.seloger.com/classified-search?distributionTypes=Buy&estateTypes=Apartment&locations=AD08FR31096&order=DateDesc"
    }
  ],
  "location": "Paris",
  "transactionType": "buy",
  "propertyType": "apartment",
  "maxItems": 10,
  "includeDetails": false,
  "onlyPrivate": false,
  "monitorMode": false,
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FR"
  }
}
```

# Actor output Schema

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

Default dataset items — one SeLoger listing per row.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.seloger.com/classified-search?distributionTypes=Buy&estateTypes=Apartment&locations=AD08FR31096&order=DateDesc"
        }
    ],
    "location": "Paris",
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "FR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/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 = {
    "startUrls": [{ "url": "https://www.seloger.com/classified-search?distributionTypes=Buy&estateTypes=Apartment&locations=AD08FR31096&order=DateDesc" }],
    "location": "Paris",
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "FR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/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 '{
  "startUrls": [
    {
      "url": "https://www.seloger.com/classified-search?distributionTypes=Buy&estateTypes=Apartment&locations=AD08FR31096&order=DateDesc"
    }
  ],
  "location": "Paris",
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FR"
  }
}' |
apify call crawloop/seloger-scraper --silent --output-dataset

```

## MCP server setup

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