Idealista Scraper - Any URL, Spain Portugal Italy
Pricing
from $0.40 / 1,000 listing scrapeds
Idealista Scraper - Any URL, Spain Portugal Italy
Scrape Idealista property listings in Spain (idealista.com), Portugal (idealista.pt) and Italy (idealista.it) from any search URL, filters and sort order respected. Price, price drops, size, rooms, floor, agency, photos, description, energy class, coordinates. From $0.40 per 1,000. JSON, CSV, API.
Pricing
from $0.40 / 1,000 listing scrapeds
Rating
0.0
(0)
Developer
Amit Aviv
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
2
Monthly active users
3 days ago
Last modified
Categories
Share
Idealista Scraper turns any idealista.com (Spain), idealista.pt (Portugal) or idealista.it (Italy) search URL into structured property data: price, price drops, size, rooms, floor, agency and photos for every listing the website shows. Turn on full details to add the description, all features, the energy certificate, map coordinates and every photo. No proxy setup, no cookies, no login; you pay per listing delivered.
What does Idealista Scraper do?
You search on idealista as usual, copy the URL of the results page, and paste it in. The scraper reads the same pages a visitor sees, so the filters and sort order in your URL are respected. Idealista shows at most 1,800 listings per search; ask for more and the scraper reads the search as several price bands to get past that (see Searches with more than 1,800 results).
It works with sale and rent searches, and accepts individual property URLs too.
What data can you extract from Idealista?
Every listing is one record. Search results alone give 36 fields:
| Group | Fields |
|---|---|
| Identity | id, url, title, site, country |
| Price | price, priceText, currency, pricePerM2, previousPrice, priceDropPercent |
| Property | rooms, sizeM2, floor, floorText, hasElevator, isExterior, parkingIncluded, detailsText, description (short card text), tags, isNewDevelopment |
| Advertiser | isProfessional, agencyName, agencyUrl |
| Media | imageUrl, images, imageCount, hasFloorPlan, has3DTour, hasVideo |
| Other | isFeatured, onlineBooking, searchUrl, page, scrapedAt |
previousPrice and priceDropPercent are filled whenever idealista shows a lowered price on the results card, at no extra cost. In a 90-listing Madrid test run, 26 listings carried a price drop. A card with an extra characteristic that fits none of these fields (for example "Garaje incluido") also carries otherFeatures, a list of those texts.
With Fetch full property details (or for property URLs) each record also gets:
| Group | Fields |
|---|---|
| Text | description (full text), reference, updatedText |
| Location | location (neighbourhood, city), latitude, longitude, addressVisibility |
| Characteristics | typology, operation, bathrooms, builtYear, features (grouped under idealista's own headings), featureList (flat) |
| Energy | energyClass, energyClassCode, energyConsumption, energyEmissions |
| Advertiser | advertiserName, advertiserUrl, advertiserType (private or professional; on search results it follows the card's isProfessional flag: 14 of 40 were private in a Lisbon rental test run on 2026-10-11). For private advertisers the name is withheld by default, see below |
| Media | images (all full-size photos), imageLabels (living room, kitchen...), floorPlans |
| Status | detailFetched, isBlocked (false on saved records), and detailError when a property page could not be read |
Private advertisers. When a listing is published by a private individual and not by an agency, advertiserName and advertiserUrl are null and the record carries "privateDataRedacted": true. Everything about the property itself, including its address and coordinates, is unchanged, and agencies are always returned in full. In a test run on 2026-10-13 with a Valladolid rental search and two property URLs, 14 of 32 detailed records were from private advertisers and redacted; the 18 from agencies were unchanged. To receive the names, turn on Include names of private advertisers; by doing so you confirm that you have a lawful basis under the GDPR for processing them. Free-text descriptions are never altered.
Coordinates. latitude and longitude are filled on detailed records only; search rows without details have none. In test runs on 2026-10-11 they were present on 30 of 30 Spanish, 300 of 300 Portuguese and 9 of 10 Italian detailed listings. addressVisibility says what they mean: EXACT is the address the advertiser published; HIDDEN is idealista's approximate map point, not the real address. Most listings are HIDDEN (27 of 30 in the Spanish run).
How to scrape Idealista
- Search on idealista.com, idealista.pt or idealista.it with the filters you want.
- Copy the URL of the results list, for example:
https://www.idealista.com/venta-viviendas/madrid-madrid/con-precio-hasta_300000,de-dos-dormitorios/https://www.idealista.pt/arrendar-casas/lisboa/com-preco-max_1500/https://www.idealista.it/vendita-case/milano-milano/
- Paste one or more URLs into Idealista search URLs, set Max listings per search URL, and start the run.
- Download the results from the Output tab as JSON, CSV, Excel or XML, or read them through the API.
For specific properties, paste URLs such as https://www.idealista.com/inmueble/112110910/, https://www.idealista.pt/imovel/35081413/ or https://www.idealista.it/immobile/35555810/ into Individual property URLs.
A listing is saved and charged once per run, however many searches return it.
Searches with more than 1,800 results
Idealista shows 60 pages, 1,800 listings, per search and no more. Set maxItemsPerSearch above 1,800 and the scraper checks the total of each search: when it is larger, the search is read as several price bands that each fit, and every listing is saved once.
- Your own filters stay in place, including a price range in the URL. In a test on 2026-10-13 the search
.../granada-granada/con-precio-hasta_300000/listed 2,052 results; the run read two bands (up to 229,000 EUR: 1,072; above: 980) and saved 2,049 unique listings in under 3 minutes. - Bands are read from the lowest price up, so when
maxItemsPerSearchis below the total you get the cheapest listings first. Within a split search the sort order of your URL is not kept. In a second test, a Lisbon search listing 10,531 results withmaxItemsPerSearch1,900 returned exactly 1,900 unique listings from the two cheapest bands and reported the search as not complete. - The status message and the
splitSearchesentry ofOUTPUT_SUMMARYsay how many price bands were read, how many listings idealista reported for the search (listedByIdealista) and for the bands together (listedInPriceBands), how many were saved and whether the search was read completely. Expect the saved count to differ slightly from idealista's total, in either direction: listings appear and disappear while the pages are read. - A listing that is in no price band, for example one without a price, cannot be reached this way. When the bands together hold clearly fewer listings than the search (more than 1% and more than 5 listings), the run reports the search as not complete. In the two live tests the bands added up to the search total exactly.
- A band that still has more than 1,800 listings at a single price cannot be split; its first 1,800 are saved and the run reports it as not complete. A search is split into at most 200 bands.
- Turn Split searches with more than 1,800 results off to get the first 1,800 listings in the order of your URL. With
maxItemsPerSearchat 1,800 or less nothing is split. - Large jobs need time: about 2.5 to 3 seconds per results page of 30 listings (the 2,049 listings above took 170 to 205 seconds across test runs), plus the time for details if you turn them on. The largest split job tested is those 2,049 listings without details.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
searchUrls | array of strings | none | Search result URLs from any of the three sites. |
maxItemsPerSearch | integer, 1-100000 | 60 | Listings to save per search URL (30 per page). Counts listings actually saved: ones already delivered earlier in the same run do not use up the limit. Above 1,800 a larger search is split into price bands. |
fetchDetails | boolean | false | Also opens every property page. Adds one detail event per listing and about 1.5-2.5 seconds each. |
propertyUrls | array of strings | empty | Property pages to scrape directly, always with full details. |
splitLargeSearches | boolean | true | Only when maxItemsPerSearch is above 1,800: read a search with more results as several price bands. |
includePrivateSellerData | boolean | false | Deliver advertiserName of private individuals. You confirm a lawful basis under the GDPR for processing them. |
debug | boolean | false | Saves blocked pages plus the first results page and property page to the key-value store as raw HTML, and logs more. A private advertiser's property page is not saved unless includePrivateSellerData is on. |
Accepted URL forms: with or without https:// and www, m.idealista.* mobile links, links with tracking parameters or trailing punctuation from copy-paste, and translated pages such as /en/. URLs are routed by what they are, so a property URL pasted into searchUrls is scraped as a property and the other way round. The same search given twice is run once.
{"searchUrls": ["https://www.idealista.com/venta-viviendas/madrid-madrid/con-precio-hasta_200000/"],"maxItemsPerSearch": 30,"fetchDetails": true}
Output example
A real record from a run of the input above on 2026-10-11 (description and arrays shortened):
{"id": 112110910,"url": "https://www.idealista.com/inmueble/112110910/","title": "Estudio en venta en Calle del Amparo","price": 175000,"priceText": "175.000 €","currency": "EUR","pricePerM2": 6731,"previousPrice": 185000,"priceDropPercent": 5,"rooms": null,"sizeM2": 26,"floorText": "2ª planta interior sin ascensor","floor": 2,"hasElevator": false,"isExterior": false,"parkingIncluded": false,"detailsText": ["26 m²", "2ª planta interior sin ascensor"],"description": "Oportunidad en el Corazón de Lavapiés ... este acogedor estudio ubicado en el vibrante barrio de Lavapiés – Embajadores, en pleno centro de Madrid. ...","tags": [],"isProfessional": true,"agencyName": "Estudio Las Ciudades","agencyUrl": "https://www.idealista.com/pro/p00012820/","isFeatured": true,"isNewDevelopment": false,"hasFloorPlan": true,"has3DTour": false,"hasVideo": true,"onlineBooking": false,"imageCount": 20,"imageUrl": "https://img4.idealista.com/blur/WEB_DETAIL/0/id.pro.es.image.master/91/68/76/1459109923.jpg","images": ["https://img4.idealista.com/blur/WEB_DETAIL/0/id.pro.es.image.master/91/68/76/1459109923.jpg", "... 18 more"],"location": "Lavapiés-Embajadores, Madrid","typology": "home","operation": "sale","bathrooms": 1,"builtYear": 1905,"energyClass": "F","energyClassCode": "f","energyConsumption": "Consumo: 325 kWh/m² año","energyEmissions": "Emisiones: 55 kg CO2/m² año","features": {"Características básicas": ["26 m² construidos", "Sin habitación", "1 baño", "Segunda mano/buen estado", "Armarios empotrados", "Construido en 1905", "Calefacción individual: Bomba de frío/calor"],"Edificio": ["2ª planta interior", "Sin ascensor"],"Equipamiento": ["Aire acondicionado"],"Certificado energético": ["Consumo: 325 kWh/m² año", "Emisiones: 55 kg CO2/m² año"]},"featureList": ["26 m² construidos", "Sin habitación", "1 baño", "... 9 more"],"reference": "112110910","advertiserName": "Estudio Las Ciudades","advertiserUrl": "https://www.idealista.com/pro/p00012820/","advertiserType": "professional","latitude": 40.4116562,"longitude": -3.7033518,"addressVisibility": "HIDDEN","updatedText": "Anuncio actualizado el 8 de octubre","floorPlans": ["https://img4.idealista.com/blur/WEB_DETAIL/0/id.pro.es.image.master/00/bc/48/1481732837.jpg"],"imageLabels": ["Salón", "Salón", "Salón", "Salón", "Salón", "Vistas", "... 14 more"],"isBlocked": false,"detailFetched": true,"site": "idealista.com","country": "ES","searchUrl": "https://www.idealista.com/venta-viviendas/madrid-madrid/con-precio-hasta_200000/","page": 1,"scrapedAt": "2026-10-11T13:15:00.646Z"}
rooms is null here because the listing is a studio ("Sin habitación"). Texts stay in the language of the page.
How much does it cost to scrape Idealista?
Pay per event, no subscription. Compute and proxy are included in the event price. From 27 October 2026 each run also pays Apify's standard Actor start event, charged once per GB of run memory: at the default 2 GB that is $0.0084 per run on Free, $0.007 on Bronze, $0.0064 on Silver and $0.0056 on Gold and above. Until then there is no start fee. Put several search URLs in one run to pay it once.
| Event | Free plan | Bronze | Silver | Gold and above |
|---|---|---|---|---|
| Listing: one property saved | $0.60 / 1,000 | $0.50 / 1,000 | $0.45 / 1,000 | $0.40 / 1,000 |
| Detail: extra, when the property page is read | +$1.20 / 1,000 | +$1.00 / 1,000 | +$0.90 / 1,000 | +$0.80 / 1,000 |
Worked example on Bronze: 1,000 listings from search results cost $0.50; the same 1,000 with full details cost $0.50 + $1.00 = $1.50. A daily check of the 90 newest listings in a city costs about $0.045 per run, about $0.052 once the start fee applies.
Free-plan users pay a slightly higher price per event and get the same limits. Apify's free plan includes $5 of monthly credit, enough for about 8,000 listings without details or about 2,700 with details.
Listing and detail events are charged only for records that reach the dataset; from 27 October 2026 the start fee applies to every run, whatever it delivers. Failed pages, offline property URLs, empty searches and duplicates within a run are not charged. A listing whose property page could not be read is saved from the search card with a detailError and charged as a listing only.
Reliability and failure behaviour
Idealista is protected by DataDome and blocks a share of new browser sessions; on the test day about half of new sessions on idealista.com were blocked. The scraper replaces a blocked session automatically, and the status message during the run and the OUTPUT_SUMMARY record tell you how many were replaced. What the final status means:
- SUCCEEDED, "Scraped N listing(s)...": data was delivered. If some inputs failed, the message counts them and quotes the first error, so a partly failed run is still SUCCEEDED with partial results.
- SUCCEEDED, "No listings: ...": the search has no results on idealista right now, or all the property URLs you gave are no longer online. Nothing is charged.
- FAILED, "Failed: ...": nothing could be scraped and nothing was charged, for example unusable input (fails within seconds), a URL idealista rejects, or six blocked sessions in a row. Run it again after a few minutes.
Other guarantees:
- Maximum charge respected. If you set a maximum total charge for the run, the scraper stops when it is reached and does no work beyond what the limit pays for.
- Clean stop before the timeout. Shortly before the run timeout (a fifth of the timeout, at most a minute, at least 5 seconds) it stops, keeps and charges what was collected, and says so. The first results page of every search is fetched even when the timeout is very short, so a run with a 30- or 60-second timeout still returns listings.
- Nothing lost on a block. Detailed records are saved in batches of 10 as they are fetched; the next session continues with the rest.
- Run report. Every run writes an
OUTPUT_SUMMARYrecord to the key-value store: listings saved, events charged, sessions used and blocked, failed and empty searches, offline property URLs, rejected inputs and the stop reason; for split searches also the price bands read (splitSearches).
Limits
- 1,800 listings per search (60 pages) is what idealista shows. Larger searches are split into price bands when
maxItemsPerSearchis above 1,800; see Searches with more than 1,800 results. - No phone numbers or emails. Idealista shows phone numbers only after a click on its contact button; this scraper does not request them and never logs in.
- Details take time: about 1.5-2.5 seconds per listing, roughly 1,000-1,500 per hour. A full 1,800-listing search with details needs a run timeout above the default hour. The largest job tested is 300 detailed listings in one run; without details, 2,049 listings.
- Newest-first sorting on idealista.com (
?ordenado-por=fecha-publicacion-desc) works, but idealista serves it only after a stricter anti-bot check, so it takes about 10 seconds longer and can fail when the check is refused repeatedly. The filterscon-publicado_ultimas-24-horasandcon-publicado_ultimas-48-horasare the lighter alternative. - Map-view URLs (
/mapa) are not supported; use the list-view URL. - Translated pages: the core fields are parsed on
/en/pages of all three sites and on/ca/,/fr/and/de/pages of idealista.com. Other languages are accepted, butrooms,floor,hasElevatorandbathroomsmay be empty. - New developments: Spanish project pages (
/obra-nueva/<id>/) work as property URLs but have no single price, sopriceisnull. Portuguese and Italian project pages are untested. - Memory: 2,048 MB is the supported default. 1,024 MB works for small runs but is tight for long detail jobs.
- A URL pointing at a later results page (
pagina-3,lista-3) is collected from that page onwards. An unknown filter or sort value (HTTP 400) or a wrong location (HTTP 404) fails that search at once.
Integrations and API
The scraper is a standard Apify Actor, so everything the platform offers applies:
curl -X POST "https://api.apify.com/v2/acts/amitaviv~idealista-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"searchUrls": ["https://www.idealista.com/venta-viviendas/madrid-madrid/"], "maxItemsPerSearch": 60}'
- API and clients: start runs and read datasets over REST or with the JavaScript and Python clients; ready-made snippets are in the API tab.
- Schedules: run a saved input hourly or daily from Apify Console.
- Webhooks: call your endpoint when a run succeeds or fails.
- Make, n8n, Zapier, Google Sheets, Slack and others through Apify's standard integrations.
- AI agents can call the scraper through the Apify MCP server.
FAQ
Can I monitor new listings every day?
Yes. Save a search URL with a recent-listings filter or newest-first sort, schedule the run, and compare id values with what you already have. Every run returns and charges the listings currently on the page.
Why did I get fewer listings than idealista's total?
Idealista serves at most 60 pages per search, and maxItemsPerSearch defaults to 60. Raise the limit; above 1,800 the scraper splits a larger search into price bands by itself.
Does it return phone numbers or owner contact details?
No. There are no phone or email fields, and the name of a private advertiser is withheld unless you turn on Include names of private advertisers. Descriptions are free text written by advertisers and may contain contact details.
Are the coordinates exact?
Only when addressVisibility is EXACT. With HIDDEN, the advertiser chose not to publish the address and the coordinates are idealista's approximate map point.
What if a run is blocked?
Blocked sessions are replaced automatically and you are not charged for them. A run in which every session was blocked ends FAILED with no listing charged; retry after a few minutes.
Can I mix countries and URL types in one run?
Yes. Searches for the same country share one browser session and run one after another; property URLs can be added in the same run.
Legal and responsible use
This is an independent tool, not affiliated with, endorsed by or sponsored by idealista. All trademarks belong to their owners.
The scraper never logs in and has no dedicated phone or email fields. Privacy by default: names of private advertisers (individuals, not agencies) are not delivered; such records have advertiserName and advertiserUrl set to null and "privateDataRedacted": true. The input Include names of private advertisers turns this off, and using it is your confirmation that you have a lawful basis under the GDPR for processing personal data of private individuals. Listings can still contain personal data: agency contact names, free-text descriptions, photos and the location of a home. You decide what to collect and why, and you need a lawful basis under the GDPR and applicable national law for processing it. Do not use listing data to contact private individuals for marketing without their consent. Do not republish listings, descriptions or photos, and check idealista's terms of use before you start.
To ask for data to be removed or to report a privacy concern, open an issue on the Issues tab; if you have no Apify account, write to support@apify.com and name this Actor.
Changelog
2026-10-18
- Fixed: a run with a timeout of 60 seconds or less failed at once, and a short timeout such as 90 seconds returned fewer listings than it had time for (builds 1.0.28 to 1.0.34 always stopped a full minute before the timeout). The time kept in reserve now scales with the timeout, and the first results page of each search is always fetched. With details on, listings of that first page whose property page there was no time for are saved from the search card with a
detailError.
2026-10-13
- Privacy by default (behaviour change). Detailed records of listings published by private individuals no longer include the advertiser's name:
advertiserNameandadvertiserUrlarenulland the record carries"privateDataRedacted": true. Agencies are unchanged. SetincludePrivateSellerData: trueto get the names as before, if you have a lawful basis for processing them. Records without details never had these fields and are unchanged. advertiserTypeis nowprivatefor property URLs of private advertisers (it wasprofessionalfor every property URL).- New: searches with more than 1,800 results are split into price bands when
maxItemsPerSearchis above 1,800 (splitLargeSearches, on by default); the maximum ofmaxItemsPerSearchis now 100,000. Runs withmaxItemsPerSearchup to 1,800 behave as before.
2026-10-11 (build 1.0.26 and later)
latitudeandlongitudeare now filled on detailed records; new fieldaddressVisibility.advertiserTypeis nowprivatefor listings whoseisProfessionalis false (it used to beprofessionalon every record).- A run in which nothing could be scraped now ends FAILED with the reason (it used to end SUCCEEDED with an empty dataset). Empty searches and offline property URLs end SUCCEEDED with "No listings".
- Status messages report failed inputs and the first error; every run writes
OUTPUT_SUMMARY. - The maximum total charge is respected before work is done; clean stop before the run timeout.
- More URL forms accepted; unusable input fails in seconds. Newest-first sorted searches on idealista.com supported.
maxItemsPerSearchcounts listings newly saved for that search, so overlapping searches in one run return more than before.- English, Catalan, French and German page labels and Italian room words are parsed;
flooris-1for basements.
2026-09-05 (build 1.0.8): first public version.
Related actors
Other actors by the same developer:
- Idealista Rental Yield Finder: gross rental yield, median sale and rent price per m², price drops and new listings per area and per district, computed from idealista's sale and rent listings. One report per area instead of thousands of rows.
- Fotocasa Scraper: sale and rent listings from fotocasa.es, another of Spain's main property portals, to cover listings that are not on idealista.
- Immobiliare.it Scraper: sale, rent and auction listings from immobiliare.it, for Italian searches beyond idealista.it.
- Listing Status Checker: tells you whether Fotocasa, ImmoScout24, Kleinanzeigen and other listing URLs you saved are still online, sold or removed, and how their price changed. It does not check idealista URLs; for those, run this scraper again on the same search.
Support
Found a bug, a missing field or a URL that does not work? Open an issue on the Issues tab with the run ID. Also by the same developer: Leboncoin Scraper.