Real estate
Idealista Scraper: Export Listings from Spain, Italy, Portugal
Scrape Idealista property listings in Spain, Italy, Portugal and France: prices, size, rooms, coordinates, photos. No-code steps, JSON input and API examples.
Real estate
Scrape Idealista property listings in Spain, Italy, Portugal and France: prices, size, rooms, coordinates, photos. No-code steps, JSON input and API examples.
Idealista is the main property portal in Spain, Italy and Portugal, and it also covers France. If you need asking prices, price per square metre or inventory counts for a city or neighbourhood, the listings are the best public source available. You can’t download them from the site, though.
This tutorial shows how to export Idealista listings into JSON, CSV or Excel with the Idealista Scraper on Apify, either from a search URL you’ve already set up or from a city name, and how to automate it with the API.
Each property becomes one record. With includeDetails on, you get:
id, propertyCode, urlcountry (es, it, pt, fr), operation (sale or rent), propertyTypeprice, currency, size (m²), rooms, bathroomsaddress, municipality, province, latitude, longitudedescription, thumbnail, multimedia.images (when includeMultimedia is on)features such as hasTerrace, hasSwimmingPool, hasAirConditioning, hasGardensourceUrl, scrapedAt, statusExample record (trimmed):
{
"id": "35585970",
"url": "https://www.idealista.it/immobile/35585970/",
"country": "it",
"operation": "sale",
"propertyType": "chalet",
"price": 37000,
"currency": "EUR",
"size": 172,
"rooms": 6,
"bathrooms": 2,
"address": "Detached house in Località Scabbiabella, 24, Torriglia",
"municipality": "Torriglia",
"province": "Genova",
"latitude": 44.5184183,
"longitude": 9.1172171,
"features": { "hasTerrace": true, "hasSwimmingPool": false, "hasGarden": false },
"sourceUrl": "https://www.idealista.it/en/vendita-case/genova-provincia/",
"scrapedAt": "2026-07-11T14:14:42.211Z",
"status": "success"
}
Not every listing fills every field. Coordinates and bathroom counts, for example, depend on what the advertiser entered.
Set up your search on Idealista first, then copy the URL. All the filters you chose (area, price, rooms, features) carry over.
{
"startUrls": [
{ "url": "https://www.idealista.it/vendita-case/genova-provincia/" }
],
"maxResults": 100,
"includeDetails": true,
"includeMultimedia": false
}
The country and language are detected from the URL, so a Spanish and an Italian search can go in the same run. maxResults applies to each URL, and pagination is handled for you.
If you don’t have a URL, describe the search instead:
{
"country": "es",
"operation": "rent",
"propertyType": "homes",
"locationQuery": "Valencia",
"locationSelectionMode": "best",
"minPrice": 800,
"maxPrice": 1500,
"minRooms": 2,
"elevator": true,
"maxResults": 200,
"includeDetails": true
}
Valid values:
| Input | Options |
|---|---|
country |
es, it, pt, fr |
operation |
sale, rent |
propertyType |
homes, offices, premises, garages, lands, buildings, rooms, newDevelopments |
locationSelectionMode |
best, all, exact |
You can also filter by minSize/maxSize (m²), maxRooms, minBathrooms, and with boolean flags: hasPhotos, hasPlan, exterior, elevator, airConditioning, garage, heating, accessible and security. If a place name matches several Idealista areas, use locationSelectionMode: "all" to cover them all, or exact to keep only the exact name.
includeDetails: richer records from each property page. Slower, but it’s what you want for analysis.includeMultimedia: the full photo set. Leave it off unless you need images, since search results already include a thumbnail.includeRecommendations: similar properties suggested by Idealista, useful for finding comparables.You can leave the advanced settings (itemsPerPage, searchConcurrency, maxRetries) at their defaults. The actor uses Apify Residential Proxy matched to the listing country by default.
cURL, returning the results in a single request:
curl -X POST \
"https://api.apify.com/v2/acts/epicscrapers~idealista-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN&format=csv" \
-H "Content-Type: application/json" \
-d '{"country":"pt","operation":"sale","propertyType":"homes","locationQuery":"Lisboa","maxResults":100,"includeDetails":true}'
Python, computing the median price per m² by municipality:
import os
import pandas as pd
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("epicscrapers/idealista-scraper").call(run_input={
"startUrls": [{"url": "https://www.idealista.com/venta-viviendas/madrid-madrid/"}],
"maxResults": 500,
"includeDetails": True,
})
df = pd.DataFrame(client.dataset(run["defaultDatasetId"]).iterate_items())
df = df[df["status"] == "success"].dropna(subset=["price", "size"])
df["eur_per_m2"] = df["price"] / df["size"]
print(df.groupby("municipality")["eur_per_m2"].median().sort_values())
For larger jobs, start the run asynchronously and read defaultDatasetId when it finishes.
Save a working input as an Apify task and schedule it daily or weekly. Every record has a stable id and a scrapedAt timestamp, so comparing two runs is straightforward:
id with a different price.Send the dataset to Google Sheets, a database or Make/Zapier through Apify integrations, or trigger a webhook when each run finishes.
latitude/longitude) and valuation models.Working across more markets? See the Rightmove scraper guide for the UK and the Subito scraper guide for Italian classifieds.
Idealista runs a developer API, but access is by application and comes with tight limits. It’s mainly aimed at partners. For most research and monitoring, exporting the public listings is faster.
Collecting publicly listed property data for analysis is common practice. Respect Idealista’s terms, keep request volumes reasonable, and handle any personal data (such as agent or advertiser contact details) according to GDPR. This isn’t legal advice.
Yes. Use a rental search URL, or set operation to rent. For room lets, use propertyType: "rooms".
As many as the search returns, up to the maxResults you set per URL or location. Start with 100 to check cost and output, then increase it. See the Pricing tab on the actor page for current rates.
Yes. Every run’s dataset can be downloaded as CSV, Excel, JSON or XML.
Copy a filtered Idealista search URL, paste it in, and you’ll have a spreadsheet of listings in a few minutes. Run the Idealista Scraper on Apify.