SeLoger France Real Estate Scraper
Pricing
from $1.58 / 1,000 result row emitteds
SeLoger France Real Estate Scraper
SeLoger France Real Estate Scraper: scrape normalized sale and rental listings from SeLoger, France's leading property portal. We rotate browser fingerprints, retry through blocks, and keep the dataset clean — validated price, area, rooms, and agency data in every row.
Pricing
from $1.58 / 1,000 result row emitteds
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
17 hours ago
Last modified
Categories
Features
Share
🎯 What this scrapes
SeLoger is France's dominant property portal. The current Apify Store field for it is either near-zero-scale or the one incumbent with real run volume (34,729 runs / 386 users) that carries just 2 reviews — thin trust despite proven demand. This Actor wraps a single portal in a clean, validated schema (price, area, rooms, energy rating, coordinates, agency contact) with per-listing and per-page fault isolation, so one bad row or one blocked page never sinks the whole run.
🔥 What we handle for you
- 🌐 Residential proxy rotation via Apify Proxy — fresh session and exit IP on every block.
- 🔁 Retries with exponential backoff on
408 / 429 / 5xx— up to 5 attempts per page,Retry-Afterhonoured. - 🧱 Rate-limit-aware pacing — when the target pushes back, we slow down instead of getting banned.
- 🧊 Consistently structured dataset rows — validated fields, ISO-8601 timestamps, stable IDs, JSON / CSV / Excel export straight from the Apify Console.
- 💰 Pay-Per-Event pricing — a small start fee per run, then you pay only for results that hit your dataset. A run that finds nothing pays only the start fee.
💡 Use cases
- Investor deal screening — pull price/m², rooms, and location data for a whole neighborhood or postal code in one run.
- PropTech aggregation — feed a normalized, validated SeLoger dataset into a downstream listings pipeline.
- Relocation and expat services — build a client-facing French property feed without hand-scraping seloger.com listing by listing.
- Agency/lister lead lists — collect agency and agent names behind active listings for outreach.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
searchUrls | array | no | '—' | Direct seloger.com search-results or listing detail URLs to scrape as-is. Up to 50. One of Search URLs or Location is… |
location | string | no | 'paris-75000' | Location slug — currently only 'paris-75000' is supported for direct location search. For any other city, paste a… |
transactionType | string | no | 'sale' | Sale vs. rent — maps to SeLoger's 'achat'/'location' URL segments. |
propertyType | string | no | 'apartment' | Property taxonomy. 'apartment'/'house'/'land'/'parking' work for location search; 'commercial' currently requires… |
maxResults | integer | no | 100 | Cap on rows returned; may be limited to the first confirmed page per search until pagination is validated. |
enrichDetails | boolean | no | True | Fetch each listing's detail page for description, coordinates, agency, energy rating, and the full photo gallery. |
proxyConfiguration | object | no | {'useApifyProxy': True} | Apify Proxy configuration. Defaults to RESIDENTIAL — this target is protected against automated traffic. |
Example input
{"location": "paris-75000","transactionType": "sale","propertyType": "apartment","maxResults": 5,"enrichDetails": true,"proxyConfiguration": {"useApifyProxy": true}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
listing_id | string | Numeric id from '.htm' URLs, or short token from '/annonce/' URLs. |
url | string | Canonical detail URL. |
transaction_type | string | 'sale' or 'rent', as requested. |
property_type | string | Shared taxonomy value. |
title | string | JSON-LD name or card summary. |
price | ['number', 'null'] | JSON-LD offers.price. |
currency | string | Always 'EUR'. |
price_per_sqm | ['number', 'null'] | Computed when price and area are both present. |
area_sqm | ['number', 'null'] | JSON-LD floorSize.value, unit MTK = m². |
rooms | ['integer', 'null'] | JSON-LD numberOfRooms. |
bedrooms | ['integer', 'null'] | Parsed from summary text. |
floor | ['string', 'null'] | Raw label, not normalized. |
energy_rating | ['string', 'null'] | DPE letter A-G when published; extraction needs-cloud-recon. |
location_city | string | From breadcrumb / URL slug. |
location_district | ['string', 'null'] | Live-confirmed district field. |
location_postal_code | ['string', 'null'] | Live-confirmed zipCode field. |
location_region | ['string', 'null'] | From breadcrumb. |
latitude | ['number', 'null'] | Live-confirmed inline GeoJSON Point. |
longitude | ['number', 'null'] | Live-confirmed inline GeoJSON Point. |
agency_name | ['string', 'null'] | Live-confirmed logo alt text, split heuristic. |
agent_name | ['string', 'null'] | Live-confirmed logo alt text, split heuristic. |
agency_phone | ['string', 'null'] | Best-effort; not confirmed statically parseable — never guessed. |
listed_date | ['string', 'null'] | JSON-LD datePosted, ISO 8601. |
description_snippet | ['string', 'null'] | JSON-LD description, first ~300 chars. |
image_urls | array | mms.seloger.com gallery photos (empty OK). |
scraped_at | string | ISO-8601 UTC row-creation timestamp. |
Example output
{"listing_id": "275658639","url": "https://www.seloger.com/annonces/achat/appartement/paris-12eme-75/bel-air-sud/275658639.htm","transaction_type": "sale","property_type": "apartment","title": "Appartement \u00e0 vendre T3/F3 53 m\u00b2 490000 \u20ac Bel-Air Paris (75012)","price": 490000.0,"currency": "EUR","price_per_sqm": 9245.28,"area_sqm": 53.0,"rooms": 3,"bedrooms": 2,"floor": "4/6","energy_rating": null,"location_city": "Paris 12\u00e8me arrondissement","location_district": "Bel-Air","location_postal_code": "75012","location_region": "Ile-de-France","latitude": 48.836230001681116,"longitude": 2.40313082725819,"agency_name": "efficity","agent_name": "Boban Janevski","agency_phone": null,"listed_date": "2026-07-23T02:41:00.000Z","description_snippet": "PARIS XII\u00e8me - MICHEL BIZOT - PLEIN SUD TRAVERSANT ET LUMINEUX AVEC ASCENSEUR ET CAVE...","image_urls": ["https://mms.seloger.com/1/8/7/2/1872b9c3-3cc4-440f-9083-3725a842cc43.jpg"],"scraped_at": "2026-08-13T12:00:00+00:00"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.2 | One-off warm-up charge per run |
result-row | $0.0018 | Per unique dataset item |
Example: 1 000 results at the rates above ≈ $2.00. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
v1 covers seloger.com only — no LogicImmo, Bien'ici, or other French portals. New-development/promoter microsites, mortgage-calculator, and area-guide pages are out of scope. agency_phone ships null by design (no statically-parseable source found); energy_rating is null pending a confirmed extraction path. Page-2+ results per search are not guaranteed until pagination is validated — a status message names any shortfall.
❓ FAQ
Do I need a SeLoger account or API key?
No. This Actor scrapes SeLoger's own publicly listed property data — no login, no API key.
Why is energy_rating usually null?
SeLoger's DPE energy-rating markup isn't reliably parseable yet — we ship it null rather than risk a wrong letter grade, and revisit once we confirm a stable source.
Does this cover every French property type?
Apartment, house, land, and parking are all live-confirmed for location-based search. Commercial has no confirmed SeLoger URL slug yet, so it only works if you paste a commercial search URL into Search URLs directly.
What happens if a page gets blocked?
We rotate the session and retry with backoff; if a page still fails, we skip it, log why, and keep going — never crash the whole run.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.