Idealista Scraper - Spain, Italy, Portugal Listings avatar

Idealista Scraper - Spain, Italy, Portugal Listings

Pricing

from $0.26 / 1,000 listings

Go to Apify Store
Idealista Scraper - Spain, Italy, Portugal Listings

Idealista Scraper - Spain, Italy, Portugal Listings

Scrape Idealista property listings in Spain, Italy and Portugal: price, size, rooms, GPS, photos, agency name and phone, price drops. Sale, rent and rooms. Export to JSON, CSV or Excel.

Pricing

from $0.26 / 1,000 listings

Rating

0.0

(0)

Developer

Nice Dev

Nice Dev

Maintained by Community

Actor stats

0

Bookmarked

13

Total users

7

Monthly active users

2 days ago

Last modified

Share

🏠 What is Idealista Scraper?

Idealista Scraper extracts property listings from idealista in Spain, Italy and Portugal: price, size, bedrooms, GPS, photos, full description, the advertiser's name and phone number, price drops and, on request, the full listing page, the agency's profile (year on idealista, listings, office, website) and its e-mail. Homes for sale or rent, new builds, rooms to share, holiday rentals, offices, shops, garages, land and buildings. It works as an Idealista API alternative: run it on a schedule, call it from your code, or plug it into Make, Zapier or n8n.

Type a city (Madrid, Milano, Lisboa), pick sale or rent, click Start, and download the listings in JSON, CSV or Excel. No login, nothing to set up, and it is fast: about 1,000 listings a minute.

📋 What data can you extract from idealista?

One item per listing, 129 fields:

CategoryWhat you get
🏷️ Listingtitle, link, idealista code, sale or rent, property type — Piso en Calle de López de Hoyos, Castellana, Madrid
💰 Priceprice, price per m², previous price, drop in € and %, date of the drop — 2,695,000 EUR, -2 %
📐 Propertysize, bedrooms, bathrooms, floor, condition, lift, parking, terrace, pool, air conditioning, garden
📍 Locationaddress, neighbourhood, district, city, province, GPS coordinates
📷 Photos and mediaphoto links with the room of each photo, videos, 3D tours, floor plan
📞 Advertiseragency or private seller, contact name, phone number (+34919381590), agency page and logo
🏷️ Badgesidealista labels (luxury, bright…), new build, new listing, paid highlights
🔎 Description tagssea view, needs renovation, tenant in place, tourist licence, investment pitch, new or renovated — read from the description, free — true, false
📄 Listing page (option)every photo, energy certificate, community costs, built / usable area, year built, heating, orientation, last update, description in every language
🏢 Agency (option)agency profile: year it joined idealista, number of listings, description, cover photo, video, office address, GPS and phone, website — and the e-mail found on the agency website, plus the social profiles (Facebook, Instagram, LinkedIn, X, YouTube, TikTok) found on that website
📊 Zone market statistics (option)for each zone of the run (district or city): price quartiles, price per m², gross rental yield, best-value listings, private sellers, price drops, and the local rules (tourist rentals, rent caps, purchase tax) — with an optional AI-written summary of each zone

Every field, with an example, is listed in the Output section below.

Fields marked (listing page) are filled when Open each listing page (includeDetails) is on, those marked (agency page) when Add the agency profile (includeAgencyProfile) is on, those marked (statistics) when Add the listing statistics (includeStats) is on. Everything else — phone number included — comes with every listing.

✅ Why use Idealista Scraper?

  • 🚀 Fast: about 1,000 listings a minute; with Add the agency profile and Find agency e-mails, about 200-400 a minute (with Open each listing page: about 40 listings a minute).
  • 📞 The advertiser's phone number comes with the search results, at no extra cost (no listing page to open).
  • 🧩 Past the 2,500-listing limit of a search: a bigger search is split by price ranges automatically, so a whole city can be read.
  • 🎯 60+ filters: price, size, bedrooms, bathrooms, condition, floor, energy rating, lift, parking, terrace, pool, auctions, bank properties, tenanted or free, furnished, and every filter of rooms to share (gender, couples, pets, smokers…).
  • 🌍 Spain, Italy and Portugal — search by city, keyword, agency, point and radius, map area, or listing codes.
  • 🔔 Monitoring built in: tick Only new listings, schedule the Actor, and each run returns (and charges) only what it has never delivered before. Price drops only returns the listings whose price went down.
  • 🔌 API, scheduling, integrations (Make, Zapier, n8n, Google Sheets…) and JSON/CSV/Excel export via the Apify platform.

