Idealista Scraper
Pricing
from $0.30 / 1,000 results
Idealista Scraper
Scrape Idealista listings across Spain, Portugal and Italy. Get 75 fields per property: asking price, size, rooms, GPS coordinates, energy rating, neighborhood, agency name and phone, floor plans and virtual tours. Go past the 1,800 result search cap. Export straight to CSV, JSON or Excel.
Pricing
from $0.30 / 1,000 results
Rating
0.0
(0)
Developer
SilentFlow
Maintained by CommunityActor stats
5
Bookmarked
79
Total users
2
Monthly active users
21 days ago
Last modified
Categories
Share
Turn Idealista's Spanish, Portuguese and Italian listings into a structured property database. Prices, price drops, sizes, features, coordinates, media and agency contacts, up to 75 fields per property. 2,000 Lisbon properties in under 10 minutes, not a week of copy-pasting.
How it works
Pick a market and type a city, or paste a search URL you already built on Idealista. The Actor returns clean JSON: one row per property, ready for a spreadsheet, a database, or a valuation model.
- Choose Spain, Portugal or Italy, then type a location (
barcelona,lisboa,roma) or paste an Idealista search URL. - Add the filters you care about: maximum price, minimum and maximum size, rooms, bathrooms, sort order.
- Set how many properties you want, turn on Enrich if you need agency contacts, and hit Start. Download the results as JSON, CSV or Excel.

