Idealista Scraper avatar

Idealista Scraper

Pricing

from $0.30 / 1,000 results

Go to Apify Store
Idealista Scraper

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

SilentFlow

Maintained by Community

Actor stats

5

Bookmarked

79

Total users

2

Monthly active users

21 days ago

Last modified

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.

  1. Choose Spain, Portugal or Italy, then type a location (barcelona, lisboa, roma) or paste an Idealista search URL.
  2. Add the filters you care about: maximum price, minimum and maximum size, rooms, bathrooms, sort order.
  3. 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.

How it works

✨ 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 number 19544). 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: administrativeAreaLevel1 through administrativeAreaLevel4, for example Lisboa, Lisboa then Campo de Ourique then Centro, and Quartiere Ostia Ponente on 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, priceDropValue and priceDropPercentage come 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 propertyCode across 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

TeamWhat they build
Real estate investmentRank 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 productPower a comparables widget with live inventory: size, rooms, bathrooms, floor, energy rating and coordinates for every active listing in a city
Market researchTrack 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 genBuild a qualified agency list with agencyName, licenseCode, agencyAddress, international format phone and totalAgencyAds to size each agency before the first call
Mortgage and lendingFeed a valuation model with asking price, built size, usable area, community costs, condition and energy certification for thousands of comparable properties
Relocation and mobilityCompare rental inventory in Madrid, Barcelona and Valencia by budget and rooms, with furnished, pets allowed and parking flags on each listing
Data scienceTrain price models on tens of thousands of rows with coordinates, structured characteristics and price history instead of a scraped HTML dump
Housing journalismQuantify 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 operatorsFind 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

ParameterTypeDefaultDescription
modestringpropertiesproperties for listings, agencies for real estate agency profiles
ParameterTypeDefaultDescription
searchUrlstringemptyPaste a full Idealista search URL. When set, every filter below is ignored
locationstringemptyCity or region name: madrid, barcelona, valencia, lisboa, roma. Use this instead of searchUrl to go past the 1,800 wall
countrystringeses for idealista.com, pt for idealista.pt, it for idealista.it
propertyTypestringviviendasviviendas (all homes), pisos, casas, aticos, chalets, habitacion, oficinas, locales, garajes, terrenos, trasteros. Applies to Spain searches
priceMaxintegernoneMaximum price in EUR
sizeMinintegernoneMinimum size in m²
sizeMaxintegernoneMaximum size in m²
roomsinteger0Minimum room count, 0 to 4
bathroomsinteger0Minimum bathroom count, 0 to 3
sortBystringrelevanceprecio-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

ParameterTypeDefaultDescription
maxItemsinteger0Hard cap on rows delivered. 0 means no cap, and an uncapped run covers the full market
pagesinteger1Search result pages to read, about 30 properties each. Idealista serves at most 60 pages per search
enrichDetailsbooleanfalseOpens 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

FieldTypeEnrichDescription
propertyCodestringIdealista's own listing ID, stable across runs, the deduplication key
urlstringPermanent link to the listing
externalReferencestringThe agency's own internal reference for the property
locationIdstringIdealista's internal location identifier
modificationDateTextstringHuman readable last update, for example Anúncio atualizado há um mês
scrapedAtstringExtraction time, RFC 3339 UTC

Listing

FieldTypeEnrichDescription
titlestringListing headline
descriptionstringFree text description as published
highlightCommentstringThe agency's own one line pitch for the property
propertyTypestringflat, house, penthouse, villa, room, land, office, commercial, garage
propertySubTypestringFiner classification where Idealista publishes one
conditionstringIdealista's own status label: good, renew, new
isNewDevelopmentbooleanFlagged as new construction on the listing

Price

FieldTypeEnrichDescription
pricenumberAsking price, or monthly rent on a rental search
currencystringEUR on all three markets
pricePerSquareMeternumberEUR per m²
formerPricenumberPrevious asking price when the listing cut it
priceDropValuenumberSize of the cut in EUR
priceDropPercentagenumberSize of the cut as a percentage
communityCostsnumberMonthly building or community charges
isAuctionbooleanSold through an auction
allowsCounterOffersbooleanSeller accepts offers below asking
allowsMortgageSimulatorbooleanMortgage simulation offered on the listing

Size and layout

FieldTypeEnrichDescription
sizenumberBuilt size in m²
usableAreanumberUsable floor area in m², typically below size
plotSizenumberLand or plot size in m²
roomsintegerRoom count
bathroomsintegerpartlyRarely 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
floorstringFloor as written on the listing, for example 4 or Rés do chão
floorDescriptionstringTranslated floor description
layoutDescriptionstringTranslated layout description
isTopFloorbooleanTop floor of the building

Features

FieldTypeEnrichDescription
hasElevatorbooleanElevator in the building
isExteriorbooleanExterior facing
hasParkingbooleanParking available
parkingIncludedInPricebooleanParking included in the asking price
hasTerracebooleanTerrace
hasBalconybooleanBalcony
hasGardenbooleanGarden
hasPoolbooleanSwimming pool
hasAirConditioningbooleanAir conditioning
hasHeatingbooleanHeating
hasStorageRoombooleanStorage room
hasBuiltInWardrobesbooleanBuilt in wardrobes
isFurnishedbooleanFurnished
isAccessiblebooleanStep free or adapted access
isLuxurybooleanFlagged luxury
petsAllowedbooleanPets allowed
isBankOfferbooleanSold by a bank
energyCertificationstringEnergy rating letter
characteristicsDescriptionsarrayIdealista's full structured feature list, grouped by category, in the market's language

Location