🚀 How to scrape idealista

  1. Create a free Apify account.
  2. Open Idealista Scraper, choose the Country, Operation (sale or rent) and Property type, and type a Location (e.g. Madrid).
  3. Or paste idealista search, listing or agency URLs into Start URLs, listing codes into Listing IDs, or agency names into Agencies.
  4. Set Max listings (100 by default, 0 = no limit) — and Max listings per search when you run several searches — then click Start.
  5. Download the dataset in JSON, CSV, Excel or via API.

💰 How much does it cost to scrape idealista?

This Actor uses pay per event pricing, shown at the Gold price (without a subscription the listing costs $0.29 per 1,000 and the options a little more): $0.26 per 1,000 listings, phone numbers included — plus $0.01 per run start. Options are charged only when you tick them: $0.15 per 1,000 listings with Open each listing page, $1.39 per 1,000 listings that get their agency's profile (Add the agency profile; private sellers have none, so are not charged), $0.066 per 1,000 listings whose agency e-mail is found (Find agency e-mails), and $0.44 per 1,000 listings that get their statistics (Add the listing statistics; $0.45 on the Silver plan, $0.49 on Bronze, $0.79 without a subscription). Market figures of each zone of the run cost $0.049 per zone with Add zone market statistics, plus $0.079 per zone that gets its summary with Add a written summary of each zone (up to 20 zones per run; a zone with too few listings, or left without a summary, is not charged). Filters that idealista does not offer are applied by the Actor on every listing it reads: a listing you keep costs its normal price, a listing a filter drops costs $0.26 per 1,000 listings dropped by Private advertisers only, With phone only, Price drops only or Exclude keywords, and $0.26 per 1,000 listing pages dropped by Updated after / before — $0.29 each without a subscription. Example: 20,000 listings of a city ≈ $5.21; a daily monitor of 300 new listings ≈ $0.09 a day. Platform usage (compute, proxy) is included in the price.

⚙️ Input

{
"country": "es",
"operation": "sale",
"propertyType": "homes",
"location": "Madrid",
"maxItems": 200
}

Give at least one starting point: a location, a keyword, a URL, a listing code, an agency, a map point or an area. With none, the Actor runs an example instead of stopping — the listings for sale in Madrid, at most 20 — and says so in the log.

Several cities, a cap per city, filters, only the listings not delivered before:

{
"country": "it",
"operation": "rent",
"propertyType": "homes",
"locations": ["Milano", "Roma"],
"maxItemsPerQuery": 500,
"maxPrice": 1500,
"bedrooms": ["2", "3"],
"features": ["elevator", "terrace"],
"onlyNew": true,
"stateKey": "rent-milano-roma"
}

Or with your own URLs and codes:

