Idealista Scraper - Spain Real Estate avatar

Idealista Scraper - Spain Real Estate

Pricing

from $1.65 / 1,000 listing scrapeds

Go to Apify Store
Idealista Scraper - Spain Real Estate

Idealista Scraper - Spain Real Estate

Scrape Spain property listings from idealista.com search URLs: price, price per m2, rooms, area, floor, agent, description and images. Bypasses idealista's anti-bot protection. Sale and rental. Paste search URLs or import a file.

Pricing

from $1.65 / 1,000 listing scrapeds

Rating

0.0

(0)

Developer

Scrape Sage

Scrape Sage

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Idealista Scraper - Spain Real Estate Listings

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by idealista or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.

Scrape property listings from idealista.com, Spain's largest real-estate portal, straight into JSON, CSV or Excel. Paste any idealista.com search URL - for sale or for rent, any city, province or neighbourhood - and get clean rows with price, price per m2, rooms, built area, floor, listing agency, description and photo.

idealista sits behind enterprise anti-bot protection that blocks ordinary HTTP scrapers and ordinary headless browsers. This actor handles that for you: no proxy setup, no browser fingerprinting, no captcha service, and no API key on your side. You paste a search URL and get rows.

What you get per listing

FieldTypeMeaning
idstringidealista listing id (e.g. 110308026)
titlestringListing headline, e.g. "Piso en Calle de María de Molina, Castellana, Madrid"
urlstringCanonical idealista.com/inmueble/<id>/ link (query strings stripped, so it de-duplicates cleanly)
pricenumberAsking price for sale, or monthly rent on rental searches
currencystringAlways EUR
pricePerSqmnumberPrice divided by built area, computed for you - the field agents and analysts actually compare on
roomsnumberBedrooms (habitaciones)
areaSqmnumberBuilt area in m2
floorstringFloor plus exterior/interior plus lift, verbatim, e.g. "3ª planta exterior con ascensor"
agentstringListing agency or advertiser (e.g. "Clikalia España")
descriptionstringThe description teaser idealista prints on the results card
isNewbooleantrue only on new-build (obra nueva) listings - see note below
tagsarrayBadges idealista puts on some cards, e.g. ["Lujo"] - see note below
imagestringCover photo URL
typestringRecord type, always listing (one mode, one record shape, no blank columns)
sourceUrlstringThe search URL this row came from, so you can merge many searches and still tell them apart
scrapedAtstringISO timestamp of the fetch

Field coverage, measured on a real 60-listing Madrid sale run: price, pricePerSqm, rooms, areaSqm, agent, description, image, title, url were present on 60 of 60. floor on 56 of 60 (93%) - idealista omits it on some property types. tags on 14 of 60 (23%) and isNew on 0 of 60: those two are per-listing badges, not fields every property has. tags is an empty array when idealista shows no badge, and isNew is only true for the new-build subset - a resale search legitimately returns none. That is the source's behaviour, not a gap in extraction, and every other field arrives populated.

Example output

One real row, exactly as written to the dataset:

{
"type": "listing",
"id": "110308026",
"title": "Piso en Calle de María de Molina, Castellana, Madrid",
"url": "https://www.idealista.com/inmueble/110308026/",
"price": 790000,
"currency": "EUR",
"rooms": 2,
"areaSqm": 70,
"pricePerSqm": 11286,
"floor": "1ª planta exterior con ascensor",
"agent": "Clikalia España",
"isNew": null,
"tags": [],
"image": "https://img4.idealista.com/blur/591_420_mq/0/id.pro.es.image.master/b4/49/2c/1449827824.jpg",
"sourceUrl": "https://www.idealista.com/venta-viviendas/madrid-madrid/",
"scrapedAt": "2026-08-16T21:04:21.007Z"
}

Input

{
"startUrls": ["https://www.idealista.com/venta-viviendas/madrid-madrid/"],
"maxPagesPerUrl": 5,
"maxItems": 1000
}
  • idealista.com search URLs - build the search you want on idealista.com (city, price range, rooms, m2, lift, whatever filters you like), then paste the URL. One per line, as many as you want. Every filter you set on the site is carried through, because the actor scrapes exactly the URL you gave it.
  • Import URLs from a file - paste a whole list, or give a single link to a public .txt/.csv, a Google Sheet or Drive link, or an Apify key-value-store record. Blank lines and # comments are ignored. A file that cannot be read tells you so and charges nothing.
  • Max pages per URL - up to 30 listings per page (default 10 pages).
  • Max listings - overall cap across all URLs.
  • Output fields - tick only the columns you want and every record is trimmed to exactly those, which keeps CSV and Google Sheets exports lean.

Leave everything empty and the run scrapes a small one-page sample search, so you can see the output shape before committing to a real job.

Which idealista URLs work

Search typeURL patternStatus
Homes for saleidealista.com/venta-viviendas/<city>/Validated
Homes for rentidealista.com/alquiler-viviendas/<city>/Validated
Any filtered searchthe same paths with idealista's filter segments appendedValidated
Other property types (venta-locales, alquiler-oficinas, venta-garajes, obra-nueva, ...)same result-card layoutUsually works, not part of the validated set

