European Property Search - Search 46 EU Property Portals
Pricing
from $1.20 / 1,000 result scrapeds
European Property Search - Search 46 EU Property Portals
Search 46 European real-estate portals in a single run. Unified feed with EUR-normalized price, surface and price-per-m2. No login required.
Pricing
from $1.20 / 1,000 result scrapeds
Rating
0.0
(0)
Developer
Studio Amba
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
11 days ago
Last modified
Categories
Share
European Property Search
Search forty-six European real-estate portals in a single run. This actor queries each portal in parallel, normalizes every listing to a common schema, converts prices to EUR using live ECB rates, computes price-per-m2, and removes duplicates. One search across most of the European property market.
Pick the exact portals you want, filter by property type, price, size and bedrooms, and get one clean feed back with every price in EUR and every size in m2. Because the numbers are normalized before they are filtered, a price or size limit applies the same way to all 46 sites, including the ones whose own website has no price filter. That is the difference between running 46 scrapers yourself and getting one comparable, deduplicated result set.
No login. No cookies. No account.
What it does
- Searches up to 46 European property portals at once, across 24 countries. The full list is in the table below.
- Lets you run any subset of portals you choose, on their own or combined with a country filter.
- Filters listings by type, price, size and bedrooms, applied consistently across every portal.
- Normalizes every listing to a common schema (title, listing type, property type, price, surface, bedrooms, location).
- Converts prices to EUR with live European Central Bank rates and computes price-per-m2 where surface is available.
- Deduplicates by listing URL and sorts results by EUR price, cheapest first.
Portals covered
All 46 portals, with the country code to use in countries, the exact name to use in portals, which side of the market the portal serves, the currency its listings arrive in (everything is also converted to EUR), and an example of a location that works as searchQuery. Use any city or region in the portal's own country, in its native spelling.
| Country | Portal | Website | Sale / rent | Currency | Example searchQuery |
|---|---|---|---|---|---|
| AT | ImmoScout24.at | immobilienscout24.at | both | EUR | Wien |
| AT | Willhaben | willhaben.at | both | EUR | Graz |
| BE | Immoscoop | immoscoop.be | both | EUR | Antwerpen |
| BE | Immovlan | immovlan.be | both | EUR | Brussel |
| BE | Immoweb | immoweb.be | both | EUR | Gent |
| BE | Zimmo | zimmo.be | both | EUR | Leuven |
| BG | imot.bg | imot.bg | both | EUR | Sofia |
| CH | Flatfox | flatfox.ch | both | CHF | Zürich |
| CZ | Sreality | sreality.cz | both | CZK | Praha |
| DE | ImmoScout24 | immobilienscout24.de | both | EUR | Berlin |
| DE | Immowelt | immowelt.de | both | EUR | München |
| DE | Ohne-Makler | ohne-makler.net | both | EUR | Hamburg |
| DE | WG-Gesucht | wg-gesucht.de | rent only | EUR | Köln |
| DK | Boliga | boliga.dk | both | DKK | København |
| EE | kv.ee | kv.ee | both | EUR | Tallinn |
| ES | Fotocasa | fotocasa.es | both | EUR | Barcelona |
| ES | Idealista | idealista.com | both | EUR | Madrid |
| ES | pisos.com | pisos.com | both | EUR | Valencia |
| FI | Etuovi | etuovi.com | sale only | EUR | Helsinki |
| FI | Oikotie | oikotie.fi | both | EUR | Tampere |
| FR | Bien'ici | bienici.com | both | EUR | Lyon |
| FR | Logic-Immo | logic-immo.com | both | EUR | Marseille |
| FR | SeLoger | seloger.com | both | EUR | Paris |
| GB | OnTheMarket | onthemarket.com | both | GBP | Manchester |
| GB | Rightmove | rightmove.co.uk | both | GBP | London |
| GB | SpareRoom | spareroom.co.uk | rent only | GBP | Bristol |
| GB | Zoopla | zoopla.co.uk | both | GBP | Leeds |
| HU | Ingatlan | ingatlan.com | both | HUF | Budapest |
| IE | Daft | daft.ie | both | EUR | Dublin |
| IE | MyHome | myhome.ie | both | EUR | Cork |
| IT | Immobiliare | immobiliare.it | both | EUR | Milano |
| LT | Aruodas | aruodas.lt | both | EUR | Vilnius |
| LU | athome | athome.lu | both | EUR | Luxembourg |
| LU | Wortimmo | wortimmo.lu | both | EUR | Esch-sur-Alzette |
| NL | Funda | funda.nl | both | EUR | Amsterdam |
| NL | Pararius | pararius.nl | both | EUR | Utrecht |
| PL | Gratka | gratka.pl | both | PLN | Kraków |
| PL | Morizon | morizon.pl | both | PLN | Warszawa |
| PL | Nieruchomosci-online | nieruchomosci-online.pl | both | PLN | Gdańsk |
| PL | Otodom | otodom.pl | both | PLN | Wrocław |
| PT | Imovirtual | imovirtual.com | both | EUR | Lisboa |
| PT | Remax.pt | remax.pt | both | EUR | Porto |
| RO | Storia | storia.ro | both | EUR | București |
| RS | 4zida | 4zida.rs | both | EUR | Beograd |
| SI | Nepremicnine | nepremicnine.net | both | EUR | Ljubljana |
| SK | Nehnutelnosti | nehnutelnosti.sk | both | EUR | Bratislava |
Portal names in the portals input are matched case-insensitively, and the scraper slug works too ("immoweb-scraper" or "immoweb" both select Immoweb). "Rent only" portals are skipped on a sale run and "sale only" portals on a rent run, so a filtered run never returns listings from the wrong side of the market.
Sweden, Norway, Greece, Croatia and Latvia are not covered yet.
Choosing which portals to run
Two inputs decide which portals a run queries, and they combine:
portalspicks specific sites by name, in any combination (for example["Immoweb", "Idealista", "Rightmove"]). Leave it empty for all portals.countriesrestricts to portals in those countries (for example["BE", "NL"]).
Give both and the run uses the intersection (for example portals: ["Immoweb"] with countries: ["BE"] runs Immoweb only). Give neither and it runs all 46. This is how you assemble exactly the coverage you want and leave out the sites you do not need.
Filtering listings
These filters narrow what comes back. Each is passed to every selected portal that supports it, and the numeric bounds are also enforced after the results are merged, on the normalized EUR and m2 values, so they hold even on portals whose own search has no such filter.
| Filter | What it does |
|---|---|
listingType | sale or rent. Empty returns both. Translated to each portal's own filter (for example koop/huur on Funda, venta/alquiler on pisos.com). Rent-only portals (SpareRoom, WG-Gesucht) are skipped on a sale run, and sale-only Etuovi on a rent run. |
propertyType | For example house or apartment. |
minPrice / maxPrice | Price bounds in EUR, applied to the EUR-converted price of every listing. |
bedrooms | Minimum number of bedrooms. |
minSize / maxSize | Living surface bounds in m2. |
How to scrape European real estate data
- Set Search Location (
searchQuery) to a city or region, for exampleGent. This is a location, not a keyword. Leave it empty to let each portal use its own default city, which is the better choice when you query several countries at once (a city name only matches its own country). - Choose your coverage: pick specific sites with Portals, or restrict to Countries, or both. Leave both empty for all 46.
- Add any Filters you need: listing type, property type, price range, bedrooms, surface.
- Set Max Items Per Portal to control how many listings are pulled from each portal.
- Run the actor. Each portal is queried in parallel, listings are normalized, priced in EUR, filtered and deduplicated.
- Open the dataset. Each row is one unique property listing with the portal it came from.
Input
| Field | Type | Description |
|---|---|---|
searchQuery | string | Location (city or region) passed to every selected portal. Not a keyword. Empty uses each portal's default city. |
countries | array | Optional country filter. Empty means all countries. |
portals | array | Optional list of portal names to run. Empty means all portals in the selected countries. |
listingType | string | sale or rent. Empty returns both. |
propertyType | string | For example house, apartment. Empty returns all types. |
minPrice / maxPrice | integer | Price bounds in EUR. |
bedrooms | integer | Minimum bedrooms. |
minSize / maxSize | integer | Living surface bounds in m2. |
maxItemsPerPortal | integer | Max listings per portal (1–200, default 20). |
timeoutPerPortalSecs | integer | Max seconds to wait per portal (30–600, default 120). |
proxyConfiguration | object | Proxy settings passed to the underlying scrapers. Residential is used by default and recommended. |
Example input
Houses for sale up to 300,000 EUR, on Immoweb and Idealista only:
{"portals": ["Immoweb", "Idealista"],"listingType": "sale","propertyType": "house","maxPrice": 300000,"maxItemsPerPortal": 25,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Every apartment for rent across Spain and Italy:
{"countries": ["ES", "IT"],"listingType": "rent","propertyType": "apartment","maxItemsPerPortal": 50,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Output
Each item in the dataset is one unique property listing:
{"itemTitle": "Bright 2-bedroom apartment near the center","listingType": "sale","propertyType": "apartment","price": 285000,"currency": "EUR","priceEur": 285000,"surface": 78,"pricePerSqmEur": 3654,"bedrooms": 2,"location": "Valencia","country": "ES","url": "https://...","source": "Idealista","imageUrl": "https://...","scrapedAt": "2026-06-15T18:00:00.000Z"}
| Field | Description |
|---|---|
itemTitle | Listing title. |
listingType | Sale or rent, if available. |
propertyType | Apartment, house, studio, etc., if available. |
price / currency | Price in the portal's native currency. |
priceEur | Price converted to EUR with live ECB rates. |
surface | Living area in m2, if available. |
pricePerSqmEur | EUR price divided by surface, when both are known. |
bedrooms | Number of bedrooms or rooms, if available. |
location | City or region, if available. |
country | ISO country code of the source portal. |
url | Link to the original listing. |
source | Name of the portal the listing came from. |
scrapedAt | ISO 8601 timestamp. |
A final __SUMMARY__ item lists which portals answered, which failed, the total unique listings, how many duplicates were removed, and how many listings were filtered out by the price, size and bedroom bounds.
Currency conversion and price-per-m2
Prices arrive in each portal's local currency. The actor fetches live EUR reference rates from the European Central Bank at the start of every run and converts each price to EUR. Where a listing exposes its surface area, price-per-m2 is computed in EUR so listings of different sizes and currencies can be compared on a like-for-like basis. Native price and currency are always preserved.
Because price and surface are normalized to EUR and m2 before the price, minPrice/maxPrice and minSize/maxSize bounds apply the same way to every portal, including the ones whose own website cannot filter on price. A listing whose price or surface could not be read is excluded when a bound is set, since it cannot be confirmed to match.
Use cases
- Cross-border property-price research and relocation planning.
- Price-per-m2 benchmarking across European cities and countries.
- Feeding a real-estate aggregator or dashboard with EUR-normalized listings from a chosen set of portals.
- Market analysis of supply and pricing for a property type across Europe.
Pricing and cost
This actor charges its own start fee and a small per-result fee. The portal scrapers it launches each bill their own per-result price to your account on top, exactly as if you ran them directly. The cost of a run settles once it has finished successfully.
Notes
- This is a meta-actor. It orchestrates our individual national property-portal scrapers and runs them in parallel, so a single run can cover most of Europe at once.
- Field and filter coverage depends on each portal. Not every portal exposes surface or bedrooms, and not every portal's own search supports every filter. Price, size and bedroom bounds are still enforced afterwards on the normalized values, so the returned set always respects them.
searchQueryis a location, not a keyword. UsepropertyTypeand the other filters to narrow by type. A broad or empty location matches more portals than a hyper-specific local query.- Residential proxies are used by default and give the most reliable results.
FAQ
Can I search for a keyword like "penthouse" or "sea view"?
No. searchQuery is a location. The portals search by place, not by free text. Use propertyType and the numeric filters to narrow down what comes back.
Do I need an account or API key for any of the portals? No. Every portal is scraped without a login, and there is nothing to configure beyond the input fields above.
I searched "Gent" across all portals and most returned other cities. Why?
A city name only exists on the portals of its own country. The other portals fall back to their default city. When you search a specific city, add its country in countries (for example searchQuery: "Gent" with countries: ["BE"]).
Can I run just one portal?
Yes. Set portals to one name from the table, for example ["Funda"]. The run then behaves like that single scraper, plus EUR conversion and the normalized schema.
Why is a portal listed under portalsFailed in the summary?
It was blocked, timed out, or returned nothing for your query. The other portals are unaffected and the run still succeeds. A rerun usually recovers it; for slow portals, raise timeoutPerPortalSecs.
Why do some listings have no priceEur?
The portal did not publish a price (common for "price on request" listings). When you set a price bound, those listings are excluded, because the actor cannot confirm they match.
How much does a run cost?
A start fee plus a small per-result fee for this actor, plus each portal scraper's own per-result price for the listings it returns. The ceiling is maxItemsPerPortal times the number of portals you run, so 5 portals at 20 items each bills at most 100 results. The cost settles once the run has finished successfully.
How fresh is the data? Every run scrapes the portals live. Nothing is served from a cached index.
Why is there no portal for Sweden or Norway? Not covered yet. The table above is the current coverage; it grows as we add national scrapers.