FieldTypeEnrichDescription
municipalitystringCity as shown on the search results
countrystringes, pt or it
addressstringStreet address as published
neighborhoodstringNeighborhood name
latitudenumberLatitude
longitudenumberLongitude
administrativeAreaLevel1stringRegion tier, identical shape in all three countries
administrativeAreaLevel2stringCity or area tier
administrativeAreaLevel3stringDistrict tier
administrativeAreaLevel4stringNeighborhood tier
hasHiddenAddressbooleanThe seller chose to hide the exact address

Media

FieldTypeEnrichDescription
thumbnailstringMain image URL
imagesarrayImage URLs from the listing
numPhotosintegerPhoto count
has360boolean360 degree photo available
has3DTourboolean3D tour available
hasVideobooleanVideo available
hasStagingbooleanVirtual staging available
imagesDetailarrayPer image objects: url, tag, localizedName, multimediaId, width, height, aiGenerated, madeByIdealista
imageTagsarrayRoom tags across the gallery, for example kitchen, terrace
videoUrlstringDirect link to the listing's video file
videoThumbnailstringVideo poster image
virtualTourUrlstringMatterport or Floorfy tour link

Contact and agency

FieldTypeEnrichDescription
isAgencybooleanListed by a professional, not a private seller
agencyNamestringAgency name
agencyUrlstringAgency profile page on Idealista
agencyLogostringAgency logo URL
agencyAddressstringAgency office street address
agencyPostalCodestringAgency office postal code
micrositeShortNamestringThe agency's Idealista microsite slug
totalAgencyAdsintegerHow many listings this agency currently runs
licenseCodestringThe agency's real estate license number, for example Portugal's AMI number
agentNamestringThe individual agent handling the listing
isProAgentbooleanThe agent holds a professional account
contactNamestringName shown on the contact block
userTypestringdeveloper, professional or private
contactMethodstringHow the listing accepts contact
chatEnabledbooleanIn platform chat available
allowsRemoteVisitbooleanRemote viewing offered
contactPhonestringPhone number as published
formattedPhonestringPhone in the market's display format
formattedPhoneWithPrefixstringPhone in international format, for example +351 218 74 44 25
phoneForMobileDialingstringDial ready phone string
phonePrefixstringCountry dialling prefix
phone2stringSecond phone line where the agency publishes one
formattedPhone2stringSecond line, display format
formattedPhoneWithPrefix2stringSecond line, international format
phoneForMobileDialing2stringSecond line, dial ready
phonePrefix2stringSecond line prefix
corporatePhrasestringThe agency's own bio text
corporateVideoUrlstringThe agency's promotional video
corporateVideoThumbnailstringPoster image for that video

Agency rows (mode: "agencies")

FieldTypeDescription
agencyIdstringStable slug for the agency, deduplicated across the whole run
namestringContact name registered by the agency
commercialNamestringTrading or brand name
logostringLogo URL
urlstringIdealista profile page
phonestringPrimary phone in international format
phonesarrayEvery phone number published, including a second line where one exists
addressstringOffice street address
postalCodestringOffice postal code
citystringOffice city
countrystringes, pt or it
totalListingsintegerHow many listings from this run belong to this agency
isProfessionalbooleanProfessional account
hasChatEnabledbooleanIn platform chat available
propertiesScrapedarrayUp to 10 listing IDs from this run that led to this agency
scrapedAtstringExtraction 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 defaultdict
from statistics import median
from apify_client import ApifyClient
client = 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 csv
from apify_client import ApifyClient
client = 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:
continue
seen.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

MetricValue
MarketsSpain (idealista.com), Portugal (idealista.pt), Italy (idealista.it)
Properties per search pageAbout 30
Single search depth on the site60 pages, about 1,800 properties
Depth with a location searchPast that wall: 2,000 delivered on Lisbon, 2,500 on Bologna
Duplicates on those runs0 out of 2,000 and 0 out of 2,500, deduplicated on propertyCode
Measured run time2,000 Lisbon properties in 9 min 29 s, 2,500 Bologna properties in 9 min 2 s
ThroughputRoughly 210 to 275 properties per minute with Enrich off
Fields per rowAbout 40 keys on a standard row, 75 on a verified enriched row
Item cap accuracyExact: maxItems: 2000 delivered exactly 2,000 rows
Recent cloud runs5 of 5 succeeded
Data freshnessLive, read at run time, nothing served from a cache

💡 Tips for best results

  • To break the 1,800 wall, use location, not searchUrl. 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: leave maxItems at 0 for everything, or set it above 1,800 for a fixed number. A pasted searchUrl is scraped exactly as written and stops at the site's own 60 page limit. Set pages to 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 enrichDetails on. 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, bathrooms and sortBy all 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-desc for daily monitoring. Newest first plus a small maxItems gives you a cheap, fast daily delta instead of re-reading the whole market. Deduplicate against yesterday's export on propertyCode.
  • Group on administrativeAreaLevel1 to 4, not on the free text labels. municipality and neighborhood are 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.
  • propertyType applies to Spain. For Portugal and Italy, encode the property type in a searchUrl copied from the site, or turn on Enrich and filter on the propertyType field 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-ppr
It scrapes property listings and real estate agency profiles from Idealista in
Spain (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, every
filter 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 for
agency 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 any
single search. Use location (not searchUrl), and leave maxItems at 0 or set it above 1800, to cover
the 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 40
keys 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/30
on 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, use
these 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, corporateVideoThumbnail
Output per agency (mode "agencies"): agencyId, name, commercialName, logo,
url, phone, phones, address, postalCode, city, country, totalListings
(listings from this run), isProfessional, hasChatEnabled, propertiesScraped,
scrapedAt
Idealista does not publish email addresses for agents or agencies, so no run
returns one. Phone, office address, profile page and licenseCode are the
contact data available.
Use apify-client for Python or JavaScript.

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