✨ Why teams choose this over other Idealista scrapers
Exported a Madrid search and noticed it stopped dead at 1,800 rows? Building a comparables model on a sample that quietly excludes most of the market? Bought an agency contact list that turned out to be a name and one phone number?
- 🧱 Get the whole market, not the first 1,800. Idealista serves at most 60 pages for any single search, which caps every ordinary scraper at roughly 1,800 properties. This one keeps going. A single Lisbon search returned 2,000 properties, a single Bologna search returned 2,500, both with zero duplicate listing IDs. Real Lisbon inventory is around 10,000 properties, not the 1,800 the page count suggests.
- 🌍 Three countries, one Actor. Spain (idealista.com), Portugal (idealista.pt) and Italy (idealista.it) from the same input. Price, size, rooms and bathrooms filters work in all three, and they combine freely in a single search.
- 🏢 Agency contacts that actually qualify a lead. Turn on Enrich and each row carries the agency name, the phone in international format (
+351 218 74 44 25), the office address, how many listings that agency runs, and the agency's own real estate license number (licenseCode, for example Portugal's AMI number19544). A license number is verifiable. A bare phone number is not. - 📍 Location you can group and join on. Enriched rows carry the same four tier hierarchy in all three countries:
administrativeAreaLevel1throughadministrativeAreaLevel4, for exampleLisboa, LisboathenCampo de OuriquethenCentro, andQuartiere Ostia Ponenteon a Rome listing. Aggregate Madrid, Lisbon and Rome in one dashboard without writing per country string matching. - 💸 See the price move, not just the price.
formerPrice,priceDropValueandpriceDropPercentagecome straight off the search results, no extra step needed. A Lisbon flat listed at 285,000 EUR shows a former price of 295,000 and a 3% drop, so you can rank motivated sellers instead of guessing which ones are. - 🎥 Media and tours, not just a thumbnail. Photo count and every image URL on every run. With Enrich on, each image also carries its room tag and dimensions, plus the listing's own video file and virtual tour links (
https://my.matterport.com/show/?m=yGyjYc8Gj51&lang=pt). Score listing quality before a single site visit. - 🎯 Your item cap is exact. Ask for 2,000 properties and you get 2,000, not 1,974 and not 2,061. Verified on both the Lisbon and Bologna runs above.
- 🧹 No duplicates to clean up. Listings are deduplicated on
propertyCodeacross every page and every slice of the search, so a 2,500 row export is 2,500 distinct properties. - 🏘️ Properties or agencies, your choice. Switch the mode and the same search returns real estate agency profiles instead: name, commercial name, phones, office address, postal code, city and profile URL.
- 🗣️ Honest empty runs. If a search matches nothing, the run says so. If pages could not be read, it says that instead. You never get a green run that quietly delivered zero rows for an unexplained reason.
- 💰 Pay per result, not per minute. You pay for rows delivered, period.
🎯 What you can do with Idealista data
| Team | What they build |
|---|---|
| Real estate investment | Rank Lisbon and Porto neighborhoods by price per square meter using pricePerSquareMeter and administrativeAreaLevel3, then shortlist listings that already cut their price by 3% or more |
| Proptech product | Power a comparables widget with live inventory: size, rooms, bathrooms, floor, energy rating and coordinates for every active listing in a city |
| Market research | Track supply and asking prices weekly across Spain, Portugal and Italy from one dataset, with a location hierarchy that is identical in all three markets |
| Sales and B2B lead gen | Build a qualified agency list with agencyName, licenseCode, agencyAddress, international format phone and totalAgencyAds to size each agency before the first call |
| Mortgage and lending | Feed a valuation model with asking price, built size, usable area, community costs, condition and energy certification for thousands of comparable properties |
| Relocation and mobility | Compare rental inventory in Madrid, Barcelona and Valencia by budget and rooms, with furnished, pets allowed and parking flags on each listing |
| Data science | Train price models on tens of thousands of rows with coordinates, structured characteristics and price history instead of a scraped HTML dump |
| Housing journalism | Quantify how much of a district's inventory sits above a price threshold, and how many listings cut their asking price this month |
| Short-term rental operators | Find large properties with terraces, pools and top floor flags in target neighborhoods, with photo counts and virtual tours to pre-screen them |
📥 Input parameters
What to scrape
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | properties | properties for listings, agencies for real estate agency profiles |
Search
| Parameter | Type | Default | Description |
|---|---|---|---|
searchUrl | string | empty | Paste a full Idealista search URL. When set, every filter below is ignored |
location | string | empty | City or region name: madrid, barcelona, valencia, lisboa, roma. Use this instead of searchUrl to go past the 1,800 wall |
country | string | es | es for idealista.com, pt for idealista.pt, it for idealista.it |
propertyType | string | viviendas | viviendas (all homes), pisos, casas, aticos, chalets, habitacion, oficinas, locales, garajes, terrenos, trasteros. Applies to Spain searches |
priceMax | integer | none | Maximum price in EUR |
sizeMin | integer | none | Minimum size in m² |
sizeMax | integer | none | Maximum size in m² |
rooms | integer | 0 | Minimum room count, 0 to 4 |
bathrooms | integer | 0 | Minimum bathroom count, 0 to 3 |
sortBy | string | relevance | precio-asc, precio-desc, metros-cuadrados-asc, metros-cuadrados-desc, fecha-publicacion-desc |
priceMax, sizeMin, sizeMax, rooms, bathrooms and sortBy all apply together in a single search, and all of them work on Spain, Portugal and Italy.
Options
| Parameter | Type | Default | Description |
|---|---|---|---|
maxItems | integer | 0 | Hard cap on rows delivered. 0 means no cap, and an uncapped run covers the full market |
pages | integer | 1 | Search result pages to read, about 30 properties each. Idealista serves at most 60 pages per search |
enrichDetails | boolean | false | Opens each property's own page for agency contacts, coordinates, usable area, community costs, energy rating, the four tier location hierarchy, virtual tours and more. Slower, off by default |
📊 Output data
A property row from a standard run
{"propertyCode": "35081413","url": "https://www.idealista.pt/imovel/35081413/","title": "Apartamento T2 em Campo de Ourique, Lisboa","description": "Apartamento T2 remodelado, cozinha equipada, varanda a sul...","price": 285000,"formerPrice": 295000,"priceDropValue": 10000,"priceDropPercentage": 3,"pricePerSquareMeter": 3654,"currency": "EUR","size": 78,"rooms": 2,"floor": "Rés do chão","municipality": "Lisboa","country": "pt","hasElevator": true,"isExterior": true,"hasTerrace": true,"parkingIncludedInPrice": false,"isAgency": true,"agencyName": "Fátima cordeiro - sociedade de mediação imobiliária","numPhotos": 24,"has3DTour": true,"hasVideo": true,"thumbnail": "https://img4.idealista.pt/blur/WEB_LISTING/0/id.pro.pt.image.master/...","scrapedAt": "2026-08-18T02:41:07Z"}
A property row with Enrich turned on
{"propertyCode": "35196628","url": "https://www.idealista.pt/imovel/35196628/","highlightComment": "T2 Remodelado por Arquiteto com terraço privado em Campo de Ourique","propertyType": "flat","floor": "Rés do chão","hasElevator": true,"neighborhood": "Campo de Ourique","administrativeAreaLevel1": "Lisboa, Lisboa","administrativeAreaLevel2": "Campo de Ourique","administrativeAreaLevel3": "Centro","isAgency": true,"agencyName": "Century 21 Le Quartier","agencyUrl": "https://www.idealista.pt/pro/century-21-le-quartier/","licenseCode": "19544","formattedPhoneWithPrefix": "+351 218 74 44 25","numPhotos": 27,"has3DTour": true,"hasVideo": true,"videoUrl": "https://st3v.idealista.pt/f9/25/b2/325096553.mp4","virtualTourUrl": "https://my.matterport.com/show/?m=yGyjYc8Gj51&lang=pt","scrapedAt": "2026-08-18T02:41:09Z"}
A Porto listing from the same run carries usableArea 204, isTopFloor true, administrativeAreaLevel4 Bairro Bolhão, licenseCode 14936, agencyAddress Rua Alexandre Herculano 371 and highlightComment Penthouse com 6 quartos, Terraço e Vista panorâmica para o Porto. A Rome listing in Ostia carries usableArea 125, communityCosts 150, administrativeAreaLevel4 Quartiere Ostia Ponente and agencyName Valva Realty Italia.
An agency row (mode: "agencies")
{"agencyId": "century-21-le-quartier","name": "Century 21 Le Quartier","commercialName": "Century 21 Le Quartier","phone": "+351 218 74 44 25","phones": ["218744425"],"address": "Rua Ferreira Borges 100","postalCode": "1350-129","city": "Lisboa","country": "pt","totalListings": 12,"isProfessional": true,"hasChatEnabled": true,"url": "https://www.idealista.pt/pro/century-21-le-quartier/","logo": "https://st3v.idealista.pt/logos/century-21-le-quartier.png","propertiesScraped": ["35196628", "35081413"],"scrapedAt": "2026-08-18T02:44:31Z"}
🗂️ Data fields
A standard run fills about 40 keys per property. On a real Lisbon listing, turning on Enrich took the same row from 45 keys to 75. Keys with no value are left out of the row entirely rather than published as a misleading 0 or "", so a missing key means "Idealista did not publish this", never "we guessed zero".
Fields marked Enrich only carry a value when enrichDetails is on. Everything else ships on every run.
Identity and timestamps
| Field | Type | Enrich | Description |
|---|---|---|---|
propertyCode | string | Idealista's own listing ID, stable across runs, the deduplication key | |
url | string | Permanent link to the listing | |
externalReference | string | ✅ | The agency's own internal reference for the property |
locationId | string | ✅ | Idealista's internal location identifier |
modificationDateText | string | ✅ | Human readable last update, for example Anúncio atualizado há um mês |
scrapedAt | string | Extraction time, RFC 3339 UTC |
Listing
| Field | Type | Enrich | Description |
|---|---|---|---|
title | string | Listing headline | |
description | string | Free text description as published | |
highlightComment | string | ✅ | The agency's own one line pitch for the property |
propertyType | string | ✅ | flat, house, penthouse, villa, room, land, office, commercial, garage |
propertySubType | string | ✅ | Finer classification where Idealista publishes one |
condition | string | ✅ | Idealista's own status label: good, renew, new |
isNewDevelopment | boolean | Flagged as new construction on the listing |
Price
| Field | Type | Enrich | Description |
|---|---|---|---|
price | number | Asking price, or monthly rent on a rental search | |
currency | string | EUR on all three markets | |
pricePerSquareMeter | number | EUR per m² | |
formerPrice | number | Previous asking price when the listing cut it | |
priceDropValue | number | Size of the cut in EUR | |
priceDropPercentage | number | Size of the cut as a percentage | |
communityCosts | number | ✅ | Monthly building or community charges |
isAuction | boolean | ✅ | Sold through an auction |
allowsCounterOffers | boolean | ✅ | Seller accepts offers below asking |
allowsMortgageSimulator | boolean | ✅ | Mortgage simulation offered on the listing |
Size and layout
| Field | Type | Enrich | Description |
|---|---|---|---|
size | number | Built size in m² | |
usableArea | number | ✅ | Usable floor area in m², typically below size |
plotSize | number | ✅ | Land or plot size in m² |
rooms | integer | Room count | |
bathrooms | integer | partly | Rarely published in search results: present on 7 of 30 Madrid listings and on none of the Lisbon or Rome pages checked. Enrich gives a reliable count on every row |
floor | string | Floor as written on the listing, for example 4 or Rés do chão | |
floorDescription | string | ✅ | Translated floor description |
layoutDescription | string | ✅ | Translated layout description |
isTopFloor | boolean | ✅ | Top floor of the building |
Features
| Field | Type | Enrich | Description |
|---|---|---|---|
hasElevator | boolean | Elevator in the building | |
isExterior | boolean | Exterior facing | |
hasParking | boolean | Parking available | |
parkingIncludedInPrice | boolean | Parking included in the asking price | |
hasTerrace | boolean | Terrace | |
hasBalcony | boolean | Balcony | |
hasGarden | boolean | Garden | |
hasPool | boolean | Swimming pool | |
hasAirConditioning | boolean | Air conditioning | |
hasHeating | boolean | Heating | |
hasStorageRoom | boolean | Storage room | |
hasBuiltInWardrobes | boolean | ✅ | Built in wardrobes |
isFurnished | boolean | Furnished | |
isAccessible | boolean | ✅ | Step free or adapted access |
isLuxury | boolean | ✅ | Flagged luxury |
petsAllowed | boolean | ✅ | Pets allowed |
isBankOffer | boolean | ✅ | Sold by a bank |
energyCertification | string | ✅ | Energy rating letter |
characteristicsDescriptions | array | ✅ | Idealista's full structured feature list, grouped by category, in the market's language |
Location
| Field | Type | Enrich | Description |
|---|---|---|---|
municipality | string | City as shown on the search results | |
country | string | es, pt or it | |
address | string | ✅ | Street address as published |
neighborhood | string | ✅ | Neighborhood name |
latitude | number | ✅ | Latitude |
longitude | number | ✅ | Longitude |
administrativeAreaLevel1 | string | ✅ | Region tier, identical shape in all three countries |
administrativeAreaLevel2 | string | ✅ | City or area tier |
administrativeAreaLevel3 | string | ✅ | District tier |
administrativeAreaLevel4 | string | ✅ | Neighborhood tier |
hasHiddenAddress | boolean | ✅ | The seller chose to hide the exact address |
Media
| Field | Type | Enrich | Description |
|---|---|---|---|
thumbnail | string | Main image URL | |
images | array | Image URLs from the listing | |
numPhotos | integer | Photo count | |
has360 | boolean | 360 degree photo available | |
has3DTour | boolean | 3D tour available | |
hasVideo | boolean | Video available | |
hasStaging | boolean | Virtual staging available | |
imagesDetail | array | ✅ | Per image objects: url, tag, localizedName, multimediaId, width, height, aiGenerated, madeByIdealista |
imageTags | array | ✅ | Room tags across the gallery, for example kitchen, terrace |
videoUrl | string | ✅ | Direct link to the listing's video file |
videoThumbnail | string | ✅ | Video poster image |
virtualTourUrl | string | ✅ | Matterport or Floorfy tour link |
Contact and agency
| Field | Type | Enrich | Description |
|---|---|---|---|
isAgency | boolean | Listed by a professional, not a private seller | |
agencyName | string | Agency name | |
agencyUrl | string | Agency profile page on Idealista | |
agencyLogo | string | Agency logo URL | |
agencyAddress | string | ✅ | Agency office street address |
agencyPostalCode | string | ✅ | Agency office postal code |
micrositeShortName | string | ✅ | The agency's Idealista microsite slug |
totalAgencyAds | integer | ✅ | How many listings this agency currently runs |
licenseCode | string | ✅ | The agency's real estate license number, for example Portugal's AMI number |
agentName | string | ✅ | The individual agent handling the listing |
isProAgent | boolean | ✅ | The agent holds a professional account |
contactName | string | ✅ | Name shown on the contact block |
userType | string | ✅ | developer, professional or private |
contactMethod | string | ✅ | How the listing accepts contact |
chatEnabled | boolean | ✅ | In platform chat available |
allowsRemoteVisit | boolean | ✅ | Remote viewing offered |
contactPhone | string | ✅ | Phone number as published |
formattedPhone | string | ✅ | Phone in the market's display format |
formattedPhoneWithPrefix | string | ✅ | Phone in international format, for example +351 218 74 44 25 |
phoneForMobileDialing | string | ✅ | Dial ready phone string |
phonePrefix | string | ✅ | Country dialling prefix |
phone2 | string | ✅ | Second phone line where the agency publishes one |
formattedPhone2 | string | ✅ | Second line, display format |
formattedPhoneWithPrefix2 | string | ✅ | Second line, international format |
phoneForMobileDialing2 | string | ✅ | Second line, dial ready |
phonePrefix2 | string | ✅ | Second line prefix |
corporatePhrase | string | ✅ | The agency's own bio text |
corporateVideoUrl | string | ✅ | The agency's promotional video |
corporateVideoThumbnail | string | ✅ | Poster image for that video |
Agency rows (mode: "agencies")
| Field | Type | Description |
|---|---|---|
agencyId | string | Stable slug for the agency, deduplicated across the whole run |
name | string | Contact name registered by the agency |
commercialName | string | Trading or brand name |
logo | string | Logo URL |
url | string | Idealista profile page |
phone | string | Primary phone in international format |
phones | array | Every phone number published, including a second line where one exists |
address | string | Office street address |
postalCode | string | Office postal code |
city | string | Office city |
country | string | es, pt or it |
totalListings | integer | How many listings from this run belong to this agency |
isProfessional | boolean | Professional account |
hasChatEnabled | boolean | In platform chat available |
propertiesScraped | array | Up to 10 listing IDs from this run that led to this agency |
scrapedAt | string | Extraction time, RFC 3339 UTC |
Idealista does not publish agent or agency email addresses anywhere on its listings or agency profiles, so no run returns one. Phone numbers, office address, profile page and license number are what the platform makes public, and this Actor returns all of them.
🚀 Examples
Get Barcelona apartments for sale
{"location": "barcelona","country": "es","propertyType": "pisos","pages": 10,"maxItems": 300}
Pull the whole Lisbon market, past the 1,800 wall
{"location": "lisboa","country": "pt","pages": 60,"maxItems": 2000}
Scrape a search URL you already built on Idealista
{"searchUrl": "https://www.idealista.com/alquiler-viviendas/madrid-madrid/con-precio-hasta_1200,de-dos-dormitorios/","pages": 20,"maxItems": 500}
Build an agency lead list with license numbers and phones
{"mode": "agencies","location": "madrid","country": "es","pages": 25,"maxItems": 400}
Find large, cheapest first Rome apartments with full detail
{"location": "roma","country": "it","sizeMin": 120,"priceMax": 600000,"rooms": 3,"sortBy": "precio-asc","pages": 20,"maxItems": 400,"enrichDetails": true}
Monitor the newest Valencia rentals every morning
{"searchUrl": "https://www.idealista.com/alquiler-viviendas/valencia-valencia/","sortBy": "fecha-publicacion-desc","pages": 5,"maxItems": 150}
Sweep small Bologna studios to compare entry level pricing
{"location": "bologna","country": "it","sizeMax": 55,"priceMax": 180000,"sortBy": "metros-cuadrados-asc","pages": 60,"maxItems": 2500}
💻 Integrations
Rank neighborhoods by price per square meter
from collections import defaultdictfrom statistics import medianfrom apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("silentflow/idealista-scraper-ppr").call(run_input={"location": "lisboa","country": "pt","pages": 30,"maxItems": 800,"enrichDetails": True,})by_area = defaultdict(list)for item in client.dataset(run["defaultDatasetId"]).iterate_items():ppsm = item.get("pricePerSquareMeter")area = item.get("administrativeAreaLevel3") or item.get("neighborhood")if ppsm and area:by_area[area].append(ppsm)ranked = sorted(((area, median(v), len(v)) for area, v in by_area.items() if len(v) >= 10),key=lambda row: row[1],reverse=True,)for area, price, count in ranked[:15]:print(f"{area:30} {price:8.0f} EUR/m2 ({count} listings)")
Alert on properties that just cut their asking price
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('silentflow/idealista-scraper-ppr').call({location: 'barcelona',country: 'es',sortBy: 'fecha-publicacion-desc',pages: 20,maxItems: 600,});const { items } = await client.dataset(run.defaultDatasetId).listItems();const drops = items.filter((p) => (p.priceDropPercentage ?? 0) >= 5).sort((a, b) => b.priceDropPercentage - a.priceDropPercentage);for (const p of drops) {console.log(`${p.priceDropPercentage}% off ${p.formerPrice} -> ${p.price} EUR ` +`${p.municipality} ${p.size} m2 ${p.url}`);}
Export a qualified agency lead list to CSV
import csvfrom apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("silentflow/idealista-scraper-ppr").call(run_input={"location": "madrid","country": "es","pages": 30,"maxItems": 500,"enrichDetails": True,})seen = set()with open("idealista_agencies.csv", "w", newline="", encoding="utf-8") as fh:writer = csv.writer(fh)writer.writerow(["agency", "agent", "phone", "license", "address", "listings", "profile"])for item in client.dataset(run["defaultDatasetId"]).iterate_items():name = item.get("agencyName")if not name or name in seen:continueseen.add(name)writer.writerow([name,item.get("agentName", ""),item.get("formattedPhoneWithPrefix") or item.get("contactPhone", ""),item.get("licenseCode", ""),item.get("agencyAddress", ""),item.get("totalAgencyAds", ""),item.get("agencyUrl", ""),])
The dataset is also downloadable straight from the Apify Console as JSON, CSV or Excel, and readable programmatically:
https://api.apify.com/v2/datasets/{DATASET_ID}/items?format=csv&token=YOUR_TOKEN
Webhooks and the Apify integrations catalogue push results into Google Sheets, Airtable, Slack, BigQuery, Zapier, Make and n8n without writing code.
📈 Performance
| Metric | Value |
|---|---|
| Markets | Spain (idealista.com), Portugal (idealista.pt), Italy (idealista.it) |
| Properties per search page | About 30 |
| Single search depth on the site | 60 pages, about 1,800 properties |
| Depth with a location search | Past that wall: 2,000 delivered on Lisbon, 2,500 on Bologna |
| Duplicates on those runs | 0 out of 2,000 and 0 out of 2,500, deduplicated on propertyCode |
| Measured run time | 2,000 Lisbon properties in 9 min 29 s, 2,500 Bologna properties in 9 min 2 s |
| Throughput | Roughly 210 to 275 properties per minute with Enrich off |
| Fields per row | About 40 keys on a standard row, 75 on a verified enriched row |
| Item cap accuracy | Exact: maxItems: 2000 delivered exactly 2,000 rows |
| Recent cloud runs | 5 of 5 succeeded |
| Data freshness | Live, read at run time, nothing served from a cache |
💡 Tips for best results
- To break the 1,800 wall, use
location, notsearchUrl. Full market coverage starts when the Actor builds the search itself from a location, and your cap asks for more than one search can deliver: leavemaxItemsat0for everything, or set it above 1,800 for a fixed number. A pastedsearchUrlis scraped exactly as written and stops at the site's own 60 page limit. Setpagesto 60 as well so nothing is left on the table. - Leave Enrich off for market wide sweeps, turn it on for the shortlist. A 2,000 property sweep for price and size analysis does not need per listing contact data. Run the sweep first, filter down to the few hundred listings you care about, then re-run those with
enrichDetailson. Enrich opens each property's own page, so it takes noticeably longer per property, and it is the only way to get agency contacts, license numbers, coordinates, energy rating, usable area, community costs, the four tier location hierarchy and virtual tour links. - Stack filters instead of post-processing.
priceMax,sizeMin,sizeMax,rooms,bathroomsandsortByall apply together in one search on all three markets. Filtering at the source means fewer rows to pay for and no throwaway data to clean up afterwards. - Sort by
fecha-publicacion-descfor daily monitoring. Newest first plus a smallmaxItemsgives you a cheap, fast daily delta instead of re-reading the whole market. Deduplicate against yesterday's export onpropertyCode. - Group on
administrativeAreaLevel1to4, not on the free text labels.municipalityandneighborhoodare written the way each market writes them and do not line up between Spain, Portugal and Italy. The four administrative levels use the same shape everywhere, so build dashboards on those and keep the free text for display. - Know the Italy room filter quirk. On Italian searches, "4 or more rooms" matches properties with 5 or more, because Italy's own filters have no exact match for that value. The run log says so when it happens. Use 3 as the floor if you want to be sure four room properties are included.
propertyTypeapplies to Spain. For Portugal and Italy, encode the property type in asearchUrlcopied from the site, or turn on Enrich and filter on thepropertyTypefield in the output after the run.- Run one search per operation type. Rental and sale searches live at different Idealista paths, so a run covers one or the other. Keep them as separate runs and your rental and sale datasets stay clean.
❓ FAQ
What exactly does this scraper return? One row per property listing: price and price history, size, rooms, floor, features, photo count, and the listing agency on every run, plus coordinates, energy rating, usable area, community costs, the four tier location hierarchy, media details and the full agency contact block when Enrich is on. Switch to agency mode and it returns agency profiles instead: name, commercial name, phones, office address, postal code, city, profile URL and how many listings each one had in the run.
Do I need an Idealista account? No. It reads publicly visible listing pages. No login, no API key, nothing to configure beyond the input form.
Does it cover rentals as well as sales?
Yes. Rental searches (alquiler, arrendar, affitto) and sale searches (venta, comprar, vendita) both work, in all three markets. Each run covers one of the two, so schedule one run per operation type.
Why do most Idealista exports stop at 1,800 properties? Because Idealista serves at most 60 result pages for any single search, and 60 pages times 30 properties is 1,800. That is a limit of the search itself, not of any scraper. This Actor works around it by covering the market in slices when you search by location and ask for more than 1,800 rows. Lisbon delivered 2,000 and Bologna 2,500, with no duplicates in either. Real Lisbon inventory is around 10,000 properties.
Can I get agent or agency email addresses? No, and neither can anyone else from Idealista: the platform does not publish them on listings or on agency profiles. Verified absent on every listing checked. What you do get with Enrich on is the agency name, the phone in international format, a second phone line where one exists, the office address and postal code, the agency profile page, its license number and the individual agent's name.
What does Enrich actually add? Bathroom count, exact coordinates, street address and neighborhood, energy rating, usable area, community costs, condition, property type, the four tier location hierarchy, floor and layout descriptions, the listing headline, per image tags and dimensions, video and virtual tour links, and the full agency contact block including the license number. On a real Lisbon listing it took the row from 45 keys to 75. The trade-off is speed: it opens each property's own page, so a run takes noticeably longer per property.
Why is bathrooms missing on some rows?
Idealista's search results almost never show a bathroom count: it appeared on 7 of 30 Madrid listings and on none of the Lisbon or Rome pages checked. Rather than publish a false 0, the key is left out of the row entirely. Turn on Enrich and every row gets the real count.
Do the filters combine?
Yes, all of them, in one search, on all three markets. sizeMin: 120 plus priceMax: 600000 plus rooms: 3 plus sortBy: precio-asc returns three room properties of at least 120 m² under 600,000 EUR, cheapest first.
How fresh is the data? Live. Every run reads the site at that moment, nothing is served from a cache. For rentals, a daily run makes sense because inventory turns over fast. For sales, weekly is usually enough.
Are the URLs permanent?
url and agencyUrl are stable Idealista links that stay valid as long as the listing or the agency profile is live. propertyCode is Idealista's own ID and is stable across runs, which makes it the right key to deduplicate and to join exports from different days. Image, video and virtual tour URLs point at media hosts and can change when an agency re-uploads its gallery, so download anything you need to archive.
Can I scrape several cities in one run?
Each run covers one search. To cover several cities, schedule several runs, or fire one run per city through the API and merge the datasets afterwards. propertyCode makes merging safe: the same property appearing in two searches deduplicates cleanly.
What if my search returns nothing? The run finishes and says which of the two things happened: the search genuinely matched no properties, or the pages could not be read. It never reports an empty run as a silent success, so you always know whether to change the filters or simply run it again.
Is Idealista the right source for Southern European property data? Yes. Idealista is the largest real estate portal in Spain, Portugal and Italy, and in those markets it is where agencies list first. A single Lisbon search alone covers around 10,000 active listings.
🤖 Copy to your AI assistant
Paste this block into Claude, ChatGPT, or Cursor to give it full context about this scraper:
You have access to the Idealista Scraper on Apify: silentflow/idealista-scraper-pprIt scrapes property listings and real estate agency profiles from Idealista inSpain (idealista.com), Portugal (idealista.pt) and Italy (idealista.it).Input schema:- mode (string, default "properties"): "properties" or "agencies"- searchUrl (string, optional): a full Idealista search URL. When set, everyfilter below is ignored and the search is scraped exactly as written.- location (string, optional): city or region name, e.g. "madrid", "lisboa","roma". Use this rather than searchUrl to get full-market coverage.- country (string, default "es"): "es", "pt" or "it"- propertyType (string, default "viviendas"): viviendas, pisos, casas, aticos,chalets, habitacion, oficinas, locales, garajes, terrenos, trasteros.Applies to Spain searches.- priceMax (integer, optional): maximum price in EUR- sizeMin (integer, optional): minimum size in m2- sizeMax (integer, optional): maximum size in m2- rooms (integer, default 0, range 0-4): minimum room count- bathrooms (integer, default 0, range 0-3): minimum bathroom count- sortBy (string, default ""): "", "precio-asc", "precio-desc","metros-cuadrados-asc", "metros-cuadrados-desc", "fecha-publicacion-desc"- maxItems (integer, default 0): hard cap on rows, 0 means no cap. Exact.- pages (integer, default 1, max 60): search result pages, ~30 properties each- enrichDetails (boolean, default false): opens each property's own page foragency contacts, coordinates, energy rating, usable area, community costs,the 4-tier location hierarchy, virtual tours. Slower.All filters apply together in a single search and all work on es, pt and it.A run covers one operation type: rental and sale searches are separate runs.Coverage note: Idealista serves at most 60 pages (~1,800 properties) for anysingle search. Use location (not searchUrl), and leave maxItems at 0 or set it above 1800, to coverthe market in slices and go past it. Measured: 2,000 rows on a Lisbon search,2,500 on a Bologna search, zero duplicates on either.Output per property. Keys with no value are omitted from the row. About 40keys ship on a standard run; enrichDetails brought a real Lisbon row to 75.Always present (standard run):- propertyCode (string, stable ID and dedup key), url, title, description,scrapedAt (RFC 3339)- price, currency, pricePerSquareMeter, formerPrice, priceDropValue,priceDropPercentage- size, rooms, floor, isNewDevelopment- hasElevator, isExterior, hasParking, parkingIncludedInPrice, hasTerrace,hasBalcony, hasGarden, hasPool, hasAirConditioning, hasHeating,hasStorageRoom, isFurnished- municipality, country- thumbnail, images, numPhotos, has360, has3DTour, hasVideo, hasStaging- isAgency, agencyName, agencyUrl, agencyLogo- bathrooms: rarely published in search results (7/30 on a Madrid page, 0/30on Lisbon and Rome). Reliable only with enrichDetails on.Only with enrichDetails: true:- propertyType, propertySubType, condition, highlightComment,externalReference, locationId, modificationDateText- address, neighborhood, latitude, longitude, hasHiddenAddress,administrativeAreaLevel1..4 (same 4-tier shape in all three countries, usethese for cross-country grouping)- usableArea, plotSize, floorDescription, layoutDescription, isTopFloor- communityCosts, isAuction, allowsCounterOffers, allowsMortgageSimulator- energyCertification, characteristicsDescriptions, hasBuiltInWardrobes,isAccessible, isLuxury, petsAllowed, isBankOffer- imagesDetail, imageTags, videoUrl, videoThumbnail, virtualTourUrl- agencyAddress, agencyPostalCode, micrositeShortName, totalAgencyAds,licenseCode, agentName, isProAgent, contactName, userType, contactMethod,chatEnabled, allowsRemoteVisit, contactPhone, formattedPhone,formattedPhoneWithPrefix, phoneForMobileDialing, phonePrefix, phone2,formattedPhone2, formattedPhoneWithPrefix2, phoneForMobileDialing2,phonePrefix2, corporatePhrase, corporateVideoUrl, corporateVideoThumbnailOutput per agency (mode "agencies"): agencyId, name, commercialName, logo,url, phone, phones, address, postalCode, city, country, totalListings(listings from this run), isProfessional, hasChatEnabled, propertiesScraped,scrapedAtIdealista does not publish email addresses for agents or agencies, so no runreturns one. Phone, office address, profile page and licenseCode are thecontact data available.Use apify-client for Python or JavaScript.
⚖️ Legal
This Actor extracts publicly available data from Idealista. It does not bypass any login, paywall, or CAPTCHA, and it reads only what Idealista shows to any visitor. Users are responsible for complying with Idealista's terms of service and with applicable data protection laws (GDPR in the European Union, CCPA in California, and PIPL where relevant). Property listings and agency profiles can contain personal data, including the name of an individual agent, a contact name, and a phone number, so treat exported rows accordingly: keep a lawful basis for processing, honour deletion requests, and respect the rules on unsolicited outreach in the market you operate in. The data returned reflects what was published at run time and is informational; verify it against the source before using it in valuations, lending decisions, or any other regulated use case.
📬 Support
Need something this scraper does not do yet? We ship features fast.
- Feature requests go straight to our backlog
- Enterprise needs? We do custom integrations and high-volume plans
- Pricing questions? Check the Monetization tab on the actor page
Response time: usually under 24 hours.
Check out our other scrapers: silentflow on Apify