{
"startUrls": [
{ "url": "https://www.idealista.com/venta-viviendas/madrid/chamberi/" },
{ "url": "https://www.idealista.com/inmueble/112272495/" }
],
"listingIds": ["36890709"],
"includeDetails": true
}
FieldNotes
countrySpain (es), Italy (it) or Portugal (pt).
operationsale or rent.
propertyTypehomes, newDevelopments, bedrooms (rooms to share, rent only), vacationRentals (rent only), offices, premises, transfers (sale only), garages, storageRooms, lands, buildings.
location, locationsCity, district, province or neighbourhood as typed on idealista, or an idealista location ID; the place found is written in the log.
query, searchQueriesKeywords searched in the listings (e.g. ático terraza), inside each location, or in the whole country without one.
startUrlsidealista search URLs (country, operation, type and location — or map area — are kept; set the filters with the fields below), listing URLs or agency URLs.
listingIdsidealista listing codes of the chosen country, fetched directly.
agenciesEvery listing of these agencies: the name in their idealista page URL (engel-volkers) or the whole URL.
latitude, longitude, radiusKmSearch around a point, radius from 0.1 to 50 km.
polygonArea drawn on the idealista map: the shape value of the map URL, or latitude,longitude points separated by semicolons.
maxItemsStop after this many listings for the whole run (0 = unlimited).
maxItemsPerQueryCap for EACH search (location × keyword, agency, URL…). 0 = no per-search cap.
splitLargeSearchesSplit a search of more than 2,500 listings by price ranges to reach every listing (on by default).
sortByrelevance, newest, lastUpdated, priceLow, priceHigh, priceDrops, pricePerM2Low, pricePerM2High, sizeLarge, sizeSmall.
includeDetailsOpen each listing page: every photo, energy certificate, community costs, areas, year built, heating, orientation, agency address and website, last update.
enrichEmailsRead the agency's e-mail on its own website, plus the social profiles found on it (no extra page, free) (needs includeAgencyProfile — fast, no listing page opened — or includeDetails).
includeAgencyProfileAdd the agency's idealista profile to each of its listings: year on idealista, listings count, description, cover photo, video, office address, GPS and phone, website. One request per agency, not per listing.
includeStatsAdd each listing's statistics, as idealista shows them to the advertiser: views, e-mail contacts, times shared, times saved as a favourite. One request per listing.
includeMarketStatsAdd one record, MARKET_STATS, to the run's key-value store: the market figures of each zone (district or neighbourhood of a city, else the city) and property type, worked out from the listings of this run (see Zone market statistics under Output). A side (sale or rent) of a zone needs at least 5 listings with a price and a surface; up to 20 zones, the biggest first.
includeZoneSummaryNeeds includeMarketStats. Add an AI-written summary to each zone: its figures in about 150 words, then the local rules of the zone copied as recorded. Written at the end of the run: about 1.5 to 2.5 minutes per zone, plus about a minute to start.
languageLanguage of the descriptions and labels (idealista's translation when the advertiser did not write it).
minPrice, maxPrice, minSize, maxSizePrice in euros (monthly rent for rentals), built area in m².
bedrooms, bathrooms, condition, homeTypes, floors, energyRatingAny of the chosen values; 4 bedrooms and 3 bathrooms mean "or more".
publishedSinceidealista's own date filter: lastDay, last2Days, lastWeek, lastMonth. idealista offers 48 hours on sales and 24 hours on rentals: lastDay on a sale searches 48 hours, last2Days on a rental searches the last week.
featuresKeep only the listings with ALL of these: elevator, airConditioning, parking, garden, swimmingPool, terrace, balcony, storeRoom, builtinWardrobes, exterior, accessible, luxury, seaViews, virtualTour, hasPlan, exteriorDomesticSpace.
auctionexcludeAuctions or onlyAuctions (sale).
occupationStatusfree, tenanted, bareOwnership, illegallyOccupied (sale).
bankOfferOnly the properties sold by banks.
furnishedRent: furnished or furnishedKitchen.
rentalTypes, petsAllowedRent: longTerm and / or seasonal; pets accepted.
roomGenderRooms to share: female or male.
roomOccupationstudents or workers.
roomBedType, roomFlatmates, roomRules, roomAvailableFrom, roomAvailableToBed, flatmates, house rules, move-in and move-out dates of a room to share.
postedAfter, postedBeforeLast-update date range read on the listing page (needs includeDetails): 2026-09-01, or a period before now (7 days, 2 weeks, 1 month).
excludeKeywordsDrop the listings whose title or description contains one of these words (case and accents ignored).
privateSellersOnly, requirePhoneDrop the listings of agencies and developers; drop the listings without a phone number.
onlyPriceDrops, minPriceDropPercentOnly the listings whose price went down, and by at least this percentage.
onlyNew, stateKey, resetStateMonitoring: only the listings never delivered under this memory key; resetState forgets the memory.
AdvancedproxyConfiguration (Apify proxy by default, included in the price; the residential proxy is not available), maxConcurrency, maxRequestRetries, debugLog.

📦 Output

A listing of a search (shortened: 129 fields in all, the ones of the listing page are null here):

{
"id": "112272495",
"url": "https://www.idealista.com/inmueble/112272495/",
"title": "Piso en Calle de López de Hoyos, Castellana, Madrid",
"country": "es",
"operation": "sale",
"propertyType": "homes",
"typology": "flat",
"price": 2695000,
"currency": "EUR",
"pricePerM2": 9489,
"previousPrice": 2750000,
"priceDropPercent": 2,
"size": 284,
"rooms": 3,
"bathrooms": 4,
"floor": "2",
"condition": "good",
"hasLift": true,
"labels": ["Lujo"],
"address": "Piso en Calle de López de Hoyos, Castellana, Madrid",
"neighborhood": "Castellana",
"municipality": "Madrid",
"latitude": 40.4379032,
"longitude": -3.6883,
"images": ["https://img4.idealista.com/s/v1/yLueJcFa…?Expires=1790292734&Signature=…&Key-Pair-Id=K20EOYVFELHOX5"],
"imageTags": ["livingRoom"],
"videos": ["https://st3v.idealista.com/fd/15/66/1470511706.mp4"],
"virtualTours": ["https://my.matterport.com/show/?m=qQ4pCJDD6FA&lang=es"],
"advertiserName": "Gilmar Barrio de Salamanca",
"advertiserType": "professional",
"phone": "+34919381590",
"agencySlug": "gilmarsalamanca",
"features": [],
"descriptionLanguages": [],
"agencySocials": null,
"motivatedSellerScore": 0,
"motivatedSellerReasons": [],
"seaView": false,
"needsRenovation": false,
"tenantInPlace": false,
"touristLicence": false,
"investmentPitch": false,
"newOrRenovated": false,
"search": "es · sale · homes · Madrid",
"scrapedAt": "2026-09-24T08:00:00.000Z"
}

You can download the dataset in various formats such as JSON, HTML, CSV or Excel.

All 129 fields

FieldsWhat you get
id, url, title, country, operation, propertyType, typology, subTypologyListing — 112272495, web link, title, es, sale, homes, flat, independantHouse
price, currency, pricePerM2, previousPrice, priceDropValue, priceDropPercent, priceDropDatePrice — sale price or monthly rent, EUR, €/m², price before the last drop, drop in € and %, ISO date
lastSeenPrice, priceChange, priceChangePct, priceChangedAtPrice tracking — null in every row for now: filled only on a listing that comes back because its price changed since the run that delivered it (price at that run, change in € and %, ISO date)
aiLabelMatchesAI label — null in every row for now: filled only with the AI label option, which is not on sale yet (the labels you wrote that apply to the listing description, each with its score)
size, rooms, bathrooms, floor, conditionProperty — m², bedrooms, bathrooms, 2 / bj (ground), good / renew / newdevelopment
hasLift, isExterior, hasParkingSpace, parkingIncludedInPrice, parkingPrice, hasAirConditioning, hasSwimmingPool, hasTerrace, hasGarden, hasBoxRoomProperty — true / false / null
labels, isNewDevelopment, isNewListing, isTopHighlight, isVisualHighlight, isTopPlus, isUrgentBadges — idealista labels, new build, new on idealista, paid highlights
address, addressVisible, neighborhood, district, municipality, province, locationId, latitude, longitudeLocation — the line idealista shows on the results page (Piso en Calle de Goya, Recoletos, Madrid: type, street when shown, area, city), whether the exact address is shown, idealista location ID, GPS
description, highlightPhrasefull description, the advertiser's highlight phrase
thumbnail, images, imageTags, imageCount, videos, virtualTours, hasVideo, has3DTour, has360, hasPlan, hasHomeStaging, hasMediaByIdealista, imagesByIdealista, virtualToursByIdealistaPhotos and media — photo links and the room of each (livingRoom, kitchen…), videos, 3D tours, whether idealista made some of the media and how many photos / 3D tours (listing page)
advertiserName, contactName, advertiserType, phone, phoneFormatted, agencySlug, agencyUrl, agencyLogo, externalReferenceAdvertiser — name, contact, professional / private, +34919381590, 919 38 15 90, agency page, logo, the advertiser's reference
updatedAt, street, communityCosts, energyCertificate, energyConsumption, emissionsRating, emissionsValue, furnishedListing page — last update (ISO), street alone (Calle de Goya, 135), monthly community costs, energy rating, kWh/m² year, emissions rating, emissions in kg CO₂/m² year, furnishing
builtArea, usableArea, plotArea, isPenthouse, isDuplex, isStudio, isTopFloor, yearBuilt, heating, orientation, features, descriptionLanguagesListing page — m², flags, 1950, Central heating: gas (or No heating), east, west, every feature line, languages of the description
agencyAddress, agencyPostalCode, agencyCity, agencyWebsite, agencyId, agencyPhrase, allowsCounterOffers, allowsRemoteVisit, isBankOwned, smokingAllowedAgency (listing or agency page) — office address, postal code, city, website, idealista agency number, slogan, counter-offers, remote visits (listing page), advertiser is a bank (listing page), smoking allowed (room listings)
agencySinceYear, agencyListingsCount, agencyCoverImage, agencyVideo, agencyPhone, agencyLatitude, agencyLongitudeAgency (agency page) — year it joined idealista (2001), listings on idealista (47), cover photo, video, office phone (+34919382902), office GPS
views, emailContacts, sharedWithFriends, favoritesStatistics (statistics) — views (615), e-mail contacts (2), times shared (0), times saved as a favourite (21)
email, agencySocialsAgency — e-mail found on the agency website (enrichEmails); agencySocials = the social profiles found on that website ({ facebook, instagram, linkedin, x, youtube, tiktok }, a link or null each), delivered even when no e-mail is found, and never charged
motivatedSellerScore, motivatedSellerReasonsMotivated seller (included, free) — a 0-100 note and the codes behind it (price_drop_5, urgent, bank_owned, auction, occupied, private_seller, stale_90d…). Rule-based, from the listing's own fields, not a prediction: price drop, urgent flag, bank flag, auction flag, bank / auction / occupied labels, private seller, age of the last update (listing page only). null when no signal can be read, 0 when every signal read is false
seaView, needsRenovation, tenantInPlace, touristLicence, investmentPitch, newOrRenovatedDescription tags (included, free) — six yes / no columns read from the description of the listing (the listing page text with Open each listing page, the search card text without it), in English, Spanish, Italian, Portuguese and Catalan: sea view, needs renovation, tenant in place (rented or occupied), tourist licence, investment pitch, new or renovated. Read from the description, free, and indicative: a keyword reading, not a check on site; where the site gives the fact itself (condition « to renovate », new development, « occupied » label) its flag comes first. null when the listing has no description
search, scrapedAtthe search that found the listing, ISO timestamp

📊 Zone market statistics

With Add zone market statistics, the run also writes one record, MARKET_STATS, to its key-value store (linked in the Output tab; nothing is added to the dataset). It holds one entry per zone — the district of a city, else its neighbourhood, else the city — and property type, worked out from the listings of this run only, nothing estimated:

  • sale and rent side by side, each kept with at least 5 listings that have a price and a surface: listings, price (lowest, quartiles, highest), price per m² quartiles, median size, rooms, share of private sellers, price drops, the listings' age (with Open each listing page), a deals table that scores every listing against the median price per m² of its zone (cheapest first) and bestDeal;
  • grossYieldPercent: median rent per m² × 12 / median sale price per m², when the run holds both sale and rent for the zone;
  • regulations, for Spain, Italy and Portugal: the local rules of the zone's city, region and country (tourist rentals, rent rules and caps, purchase and property taxes, tourist taxes), each with its status (in_force, expired, unverified), legal basis, dates and official source links; null for a place or a country without rules on record. The rules of the country itself are written once per country, in nationalRules. Regulatory notes are an informational summary of public rules compiled from official sources, not legal or tax advice: always check the linked official source before acting.

Up to 20 zones per run, the biggest first. With Only new listings, only the listings delivered in this run count.

With Add a written summary of each zone, each zone also holds summary: an AI-written text of about 150 words, in English, that puts the figures of the zone into sentences without adding to them, followed by the local rules of the zone copied as recorded (never written by the AI). summarySource is ai for a text that matched the figures of its zone, template for the same figures in fixed sentences when it did not (charged the same); both are null for a zone left without a summary, which is not charged. The summaries are written at the end of the run, after the listings and the figures: about 1.5 to 2.5 minutes per zone, plus about a minute to start — give the run the time (Run options → Timeout); a zone the run has no time left for gets no summary and is not charged. A summary only restates the figures of its zone and the recorded rules: it is not advice.

One zone of the record (shortened):

{
"zone": "Málaga · Centro",
"zoneLevel": "district",
"country": "es",
"municipality": "Málaga",
"district": "Centro",
"propertyType": "homes",
"currency": "EUR",
"sale": {
"listings": 41,
"usable": 41,
"price": { "min": 259000, "p25": 435000, "median": 740000, "p75": 835000, "max": 1600000 },
"pricePerM2": { "p25": 4414.36, "median": 5711.33, "p75": 6949.15 },
"medianSize": 114,
"privateShare": 0,
"priceDrops": { "listings": 7, "share": 0.171, "medianPercent": 6 },
"bestDeal": {
"id": "112596171",
"url": "https://www.idealista.com/inmueble/112596171/",
"price": 264000,
"size": 91,
"rooms": 2,
"pricePerM2": 2901.1,
"gapPercent": -49.2
}
},
"rent": {
"listings": 68,
"usable": 68,
"price": { "min": 750, "p25": 1137.5, "median": 1300, "p75": 1620.75, "max": 3825 },
"pricePerM2": { "p25": 15.93, "median": 20, "p75": 25.67 },
"medianSize": 65
},
"grossYieldPercent": 4.2,
"regulations": { "country": "ES", "region": "Andalucía", "city": "Málaga", "asOf": "2026-10-05" },
"summary": "The Málaga Centro district offers 41 properties for sale with a median asking price of €740,000. The median surface area for these listings is 114 m². […] The gross rental yield is 4.2%.\n\nLocal rules (verified, copied as recorded):\n- [Málaga] New tourist dwellings are suspended in the whole municipality from 23 August 2025 for up to three years, or until the planned PGOU amendment is approved if earlier.\n- [Andalucía] Resale property purchases are taxed at a flat 7% transfer tax (ITP).",
"summarySource": "ai"
}

💡 Tips

How to get more results

Set maxItems to 0 and keep Split large searches on: a search of more than 2,500 listings (idealista's own limit per search) is read by price ranges, so a whole city comes out. Several cities or districts in locations also widen the run.

How to reduce costs

The price is per listing, so the levers are maxItems, maxItemsPerQuery, the filters (a filtered-out listing is not saved and costs only the filter fee, see above) and onlyNew for recurring runs (you never pay twice for the same listing). Leave Open each listing page off unless you need its fields: the search already gives the price, the GPS, the description and the phone number.

Several searches in one run

Fill locations and / or searchQueries: the Actor runs one search per location × keyword (up to 500 per run), plus one per agency, point, area or search URL — with no location, each of those is searched once per keyword (500 at most) instead. A listing found by several searches is saved — and charged — once. Set maxItemsPerQuery to give every search its own cap: without it the first searches can use up the whole maxItems budget.

Monitoring: only the new listings

Tick Only new listings (onlyNew) and schedule the Actor. The first run returns everything; each later run skips the listings already delivered: they are not saved and not charged. The memory lives in a named key-value store of your account (idealista-listings-scraper-seen, up to 150,000 listings per key) and is only updated with listings that really reached the dataset, so a failed run never hides anything. Give each schedule its own stateKey, and tick resetState once to start over. Searches are then sorted by newest (unless you pick another Sort by), and a search stops once it meets 250 listings in a row you already have — with a cap (Max listings or Max listings per search) below 250, once it has met 80 % of that cap in all (paid listings pinned at the top are not counted). Add Price drops only to follow the price cuts. A listing one of your filters dropped (and charged its filter fee) is remembered for the same filters: the next runs neither read it again nor charge it again.

AI label (not on sale yet)

The AI label option will let you write your own labels (seaview, needs renovation: the flat must be refurbished) and tag every listing whose description fits one: aiLabelMatches lists the labels that apply, each with a score from 0 to 1 ([] when none applies, null when the description is empty or could not be read). It is charged as AI label, per listing and per label, and needs 1 GB of memory at least. It is not available in the form yet.

Filter by date

publishedSince is idealista's own filter (published or reduced in the last day, 2 days, week or month) and works on every run. postedAfter and postedBefore read the last update of each listing on its listing page, so they need Open each listing page: a date (2026-09-01, the whole day is included, Madrid time) or a period before now (7 days, 2 weeks, 1 month). Filtered-out listings are not saved and do not count in maxItems; each listing page they drop costs the filter fee (see Pricing).

🔌 Integrations and API

Call the Actor via the Apify API, the JavaScript or Python clients, or connect it with integrations and webhooks (Make, Zapier, n8n, Google Sheets, Slack, Airtable…). The dataset can be fetched as JSON or CSV from any tool.

🤖 Use with AI agents (MCP)

AI agents (Claude, ChatGPT, Cursor…) can find and run this Actor through the Apify MCP server, billed to their Apify account like any run. It returns one item per idealista property listing. Actor id: nice_dev/idealista-listings-scraper; MCP server with this Actor only: https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/idealista-listings-scraper.

Smallest input, for a cheap first call:

{
"country": "es",
"operation": "sale",
"propertyType": "homes",
"location": "Madrid",
"maxItems": 10
}

Key output fields: url, title, price, currency, size, rooms, address, phone.

Cost: $0.26 per 1,000 listings (Gold price) plus $0.01 per run start; the options (listing page, agency profile, agency e-mail) and the filters cost extra, see the pricing section above. Cap each call with maxItems and, through the API, with the run option maxTotalChargeUsd.

❓ FAQ

The Actor only reads what idealista shows publicly to any anonymous visitor. It logs in to nothing and solves no captcha. Results contain personal data — the name and phone number of the advertisers, private sellers included, and with Find agency e-mails the business addresses published on the agencies' own websites — which is protected by GDPR: you need a lawful basis before using it, and rules for contacting people differ by country. You are responsible for using the data in compliance with idealista's Terms of Use and applicable law. This Actor is not affiliated with idealista.

Does it need a login or a proxy?

No login. The proxy is included in the price: leave the default setting (the residential proxy is not available). A request the site turns away is retried at once on a new proxy session (without a proxy, after a pause of 5 seconds, doubled at each retry up to 150 seconds).

Is the data safe to open in Excel or to show on a web page?

Every phone number starts with + (international format): import the phone column as text in Excel or Google Sheets, or it may be read as a number. Titles and descriptions are the advertisers' own words, copied as they are: a text can begin with -, +, = or @, which a spreadsheet may read as a formula. Every URL field holds an http(s) link or null. On a web page, escape every field like any text written by a stranger.

Known limitations

  • idealista shows at most 2,500 listings per search: with Split large searches off, a bigger search stops there.
  • A search of more than 2,500 listings is read by price ranges: with a price sort (priceLow, priceHigh) Max listings still gives the cheapest (or dearest) listings of the whole search; with any other sort (newest, size…) it gives listings sorted inside each price range, not the first ones of the whole search.
  • The filters written in the path of a pasted search URL are not read: set them with the filter fields.
  • Photo links are signed by idealista and stop working 24 hours after the run: download the photos you need before.
  • idealista gives no first-publication date, only the last update (on the listing page).
  • onlyNew remembers listing codes, not their content: a listing whose price changed is not returned again (use onlyPriceDrops on a separate run for that).

A run the platform stops without warning (out of memory, run timeout)

  • Resurrect it: it goes on from where it stood at most a minute before the stop. What it had read since is read again, and the listings already saved are skipped: none is delivered or charged twice, and maxItems still counts them.
  • With onlyNew, the memory is saved after each write (at most once every 2 seconds): resurrect the stopped run and the listings it had saved meanwhile join the memory; leave it stopped for good, and the next run may return the listings of its last 2 seconds once more.

Something doesn't work?

The last line of the log counts the listings saved, filtered out and no longer on idealista (removed while the run was reading them), and the requests that failed after every retry. Those requests and the removed listings are listed, with the reason, in the FAILED_REQUESTS record of the run's key-value store. A search idealista has no answer for (a place it refuses: HTTP 404) is a warning, not a failed request: the run ends green and its last message says which search was not found. A run that saved nothing and had failed requests fails, and its last message gives the cause; without a proxy, a refused IP is said as such (turn the proxy on). A run that saved some listings but lost at least as many requests as it read fails too ("Most requests failed…"), so that a block after the first page never passes for a finished run: the listings it kept stay in the dataset.

If idealista changes its pages, you are told instead of paying for blank rows. If the first 20 listings read all lack their title, price, GPS, description, photos or type of advertiser (or the phone of every agency) — or, with Open each listing page, their last update, energy certificate or feature lines — the run saves nothing more, stops and fails, and its last message names the missing field: at most those first listings are charged.

🛟 Support

Open an issue in the Issues tab with a link to your run: the run log and the FAILED_REQUESTS record of the key-value store show exactly which searches failed and why.