Real estate
Idealista Property Scraper
Scrape idealista.com (Spain), idealista.it (Italy), and idealista.pt (Portugal) in one run with one normalized schema — EUR pricing, m², shared property-type taxonomy, energy rating — plus agency/lister enrichment (name, phone, particular vs. professional, agent reference id) neither incumbent ships together.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
Idealista is the shared real-estate platform behind idealista.com (Spain), idealista.it (Italy), and idealista.pt (Portugal) — the #1 property portal in every one of those markets. Cross-border investors and PropTech teams today stitch together three separate scrapes with three different schemas just to compare a Madrid flat to a Lisbon apartment. This Actor wraps all three TLDs into a single run and a single normalized schema — EUR pricing, m² area, a shared property-type taxonomy, and EU energy ratings — so a country field is the only thing that changes between rows. On top, it enriches each listing with agency and lister details (name, phone when publicly exposed, particular vs. professional, agent reference id) that most Idealista scrapers skip entirely.
What we handle for you
- 🛡️ A real browser engine, not a bare HTTP client — we drive an anti-detection browser through a same-context warm-up sequence so the target sees genuine browser traffic, never a bot signature.
- 🌐 Residential proxy rotation via Apify Proxy, pinned per country — a fresh exit IP on every retry, never the same flagged exit twice.
- 🧱 A geo-splash guard on every response — a mismatched exit can return a different country's listings at a clean 200; we catch and reject that before it ever reaches your dataset.
- 🔁 Automatic retries with a freshly rotated proxy session on any block signal.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, stable IDs, JSON / CSV / Excel export straight from the Apify Console.
- 💰 Pay-Per-Event pricing — you only pay for results that hit your dataset. No data, no charge.
Use cases
- Cross-border deal screening — compare sale listings in Madrid, Rome, and Lisbon side by side without normalizing three different scrapers' output yourself.
- Rental market benchmarking — track price-per-m² across ES/IT/PT rental markets in one dataset.
- Agency/lister lead lists — collect agency names, phone numbers (when public), and agent reference codes behind active listings.
- Relocation and expat services — build a unified property feed spanning three Southern European markets for client-facing search tools.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
countries | array | no | Countries to run (ES/IT/PT). Each country runs independently — one blocked country doesn't stop the others. |
searchUrls | array | no | Direct idealista.com / idealista.it / idealista.pt search URLs to scrape as-is. Country is inferred from the TLD. Up to 50. One of Search URLs or (Countries + Location) is required. |
location | string | no | idealista's own two-part search slug — municipality-province, e.g. 'madrid-madrid' (most municipalities do NOT share their province's name; find the exact slug by searching the location on idealista.com and copying it… |
operation | string | no | Sale vs. rent. Country-agnostic — mapped to the right per-TLD slug internally. |
propertyType | string | no | Shared property-type taxonomy across all three TLDs. |
maxResultsPerCountry | integer | no | Cap on rows per country; each country's cap is independent. |
enrichAgencyContact | boolean | no | Fetch each listing's detail page for agency/agent fields (name, phone when exposed, particular vs. professional, agent reference id). OFF by default: a measured 100-row run costs ~17x more residential-proxy transfer… |
proxyCountryMap | object | no | Override the proxy exit country per target country. Keys are a subset of ES/IT/PT. Idealista hard-localizes by IP — a mismatched exit silently returns the wrong country's listings. |
{
"countries": [
"ES"
],
"location": "madrid-madrid",
"operation": "sale",
"propertyType": "homes",
"maxResultsPerCountry": 3,
"enrichAgencyContact": true,
"proxyCountryMap": {
"ES": "ES",
"IT": "IT",
"PT": "PT"
},
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": [
"RESIDENTIAL"
]
}
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
listing_idurlcountryoperationproperty_typetitlepricecurrencyprice_per_sqmarea_sqmroomsbathroomsenergy_ratinglocation_citylocation_provinceagency_name
{
"listing_id": "34567890",
"url": "https://www.idealista.com/inmueble/34567890/",
"country": "ES",
"operation": "sale",
"property_type": "homes",
"title": "Piso en Malasa\u00f1a, Madrid",
"price": 425000.0,
"currency": "EUR",
"price_per_sqm": 5312.5,
"area_sqm": 80.0,
"rooms": 2,
"bathrooms": 1,
"floor": "3\u00ba ext",
"energy_rating": "D",
"location_address": null,
"location_neighborhood": "Malasa\u00f1a-Universidad",
"location_city": "Madrid",
"location_province": "Madrid",
"latitude": 40.4265,
"longitude": -3.7038,
"agency_name": "Example Inmobiliaria",
"agency_phone": "+34910000000",
"listing_owner_type": "professional",
"agent_reference_id": "REF-8891",
"listed_date": "2026-07-02",
"updated_date": "2026-08-05",
"description_snippet": "Precioso piso reformado a estrenar en pleno barrio...",
"image_urls": [
"https://img.idealista.com/example1.jpg"
],
"scraped_at": "2026-08-11T12:00:00+00:00"
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| Result row emitted | $0.0050 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
FAQ
Do I need an Idealista account or API key?
Why does this default to a residential proxy pinned per country?
Can I mix countries in one run?
Does agency_phone always populate?
Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Related Actors