Idealista Property Scraper icon

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.

FieldTypeRequiredWhat 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

EventPriceWhen
Actor start$0.20Once per run, covers warm-up and proxy session setup.
Result row emitted$0.0050Per 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?
No. This Actor scrapes Idealista's own publicly listed property data across all three TLDs — no login, no API key.
Why does this default to a residential proxy pinned per country?
Idealista localizes by IP — a mismatched exit can silently return a different country's listings. We default every request to a RESIDENTIAL proxy pinned to the target country so ES/IT/PT runs never cross-contaminate.
Can I mix countries in one run?
Yes — set countries to any combination of ES/IT/PT (or supply direct searchUrls), and each country is fetched independently; one blocked country never stops the others.
Does agency_phone always populate?
Only when enrichAgencyContact is true and the number is publicly exposed on the listing; otherwise it's null.

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

Teams that run this also run