Validated across Madrid, Barcelona, Valencia, Sevilla, Málaga and Zaragoza, sale and rent. Pagination is automatic (/pagina-2.htm, /pagina-3.htm, ...) up to your page limit, and the actor stops early on its own when idealista stops advancing the results, so you never pay for a page of repeats. Rows are de-duplicated by listing URL across every start URL in the run.

Reliability

idealista is protected by enterprise anti-bot (DataDome), which is why plain scrapers - and plain headless browsers - come back with a challenge page instead of listings. This actor routes every request through a premium unblocking layer that solves the challenge and returns the real server-rendered page, then parses the listing cards.

On top of that:

  • Short-render detection. idealista sometimes serves a partially rendered results page - anywhere from 0 to ~half of the 30 cards a full page holds. The actor reads each page's own result count and pagination, refetches any page that falls short of what the search says it should hold (keeping the best of up to 3 fetches), and never mistakes a bad render for the end of the search. A page that stays short even after refetching is disclosed in the run's status message instead of being passed off as complete.
  • Wall-clock budget. Long runs stop cleanly before the platform timeout, save everything collected up to that point, and say so in the run status instead of dying as TIMED-OUT.
  • Every ending explains itself. A run that finds nothing tells you why - bad search URL, unreadable import file, or a fetch that failed - and bills $0.

What people use it for

  • Comparables and valuations - pull every flat in a barrio with pricePerSqm already computed.
  • Rental yield analysis - scrape the same area twice, once venta-viviendas and once alquiler-viviendas, and divide.
  • Market monitoring - schedule a daily or weekly run per city and track price movements, new supply and how long listings last.
  • Agency and lead intelligence - agent gives you who is listing what, and at what volume, in any market.
  • Investment screening - filter on price per m2, floor, lift and area across Madrid, Barcelona, Valencia, Málaga, Alicante, Sevilla, Bilbao or the Costa del Sol.
  • Feeding AI agents and data pipelines - see the MCP section below.

Honest limits

  • isNew and tags are per-listing badges, not universal fields. Quantified above: isNew is true only for obra nueva listings, tags fills only when idealista prints a badge such as Lujo. Both are empty on ordinary resale listings by design.
  • description is the results-card teaser, which idealista itself truncates, so it can end mid-sentence. It is the description as published on the search page, not the full text of the detail page.
  • A page can rarely still come back short. A full idealista results page holds 30 cards, but its anti-bot layer sometimes serves a partially rendered page - we have measured renders of 2, 11 and 16 cards on pages that carry 30. The actor detects a short render against the search's own result count and refetches it automatically; in our latest test battery every short render recovered to the full 30, with a 5-page Madrid crawl returning 150 of 150. If a page ever stays short after all refetches, the run's status message says so rather than presenting the result as complete - and you are only billed for rows actually delivered. Within a run, duplicate listings are dropped before billing, so overlapping searches cost nothing extra.
  • Runs are a little slower than an unprotected site, because every page goes through the unblocking layer. That is the cost of getting past idealista's defences reliably rather than intermittently.

Pricing

Pay per listing - you are charged only for listings actually written to the dataset. A run that finds nothing, or that cannot read your import file, costs $0. The rate covers the premium anti-bot unblocking that makes idealista scrapable at all, and it drops automatically on higher Apify plans (tiered pay-per-event pricing).

Output views

  • Listings - a table of title, price, area m2, rooms, EUR/m2 and the listing URL, ready to eyeball or export to CSV, Excel, JSON or Google Sheets. The full record with every field is always in the dataset behind it.

Use with AI assistants (MCP)

Available through the Apify MCP server, so an assistant or agent can pull live Spain property listings past idealista's anti-bot in a single call - compare prices per m2 across barrios, watch a market for new supply, or enrich an address list without anyone touching a browser.

Agent-ready: autonomous payments (x402 & Skyfire)

This actor is agent-ready — AI agents can discover it, run it, and pay for it autonomously, with no Apify account and no human in the loop. It uses pay-per-event pricing and limited permissions, so it qualifies for Apify's agentic-payment standards:

  • x402 — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the Apify MCP server — no account, no API key.
  • Skyfire — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

FAQ

Do I need an idealista account, API key or proxies? No. Everything needed to reach idealista is built in.

Can I scrape rentals as well as sales? Yes. alquiler-viviendas URLs work exactly like venta-viviendas ones, and price is then the monthly rent.

How many listings will I get per search URL? Up to 30 per page. maxPagesPerUrl decides how deep to go, and maxItems caps the whole run. A 5-page Madrid search has returned 150 unique listings (30 per page). Short page renders are refetched automatically (see Honest limits), and the status message tells you if any page stayed short. You only ever pay for the rows you actually receive.

Can I run it on a schedule? Yes - schedule the actor or any saved task in Apify and the results land in a dataset each time, ready for the API, a webhook, or an export to Sheets, S3 or your warehouse.

Does it get the full description and every photo from the detail page? No. It reads idealista's search-results cards, which carry the teaser description and the cover photo. That is what keeps it fast and cheap across thousands of listings.

Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by idealista or any of its subsidiaries. All trademarks mentioned are the property of their respective owners. It collects only publicly available listing information and is intended for lawful research, market analysis and comparable-pricing use. You are responsible for how you use the data, including compliance with applicable law.