Idealista Scraper for Spain, Italy and Portugal
Pricing
from $0.15 / 1,000 property listing saveds
Idealista Scraper for Spain, Italy and Portugal
Scrape Idealista sale and rental listings in Spain, Italy and Portugal. Filter searches, export JSON or CSV, and add property details. Run summaries show where collection stopped.
Pricing
from $0.15 / 1,000 property listing saveds
Rating
0.0
(0)
Developer
anis
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 days ago
Last modified
Categories
Share
Get sale and rental listings from Idealista in Spain, Italy and Portugal, with asking prices and locations. Use the results to compare properties or collect snapshots over time.
Search by a location URL, name or exact location ID. You can filter by price, bedrooms and publication date, then add descriptions, advertiser contacts, energy information and media where available. The actor covers homes, offices, commercial premises, garages and shared rooms. Shared-room searches use rent automatically.
This actor is independent and unaffiliated with Idealista.
Workflows for property data teams
- Compare asking prices. Export listings from selected neighborhoods to CSV, then compare price, size and price per square meter in Excel or Google Sheets. Asking prices describe advertised properties; they are not completed sale prices.
- Feed an application or analysis pipeline. Fetch JSON through the Apify API and use
country+idas the listing key. The timestamp and coverage summary help you check the age and scope of each snapshot. - Collect recurring snapshots. Use an Apify schedule and store each run in your database. Compare matching listing IDs to track price changes; check coverage before treating an absent listing as removed.
Idealista to n8n, CSV and Google Sheets
Download the n8n workflow, or get the automation kit with setup instructions and a Python exporter. The template is free; actor runs use the rates in the Pricing tab.
- Import the workflow into n8n. Create a Header Auth credential with
Authorizationas the name andBearer YOUR_APIFY_TOKENas its value; select it on the four HTTP Request nodes. - Edit Configure search. The preset collects up to 25 Madrid rental listings published in the last week, newest first, with a $0.02 maximum event charge.
- Run manually and download the file from Download CSV. Each row includes the listing key, asking price, collection timestamp and coverage limits.
- To append snapshots to Google Sheets, connect your credential, enter the document ID and enable the optional Sheets node. Enable the daily trigger after testing your destination. Both start disabled.
The workflow checks run status and coverage before exporting. It supports 1–1,000 listings per run and stops on failed or partial collection. Snapshots can contain the same listing across runs; change detection and alerts need a separate comparison step. See the setup guide or try the recent Madrid rentals preset directly in Apify.
For other automation platforms, use the Apify Make integration.
Getting started
- Paste a location search URL into Start URLs. To search by name instead, clear that field, enter
Madrid,MilanoorLisboain Locations by name, and choose the country. - Set your filters and keep Maximum listings at 100 for the first run. Leave enrichment off if you only need prices and locations. Check the Pricing tab and set Max cost per run.
- Use a residential proxy for cloud runs. The actor chooses the proxy country for a single-country search unless you set one yourself.
- Open the dataset after the run. Check Coverage and run summary to see how much of the search was collected.
The prefilled URL searches Madrid homes for sale. If you add a location name while keeping that URL, the actor searches both. Location names resolve to the first Idealista autocomplete suggestion. Check the resolved location in the summary; an exact location ID is useful when a name could refer to several areas.
{"startUrls": [{ "url": "https://www.idealista.com/en/homes-for-sale-in-madrid/" }],"priceFrom": 100000,"priceTo": 300000,"bedrooms": ["2", "3"],"maxItems": 100,"includeDetails": false,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Search options
| Option | Behavior |
|---|---|
| Start URLs | Search locations on idealista.com, .it or .pt. The domain and path set the country, sale or rent, and property type. Examples: /alquiler-viviendas/madrid-madrid/, /venta-viviendas-chamberi-madrid/, /affitto-case/milano-milano/, /comprar-casas/lisboa/. Individual property URLs and map or polygon searches are unsupported. |
| Locations by name | Select the country and operation in the form. The actor resolves the name through autocomplete. |
| Location IDs | IDs such as 0-EU-ES-28-07-001-079 identify an area and its country. You can copy location.locationId from an earlier result. |
| Price from / to | Prices are in euros, or euros per month for rentals. Zero leaves that bound unset. |
| Bedrooms | Select exact counts; a listing can match any selected count. 0 means studio; 4+ is unsupported. |
| Published within | Yesterday, last week or last month, as reported by Idealista. Choose Publication date / Descending to get the newest first. |
| Enrich with details | Adds one request per listing and merges the available details into the row. If the request fails, the actor keeps the base listing and does not charge for enrichment. |
| Maximum listings | Caps output across all searches. The default is 100; zero removes the cap. Use Apify's run-cost setting to limit event charges. |
| Max listings per query | Defaults to 1,000 for each location and filter combination. |
| Max pages per query | Zero calculates a page limit from the per-query item limit. A positive number sets a page cap. |
| Filters JSON | Extra flat Idealista filters, e.g. {"minSize":80,"bathrooms":"2,3","terrace":true}. Idealista may ignore filter names it does not recognize. |
| Request settings | Defaults to concurrency 8 and 750 ms between requests per identity. Without a proxy, concurrency is at most 8 and the interval is at least 1,200 ms. |
Spanish URL price tokens precio-desde_… and precio-hasta_… become search filters. Other URL filters and unsupported query parameters produce an error explaining which input fields to use. Non-zero price fields, selected Bedrooms and a specific Published within value override the matching Filters JSON keys and URL prices. Leaving these fields at their defaults keeps your advanced filters.
Results and exports
Each dataset row is a property listing. The actor removes duplicates within a run using country + id. When searches overlap, a listing appears once: each query's items count tells you how many rows it added, not how many listings exist in that market. The dataset has three views: Listings, Price and location, and Enrichment and contacts.
The Output tab has links to the full JSON dataset, an overview CSV and the OUTPUT summary in the key-value store. JSON includes every saved field. The overview CSV contains the columns in that view; you can select other views in the dataset UI.
Example base listing, with optional fields supplied by Idealista:
{"id": "123456789","title": "Example apartment in Madrid","url": "https://www.idealista.com/inmueble/123456789/","price": { "amount": 250000, "currency": "€", "perSqm": 3125 },"sizeM2": 80,"rooms": 2,"bathrooms": 1,"location": { "municipality": "Madrid", "latitude": 40.42, "longitude": -3.70 },"country": "es","operation": "sale","searchLocation": "Madrid","scrapedAt": "2026-10-08T12:00:00.000Z","detailStatus": "not-requested"}
Successful enrichment sets detailStatus to succeeded. It can add contact, characteristics, energyCertification, fuller descriptions, media, flags and dates. A failed request sets the status to failed and adds detailError.
Some listings have no contact details, energy rating or exact address. Coordinates can be approximate. Price reductions appear in price.dropAmount, price.dropPercentage and price.dropDate only when Idealista supplies them. scrapedAt records when the actor collected the listing; dates.modified is Idealista's modification timestamp in milliseconds since the Unix epoch.
For API integrations, read defaultDatasetId and defaultKeyValueStoreId from the completed run:
GET https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=jsonGET https://api.apify.com/v2/key-value-stores/{defaultKeyValueStoreId}/records/OUTPUT
Use an Authorization header for private resources. Paginate large downloads with offset and limit. See the dataset items API.
Coverage and limits
Idealista limits how far you can page through a search. The observed window is around 2,500 to 3,000 listings per query, which broad city searches can exceed. The actor does not split those markets automatically. Search smaller districts or separate price bands, then remove duplicates from the combined exports.
The OUTPUT summary contains row and detail counts, detail failures, charge counts, request failures and timing. It also reports coverage for each country, location, sale or rent, property type and filter combination. Each coverage entry has Idealista's total, the query's contributed items, processed and advertised page counts, complete and reason.
| Reason | Meaning |
|---|---|
complete | Every advertised page was fetched or restored from a checkpoint. Listings can still change during pagination. |
depth-window | Idealista returned a different page from the one requested. The actor discards it and stops queued requests for that query. Requests already in progress can finish. |
page-cap | The configured or calculated page cap stopped collection. |
max-items / query-limit | The global or per-query listing cap stopped collection. |
budget-limit | The actor limited collection to rows whose combined listing and successful-enrichment charges fit the remaining budget. Failed enrichment can leave some budget unused. |
failed | A location lookup or page request failed. Check failures; any rows already saved remain available. |
The summary status is succeeded when collection finishes, limited when a cap stops it, partial when it returns data with request or enrichment failures, and failed when collection fails. Check coverage even after a successful Apify run: the dataset may contain only part of a market. A failed run can also have saved rows.
After a platform migration, checkpoints restore saved progress if the normalized input is identical. An abrupt crash can leave duplicate rows, so deduplicate exported snapshots by country and ID.
Scheduled runs
Use Published within and Publication date / Descending when scheduling snapshots. Adjust the page and item limits until coverage is complete; one or two pages only samples an active market. Each run creates a separate dataset. Save country + id in your own database to find new listings and compare prices over time. Change detection, alerts and deduplication across runs belong in that workflow.
Troubleshooting
Enrichment adds a request for each listing. Run time depends on the search size, proxies and Idealista's responses.
If the dataset is empty, check the failure messages, resolved location and proxy configuration. A search with no matching listings succeeds with zero rows. A run whose requests are all blocked fails.
For help, open an issue on the actor's Apify page with the run ID and input, after removing any credentials or private proxy URLs. Changes to Idealista's API may require an actor update.