Idealista Scraper
Scrape Idealista listings in Spain, Italy and Portugal: price, size m2, rooms, floor, neighbourhood, seller type and photos. No account needed.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
searchUrls,maxItems,includeDetails(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0012 per listing = $1.2 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Listing scraped | One property listing written to the dataset. Sample rows and diagnostic rows are never charged. | $0.0012 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-17, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
searchUrls | One or more Idealista search URLs copied from your browser - www.idealista.com (Spain), www.idealista.it (Italy) or www.idealista.pt (Portugal). Up to 20 per run. Any filters already in the URL are kept, so this is the most precise way to ask. If you fill this in, the filter fields below are ignored. | array |
maxItems | Total listings to return across all searches. The budget is shared evenly between them, so two searches and 100 rows gives you 50 of each. Keep it low while you are testing - you pay per listing. | integer |
includeDetails | Off by default. Turn it on to also open every listing page, which adds the bathroom count, the full untruncated description and the complete photo gallery. It costs one extra request per listing, so the run takes roughly ten times longer. The price per listing is unchanged. | boolean |
country | Which Idealista site to search. Used only when you are not passing search URLs. | string |
operation | Whether to search properties for sale or for rent. | string |
location | The location slug Idealista itself uses, taken from the address bar of a search on the site - for example madrid-madrid, barcelona-barcelona, valencia-valencia, milano-milano, roma-roma, lisboa or porto. | string |
propertyType | Homes works for all three countries. Commercial premises, garages and land are available for Spain only - for those in Italy or Portugal, paste a search URL instead. | string |
minPrice | Lowest price to include, in euros. Leave empty for no lower bound. | integer |
maxPrice | Highest price to include, in euros. Leave empty for no upper bound. | integer |
minSize | Smallest floor area to include, in square metres. | integer |
maxSize | Largest floor area to include, in square metres. | integer |
minRooms | Minimum number of bedrooms, 1 to 4, where 4 means four or more. Spain and Portugal only - Idealista Italy has no bedroom filter in its URLs, so this is ignored there and the run tells you so. | integer |
sortBy | Which listings come first. When the search holds more listings than your maximum, this decides which ones you get. Idealista Portugal has no price per m2 order, and biggest or smallest work on searches for sale only. | string |
garden | Only homes with a garden. On Idealista Italy that means a private or a shared one. | boolean |
swimmingPool | Only homes with a swimming pool. | boolean |
balcony | Only homes with a balcony. Tick terrace as well and you get homes that have both. | boolean |
terrace | Only homes with a terrace. | boolean |
seaViews | Only homes with sea views. An inland place just comes back empty. | boolean |
exterior | Only homes facing outwards rather than onto an inner courtyard. Idealista Italy and Portugal have no such filter, so a run that asks for it there stops before fetching anything. | boolean |
airConditioning | Only homes with air conditioning. | boolean |
accessible | Only homes adapted for people with reduced mobility. | boolean |
petsAllowed | Only rentals that accept pets. Idealista offers this on rentals in Spain and Italy only. | boolean |
onlyFlats | Only flats, leaving out houses, penthouses and duplexes. | boolean |
newDevelopment | Only new builds. | boolean |
luxury | Only homes Idealista labels as luxury. | boolean |
bankOwned | Only homes sold by banks, usually repossessions. There are few of them, often a handful per city. Idealista Italy has no such filter. | boolean |
floorPlan | Only listings that include a floor plan. | boolean |
virtualTour | Only listings with a virtual tour. | boolean |
proxyUrls | Leave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port. | array |
What you get
A structured dataset — each result includes fields like:
listingIdtitlepricecurrencypriceLabelpricePerM2sizeM2roomsbathroomsfloorhasLiftaddressneighbourhoodcityExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Idealista Scraper: property listings from Spain, Italy and Portugal, no account needed
Paste an Idealista search URL straight out of your browser, or describe the search with country, location, buy or rent, price and size. Every listing comes back as a row: price, price per m2, size, rooms, floor, address, neighbourhood, whether the advertiser is an agency or a private seller, the photos and the link.
One thing to decide up front. Bathrooms, the full description and the whole photo gallery live on the listing page, not on the search results, so getting them means opening every listing and a run that takes roughly ten times longer.
| Input | Idealista search URLs, or country plus location and filters |
| Output | One row per listing |
| Ceiling | 3,000 listings per run, about 1,800 per search |
| Account needed | None |
| Price | $1.20 per 1,000 listings, flat on every plan |
🏠 What Idealista Scraper does
Three country sites, one set of columns: idealista.com for Spain, idealista.it for Italy and idealista.pt for Portugal. A row from Madrid and a row from Milan have the same keys.
There are two ways to ask. The precise one is a search URL: run the search on the site, get it looking right, copy the address bar. Every filter already in that URL is kept, including the ones this actor has no field for. Up to 20 URLs in a run.
The other way is the filter fields. Leave the URL list empty, pick a country, an operation and a location slug, and the run builds the search for you. Only the location is required. The slug is the piece Idealista itself uses in the address, like madrid-madrid, barcelona-barcelona, milano-milano or lisboa.
📥 What you give it
Every field is optional. Run it with the input empty and you get one labelled sample row back.
{
"searchUrls": [
"https://www.idealista.com/venta-viviendas/madrid-madrid/",
"https://www.idealista.it/affitto-case/milano-milano/"
],
"maxItems": 200
}
| Field | Default | What it is |
|---|---|---|
searchUrls | none | Up to 20 Idealista search URLs. Filling this in makes the filter fields below irrelevant. |
maxItems | 50 | Total listings for the run, 1 to 3,000, split evenly between your searches. |
includeDetails | false | Opens every listing page as well, which adds bathrooms, the full description and the complete photo set. Much slower. The price per listing does not change. |
country | es | es, it or pt. Only used when you are not passing URLs. |
operation | buy | buy or rent. |
location | none | The location slug Idealista uses in its own addresses. |
propertyType | homes | homes everywhere. premises, garages and land are Spain only. |
minPrice, maxPrice | none | In euros. |
minSize, maxSize | none | Floor area in square metres. |
minRooms | none | 1 to 4, where 4 means four or more. Spain and Portugal only. |
sortBy | relevance | Which listings come first: lowestPrice, highestPrice, lowestPricePerM2, highestPricePerM2, biggest or smallest. Portugal has no price per m2 order, and biggest and smallest are for searches for sale only. |
garden, swimmingPool, balcony, terrace, seaViews, airConditioning, accessible, onlyFlats, newDevelopment, luxury, floorPlan, virtualTour | false | Must-have options, on all three sites. Tick several and a home has to have all of them. onlyFlats leaves out houses, penthouses and duplexes. |
exterior | false | Homes facing outwards rather than onto an inner courtyard. Spain only. |
petsAllowed | false | Rentals that accept pets. Spain and Italy only. |
bankOwned | false | Homes sold by banks. Spain and Portugal only, and there are few of them. |
proxyUrls | none | Leave it empty for a normal run. It is there for callers who want traffic to leave through servers they already pay for, as http://user:pass@host:port. |
Idealista Italy has no bedroom filter in its URLs. Set minRooms on an Italian search and the run tells you it was dropped, with a FILTER_UNSUPPORTED row, rather than pretending it applied it. Same story for commercial premises, garages and land outside Spain: paste a search URL instead.
The sort order and must-have options work on homes, in the filter fields only. A URL in searchUrls, or an option that country's site lacks, stops the run with a free BAD_INPUT row before anything is fetched, so you never pay for the search without it.
📤 What you get back
A real row, from run WRZcZ8cP4XevFvEST:
{
"ok": true,
"charged": true,
"recordType": "listing",
"listingId": "106387165",
"title": "Penthouse in Calle de Alcalá, 145, Goya, Madrid",
"price": 3390000,
"currency": "EUR",
"priceLabel": "total",
"pricePerM2": 12890,
"sizeM2": 263,
"rooms": 4,
"bathrooms": null,
"floor": "5th floor exterior with lift",
"hasLift": true,
"address": "Calle de Alcalá, 145, Goya, Madrid",
"neighbourhood": "Goya",
"city": "Madrid",
"country": "Spain",
"operation": "buy",
"propertyType": "Penthouse",
"advertiserType": "agency",
"agencyName": "Walter Haus Madrid",
"description": "We present to you EXCLUSIVELY a unique property on the top floor of a royal ...",
"features": [],
"tags": ["Luxury"],
"images": ["https://img4.idealista.com/blur/480_360_mq/0/id.pro.es.image.master/b3/28/..."],
"imageCount": 1,
"listingUrl": "https://www.idealista.com/inmueble/106387165/",
"searchUrl": "https://www.idealista.com/venta-viviendas/madrid-madrid/",
"updatedText": null,
"scrapedAt": "2026-09-21T01:37:54.388Z"
}
That row came without the detail pass, so bathrooms is null, there is one photo, and the description is the card's shortened one.
| Field | What it is |
|---|---|
listingId | Idealista's id. Your dedupe key across runs. |
price, priceLabel | A number plus total for a sale or per month for a rental, so you never have to parse a string to tell them apart. |
advertiserType, agencyName | agency or private. The name comes with the first. |
floor | Text as the site writes it, not a number, because it carries "exterior", "with lift" and "ground floor" too. hasLift is pulled out of it separately. |
city, neighbourhood | Split out of the listing title. |
searchUrl | Which of your searches produced the row. |
updatedText | Idealista's "updated on" line. It is usually absent, so this is usually null. |
🧾 Reading the output
Three kinds of row.
| Row | How to spot it | Billed |
|---|---|---|
| A listing | recordType: "listing" | yes |
| The sample row | _sample: true, and only when the input named no search | no |
| A diagnostic | recordType: "diagnostic" and ok: false | no |
charged is set when the row is built, a moment before the charge goes out, so read it as "this is a real row" rather than as a receipt. A failed charge adds a CHARGE_ERROR diagnostic at the end.
The Console's default table has no column for errorCode, so diagnostics look like blank lines there. Download the JSON to read them.
| Code | What it means |
|---|---|
NO_RESULTS | The search ran and matched nothing, or ran out of pages. Loosen a filter. |
NOT_FOUND | Page one of that search does not exist. Usually a location slug that Idealista does not use. |
BAD_INPUT | A URL in searchUrls is not an Idealista address, and the other URLs still run. Or a sort order or must-have option that search cannot use, and the run stopped before fetching anything. |
FILTER_UNSUPPORTED | A filter you set does not exist on that country's site and was dropped. |
BLOCKED | Idealista would not serve that page on this attempt. |
NETWORK | The page could not be fetched. Re-run it. |
PROXY_INPUT_ADJUSTED | Something in your proxyUrls was not usable and was adjusted. |
▶️ How to run it
1. Run your search on idealista.com, .it or .pt until the results look right, then copy the address. 2. Open Idealista Scraper, click Try for free, and paste it into Idealista search URLs. 3. Or leave that empty and fill in Country, Buy or rent and Location. 4. Set Maximum listings. Keep it low on the first run. 5. Click Start, then download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost?
$1.20 per 1,000 listings. The same rate on every Apify plan, with no volume tiers.
One charge per listing row. A property that turns up in two of your searches is charged once. Promoted slots and advert blocks that are not real listings are dropped before anything is billed, and neither the sample row nor any diagnostic row is charged. Turning on the detail pass does not change the price per listing.
💡 What people use it for
- Tracking asking prices in a neighbourhood week by week, keyed on
listingId. - Pulling comparables before valuing or pricing a property.
- Splitting a market by
advertiserTypeto see what share is agency stock and what is private. - Watching rentals in one city across all three countries in a single sheet.
🚧 What it does not do
- No contact details. No phone numbers, no email addresses.
agencyNameis the name only. - No coordinates. Address, neighbourhood and city, as published.
bathroomsand the full description need the detail pass. Without it, bathrooms arenulland
the description is the shortened card version.
updatedTextis usuallynull, because most listings do not publish one.minRoomsdoes not work on Italy. That country's search URLs have no bedroom filter.- No newest-first order. Rows carry no date to check it by.
- Commercial premises, garages and land are Spain only in the filter fields. Use a search URL for
the others.
- About 1,800 listings per search, because the site stops paging at 60 pages. Split a big area
into smaller searches, by district or by price band, to get past it.
- 20 search URLs and 3,000 listings in one run.
- Current listings only. No sold prices, no history, no archive of what a flat used to ask.
- Photos are the URLs Idealista serves, not downloaded files.
🧭 Which property scraper do you need?
| If you want | Use |
|---|---|
| Spain, Italy or Portugal on Idealista | This one |
| Spain on Fotocasa | Fotocasa Scraper |
| The United States on Zillow | Zillow Scraper |
| The United States on Realtor.com | Realtor.com Scraper |
| Brazil on VivaReal and ZAP | VivaReal & ZAP Imóveis Scraper |
❓ Questions people ask
Do I need an Idealista account or an API key? No. Nothing to paste in, nothing to renew.
Which is better, a URL or the filter fields? A URL, every time. It keeps filters this actor has no field for, and it is exactly the search you already checked on the site.
Where do I find the location slug? In the address bar after you search on Idealista. In https://www.idealista.com/venta-viviendas/madrid-madrid/ the slug is madrid-madrid.
Can I mix countries in one run? Yes, by putting URLs from different Idealista sites in searchUrls. Each row says which country it came from.
Why did I get fewer listings than I asked for? Either the search has that many, or it reached the 60-page limit. Split the area into smaller searches and run them together.
Is this legal? These are public listing pages. Rows carry agency names and property addresses, which data-protection law can cover, so have a reason for collecting them. Apify's write-up on scraping and the law is a fair start, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the run ID and the exact search URL or filters you used. A diagnostic row's errorCode and searchUrl usually name the search that went wrong.