Idealista Scraper | Spain, Italy & Portugal Property Data
Pricing
Pay per event
Idealista Scraper | Spain, Italy & Portugal Property Data
[$0.90 / 1K listings - no start fee] Scrape any Idealista search across Spain, Italy and Portugal: homes, rooms, garages, offices, premises, land, buildings, storage, for sale or rent. Price, m2, EUR/m2 vs market median, agency and price cuts per row, plus optional listing-page detail.
Pricing
Pay per event
Rating
0.0
(0)
Developer
WebData Labs
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
3 days ago
Last modified
Categories
Share
Idealista Scraper - Spain, Italy & Portugal Property Data
Any Idealista search, exported as structured rows: homes, rooms, garages, offices, commercial premises, land, whole buildings and storage, for sale or to rent, with €/m² scored against the market median on every row.
Most Idealista exports give you a price and a title. This one gives you the search you actually ran, on whichever of the three sites you need, with the fields that let you rank the results without opening a single listing: €/m², how that compares with the median of everything the run collected, whether the asking price was cut, and who is advertising it. Turn on detail scraping and each row also carries what only the listing page knows, including the energy rating, the year the building went up, the bathroom count and the floor plan images.
No proxy setup, no API key, no login. Pick a location, pick a property type, press Start.
✅ What you get / ❌ what this isn't
| ✅ What you get | ❌ What this isn't |
|---|---|
| Eight property types, each with its URL grammar verified against a live page | Not a homes-only scraper with the other types guessed and quietly returning nothing |
| Three countries with three different grammars for pagination, sorting and filters | Not a Spanish scraper with .it and .pt bolted on and capped at page one |
€/m² per listing plus the median of your search and a % vs median gap | Not a raw price column that leaves you to work out whether 420,000 € is good for that street |
| Price cuts as real fields on every row, at no extra cost, because Idealista renders them into the card | Not a "run it twice a week apart and diff the files" export |
| Optional listing-page detail: energy rating, year built, bathrooms, heating, floor plans | Not a search-card dump that calls itself a property database |
| No proxy or anti-bot setup, and no start fee | Not a scraper that hands you a proxy field and blames your proxies when it returns nothing |
🗺️ What is covered
Property type coverage differs per site, because Idealista does not run the same sections in every country. Every combination below was checked against a live Idealista page, and any combination not listed is refused with a message naming what that site does support, rather than returning an empty run.
Spain (idealista.com)
- Homes and flats, for sale and to rent
- Rooms in shared flats, to rent
- Garages and parking, for sale and to rent
- Offices, for sale and to rent
- Commercial premises, for sale and to rent
- Land and plots, for sale
- Whole buildings, for sale
- Storage rooms, for sale and to rent
Italy (idealista.it)
- Homes and flats, for sale and to rent
- Rooms in shared flats, to rent
- Garages and parking, for sale and to rent
- Offices, for sale and to rent
- Commercial premises, for sale
- Land and plots, for sale
- Whole buildings, for sale
Portugal (idealista.pt)
- Homes and flats, for sale and to rent
🔎 Why use this Actor
- The type slugs are verified, not guessed. Idealista localises every path segment, and a wrong one is answered with a page rather than an error, so a guessed slug can silently return the wrong thing. Of twelve Italian candidates tested, four were wrong: commercial premises are
vendita-negoziand not the Spanish-shapedvendita-locali, and whole buildings arevendita-edificiand notvendita-palazzi. Both wrong guesses return a page. Only what was proved on a live page ships here. - €/m² is scored, not just printed. Every row carries
pricePerSqm, themedianPricePerSqmof everything the run collected, andpctVsMedianPricePerSqm, so "cheap" and "cheap for this street" stay separate questions.isBelowMarketis the one-column answer. - Price cuts come free. Idealista renders the previous price and reduction badge server-side onto reduced cards, so
previousPrice,priceDropAmountandpriceDropPercentare on every row without a second run or a diff. The percentage is recomputed from the two prices rather than copied from Idealista's badge, which rounds to a whole number. - Detail scraping is opt-in and priced separately. A search page yields about 30 listings for one page fetch; a listing page yields one. Folding that into a single per-row price would make every buyer pay for depth they did not ask for, so it is a separate switch and a separate charge.
- Multiple locations in one run. Give a list of location slugs and each is scraped as its own search into one dataset, with a shared market median.
- No start fee. Several Idealista Actors add a per-run charge on top of the per-result price. This one does not, so short and scheduled runs stay cheap.
👥 Who it's for
Property investors, buyer's agents, relocation consultants, PropTech and valuation teams who need a market rather than a listing.
- Pull an entire city's stock for a type and rank it by €/m² against its own median.
- Screen commercial premises or whole buildings, which most Idealista scrapers do not cover at all.
- Build rental-yield comparisons by running sale and rent for the same location and joining on district.
- Feed asking prices and areas into a valuation model or CMA without hand-collecting comparables.
- Track a district over time by scheduling the same search weekly.
Example tasks
Ready-made searches you can open, copy the input from, and adapt. Each is a saved configuration of this Actor, so the fastest way to start is usually to take the closest one and change the location.
- Scrape Idealista property listings in Spain - the general case: a whole Spanish city's homes for sale.
- Scrape Idealista apartments for rent in Barcelona - the rental side of the same market, with the private-owner filter.
- Scrape Idealista commercial premises in Italy - retail and commercial units on the Italian site.
- Scrape Idealista garages and parking spaces - cheapest first, a type most Idealista scrapers do not cover.
- Scrape Idealista land and plots for sale - development sites and building plots.
- Scrape whole buildings for sale on Idealista - block purchases and portfolio sourcing.
- Scrape Idealista rooms for rent in Madrid - rooms in shared flats, for student housing research.
- Get Idealista listings with energy rating and floor plans - detail scraping on, for the deep per-listing record.
- Find Idealista properties priced below the local market - sorted by EUR/m2, then scored against the median of the results.
- Estrarre case in vendita da idealista a Roma - the Italian site, in Italian.
⚙️ How to run it
- Pick the Country, then Sale or rent, then the Property type.
- Put one or more Locations in, using the slug Idealista uses in its own URL:
madrid-madrid,barcelona-barcelona,roma-roma,milano-milano,lisboa-lisboa. Open the search on Idealista and copy the part after the operation segment. - Optionally turn on Also open each listing page for the deeper fields.
- Set Maximum listings (100 by default, 0 for no limit) and press Start.
- Open the Listings view on the run's Output tab, or export to CSV, Excel or JSON.
Prefer to work from the site itself? Set up the search on Idealista with whatever filters you like, copy the URL from the address bar, and paste it into Idealista search URLs. That path always matches what you see in the browser, and it overrides the structured fields.
📥 Input examples
A whole city, homes for sale
{"country": "es","operation": "sale","propertyType": "homes","locations": ["madrid-madrid"],"maxItems": 500}
Two cities at once, commercial premises in Italy
{"country": "it","operation": "sale","propertyType": "premises","locations": ["roma-roma", "milano-milano"],"maxItems": 200}
Deep records with energy rating and floor plans
{"country": "es","operation": "sale","propertyType": "homes","locations": ["barcelona-barcelona"],"includeDetails": true,"maxItems": 50}
Garages for sale, cheapest first
{"country": "es","operation": "sale","propertyType": "garages","locations": ["madrid-madrid"],"sortBy": "cheapest","maxPrice": 30000}
Rooms to rent, private owners only
{"country": "es","operation": "rent","propertyType": "rooms","locations": ["valencia-valencia"],"onlyPrivateOwners": true}
Only listings whose price was cut
{"country": "es","operation": "sale","propertyType": "homes","locations": ["malaga-malaga"],"sortBy": "priceDrop","onlyPriceDrops": true,"minPriceDropPercent": 5}
Large family homes, filtered at the source
{"country": "es","operation": "sale","propertyType": "homes","locations": ["sevilla-sevilla"],"minArea": 120,"minRooms": 4}
Portuguese rentals
{"country": "pt","operation": "rent","propertyType": "homes","locations": ["lisboa-lisboa"],"maxPrice": 2500}
Straight from a search URL you already have
{"startUrls": ["https://www.idealista.com/venta-viviendas/madrid-madrid/con-precio-hasta_400000/"],"maxItems": 300}
Whole buildings, for portfolio sourcing
{"country": "es","operation": "sale","propertyType": "buildings","locations": ["madrid-madrid", "barcelona-barcelona"]}
📤 Output
One row per unique listing. The search-card fields are on every row; the detail fields only when Also open each listing page is on.
From the search card, always present
| Field | Description |
|---|---|
id | Idealista's own listing id |
url | Listing page URL |
title | Listing headline as Idealista writes it |
price | Current asking price |
currency | Always EUR on these three sites |
hasPriceDrop | Whether Idealista marks this listing as reduced |
previousPrice | The price before the cut |
priceDropAmount | How much was cut |
priceDropPercent | The cut as a percentage, recomputed from both prices |
pricePerSqm | Price divided by area |
medianPricePerSqm | Median €/m² of everything the run scanned |
pctVsMedianPricePerSqm | How far this listing sits from that median |
isBelowMarket | Whether €/m² is under the median |
propertyType | The type searched for |
operation | sale or rent |
country | es, it or pt |
street, district, city, locationText | Location parsed out of the title |
rooms | Bedrooms as shown on the card |
areaSqm | Floor area as shown on the card |
floor, isExterior, hasLift, hasGarage | Card feature chips |
isProfessionalAd | True for agency stock, false for private owners |
agencyName, agencyUrl | The advertising agency |
description | Short description from the card |
thumbnailUrl, photoCount | Card media |
searchUrl, scrapedAt | Provenance |
From the listing page, when detail scraping is on
| Field | Description |
|---|---|
detailScraped | Whether the listing page was fetched and parsed |
detailTitle, detailLocation | Title and neighbourhood as the page states them |
detailPrice, detailPricePerSqm | Price and €/m² as the page states them |
fullDescription | The complete advertiser description, not the card excerpt |
builtAreaSqm | Built area from the features block |
detailRooms, bathrooms | Bedroom and bathroom counts |
builtYear | Year of construction |
condition | For example second hand, good condition, or new build |
orientation | Which way the property faces |
heating | Heating type, or that there is none |
detailFloor, detailHasLift, detailIsExterior, detailHasGarage | Building features |
energyConsumption, energyConsumptionRating | kWh/m² per year and its A to G letter |
energyEmissions, energyEmissionsRating | kg CO2/m² per year and its A to G letter |
features | Every feature line, grouped under Idealista's own headings, in the site's language |
photoUrls, photoCount | Full-size photo URLs and the count Idealista displays |
floorPlanUrls, floorPlanCount, hasFloorPlan | Floor plan images |
advertiserName, reference | Advertiser and their own internal reference |
locationBreadcrumb | Street, neighbourhood, district, city, province |
listingUpdatedText | When Idealista says the ad was last updated |
latitude, longitude | Exact position, when the advertiser published one. See the caveats. |
💵 How much does it cost?
Two charges, and you only ever pay the second one if you ask for it.
| Event | Price (Free plan) | Down to (Diamond) |
|---|---|---|
| Listing scraped | $0.0009 each, so $0.90 per 1,000 | $0.0005 |
| Listing page opened | $0.015 each, so $15 per 1,000 | $0.008 |
There is no actor start fee. A run that returns nothing costs nothing.
The gap between the two prices is the real cost difference, not a markup: one page fetch returns about 30 listings from a search page, and exactly one from a listing page. If you do not need the energy rating and the floor plans, leave detail scraping off and pay the row price only.
🔁 Run it on the Apify platform
Schedule it, call it over the API, or fire it from a webhook. Save a configuration as a Task to re-run the same search without retyping it, which is the usual way to track a district week to week.
🤖 Use with AI agents via MCP
This Actor is available over Apify's MCP server, so an agent can run it as a tool.
Claude Code
$claude mcp add apify --transport http https://mcp.apify.com/?actors=webdata_labs/idealista-scraper
Cursor or Claude Desktop, in your MCP settings:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com/?actors=webdata_labs/idealista-scraper"}}}
An agent can fill locations: ["madrid-madrid"] and propertyType: "homes" directly. It cannot reliably construct a valid Idealista URL from scratch, which is why the structured fields exist alongside the URL input.
🔗 Use this Actor in n8n
Use the Apify node, pick this Actor, and map the input fields. The dataset comes back as items you can pass straight into a spreadsheet, a database or an LLM node. A common shape is a weekly schedule trigger, this Actor, then a filter on isBelowMarket and a notification.
⚠️ Limits and caveats
Written plainly, because most of these look like bugs if nobody tells you.
- Portugal covers homes only. The Portuguese type slugs for garages, offices and the rest are not verified yet, and shipping an unverified slug would give you an empty run that reads as a broken Actor. Spanish and Italian coverage is listed above in full.
- New developments are not a supported type on any site.
obra-nuevareturns a 404 on the Spanish site and the Italian equivalents return nothing, so Idealista appears to route new builds somewhere this Actor does not yet reach. Rather than ship a slug that errors, it is left out. - Exact coordinates are usually empty. Idealista publishes a listing's position only when the advertiser chooses to, and blurs it otherwise. Across the listings measured while building this,
latitudeandlongitudewere empty on all of them. The fields are populated when the data is there, and are not a promise that it usually is. - Non-home types carry fewer card fields. A garage or a plot of land has no bedrooms and often no stated area, so
rooms,areaSqmand thereforepricePerSqmcome back empty on those rows. That is Idealista's card, not a parsing failure. Turn on detail scraping if you need more from those types. - There is no price history. The listing page carries no history widget, so the only reduction data available anywhere on Idealista is the previous price on the search card, which this Actor already returns. Any Actor promising a full price timeline is reconstructing it from its own past runs, not reading it from Idealista.
- Portugal has no sort ordering. Every sort value returns a byte-identical page there, so
sortByis ignored on.ptand the run says so in the log rather than pretending it applied. - Italy has no rental listings for commercial premises, and land, buildings and storage are sale only everywhere. Asking for an unsupported combination returns a clear error naming what that site does support.
- The median settles after the first page.
medianPricePerSqmon a row is the median known when that row was written, because rows are written page by page rather than held to the end of the run. The final value is inRUN_SUMMARY. Holding everything to the end would mean an aborted run returned nothing at all. - Very narrow searches stop early on purpose. If a search is reading many pages and matching almost nothing, the run stops and says so instead of scanning a whole city for a handful of hits. Broaden the location or loosen the filters to go deeper.
🧩 Related Actors
A property workflow usually needs more than one source. These fit together:
- Idealista Price Drop Scraper - the same three countries, built around the price cut: reduction-first ordering, minimum drop filters and a form shaped for finding motivated sellers.
- Redfin Property Scraper - US listings, when your market is on the other side of the Atlantic.
- Zillow Property Detail Scraper - deep US property records.
- Zillow Agent Scraper - the agents behind the listings.
- Spain BOE Subastas API - Spanish judicial property auctions, the distressed end of the same market.
- France Notaires Property API - actual recorded French sale prices, for a market where asking prices are not the whole story.
- Website Contact Extractor - turn the agency URLs on these rows into contact details.
❓ FAQ
Do I need an Idealista account or API key?
No. This Actor reads public search pages. There is nothing to sign up for and no credentials to enter.
Do I need to configure proxies?
No. Proxying and anti-bot handling are our problem, not yours, and are included in the price. There is no proxy field to get wrong.
What is a location slug and where do I find it?
It is the part of an Idealista URL after the operation segment. In idealista.com/venta-viviendas/madrid-madrid/, the slug is madrid-madrid. Open the search you want on the site and copy that part. If in doubt, paste the whole URL into Idealista search URLs instead.
Why did my run return fewer listings than Idealista claims?
Idealista's result count is for the whole search; the run stops at your Maximum listings, and stops early if a search is matching very little per page. Set maxItems to 0 to remove the cap.
Can I get the phone number of the advertiser?
No. Idealista puts the phone number behind an interaction and this Actor does not attempt it. You get the agency name, the agency profile URL and their internal reference, which is enough to find them.
Does it work for new build developments?
Not yet. See the caveats above: Idealista does not serve new builds under the path shapes tested, and rather than ship a guess this Actor leaves the type out.
How many listings can I get from one search?
As many as Idealista will paginate, which is thousands for a large city. Set maxItems to 0 for no limit. Long runs re-open their session automatically as needed.
Is the €/m² median the real market median?
It is the median of the listings this run collected, which is the right comparison for ranking one search against itself. It is not an official market index, and a run limited to 20 listings has a median made of 20 listings.
Can I run sale and rent together?
Not in a single run, because they are different searches. Run them separately and join the datasets on district or city, which is the usual way to compute a yield.
⚖️ Is it legal to scrape Idealista?
Scraping publicly available data is broadly lawful in the EU and the US, and this Actor only reads pages any visitor can open, with no login and no personal accounts involved. What you do with the data is a separate question: listing text and photographs are the advertiser's copyright, and if a row identifies a private individual then GDPR applies to your use of it. Use the data for market analysis, keep republication of photos and description text out of it, and take your own advice for anything commercial. Nothing here is legal advice.
📝 Changelog
2026-08-24 - 0.1
First release. Eight property types across Spain and Italy, homes in Portugal, each type slug verified against a live page. Optional listing-page detail scraping with energy rating, year built, bathrooms, features, photos and floor plans. €/m² market scoring and price-cut fields on every row.
🛠️ Support
Open an issue on the Actor's Issues tab. Bugs get looked at quickly, and a clear description of the search you ran is usually enough to reproduce.
⭐ Rate this Actor
If it saved you an afternoon, a rating helps other people find it.