Idealista Scraper avatar

Idealista Scraper

Pricing

from $0.40 / 1,000 results

Go to Apify Store
Idealista Scraper

Idealista Scraper

Scrape Idealista search results and listing detail pages from Spain, Italy, and Portugal using request-only HTTP with browser TLS impersonation. Supports pagination, optional detail enrichment, price-range splitting, search monitoring, and coverage reports.

Pricing

from $0.40 / 1,000 results

Rating

0.0

(0)

Developer

Blynx

Blynx

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Scrape property listings from Idealista in Spain, Italy, and Portugal. This Actor works with Idealista search URLs and individual listing URLs, extracts clean real estate data, and stores the results in an Apify dataset ready for JSON, CSV, Excel, API, or MCP workflows.

The scraper is request-only: it does not use Playwright, Puppeteer, Selenium, or a headless browser. It fetches Idealista HTML with browser TLS impersonation and parses the public page payloads directly.

What You Can Scrape

  • Search results from idealista.com, idealista.it, and idealista.pt
  • Individual property detail pages
  • Sale and rental listings
  • URLs with Idealista filters already applied
  • Generated search URLs from country, operation, and location slug
  • Optional detail enrichment for every search result

Key Features

  • Spain, Italy, and Portugal in one Actor
  • Request-only scraping with browser TLS impersonation
  • Search pagination with configurable page limits
  • Optional price-range splitting for broad searches
  • Coverage reports showing total results, pages fetched, pushed rows, and truncation
  • Optional monitoring mode for new, unchanged, price-changed, and removed listings
  • Search result fields: price, size, bedrooms, advertiser, photos, multimedia flags, floor, lift, tags, and listing URL
  • Detail page fields: description, address, city, province, coordinates, advertiser, features, energy information, gallery photos, and normalized amenity flags
  • Residential proxy support through Apify Proxy

Quick Start

Paste one or more Idealista search URLs:

{
"mode": "SEARCH",
"searchUrls": [
{ "url": "https://www.idealista.com/en/venta-viviendas/madrid-madrid/con-precio-hasta_400000,precio-desde_200000/" },
{ "url": "https://www.idealista.it/en/vendita-case/milano-milano/con-prezzo_400000,prezzo-min_200000/" },
{ "url": "https://www.idealista.pt/en/comprar-casas/lisboa/com-preco-max_400000,preco-min_200000/" }
],
"maxPagesPerSearch": 1,
"includeDetails": false,
"proxy": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

Or scrape one property detail page:

{
"mode": "DETAIL",
"detailUrls": [
{ "url": "https://www.idealista.com/en/inmueble/108563656/" }
],
"proxy": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

Input Modes

Use SEARCH mode when you want listings from a search or filtered results page.

{
"mode": "SEARCH",
"searchUrls": [
{ "url": "https://www.idealista.com/en/venta-viviendas/madrid-madrid/" }
],
"maxPagesPerSearch": 3,
"maxItems": 100,
"includeDetails": false
}

SEARCH mode emits property rows plus one _recordType=coverageReport row per search URL. The coverage report helps you see whether the search was truncated by your page limit.

DETAIL

Use DETAIL mode when you already have listing URLs or listing IDs.

{
"mode": "DETAIL",
"detailUrls": [
{ "url": "https://www.idealista.com/en/inmueble/108563656/" }
],
"rawOutput": false
}

DETAIL mode extracts the richer data available on the property page, including description, location, gallery photos, energy fields, and normalized facts such as bathrooms, terrace, balcony, wardrobes, air conditioning, heating, garden, swimming pool, storage room, and accessibility.

Generated URLs

You can also build search URLs from input fields instead of pasting full URLs.

{
"mode": "SEARCH",
"country": "ES",
"operation": "SALE",
"locationSlug": "madrid-madrid",
"minPrice": 200000,
"maxPrice": 400000,
"maxPagesPerSearch": 1
}

Supported countries:

  • ES for idealista.com
  • IT for idealista.it
  • PT for idealista.pt

Supported operations:

  • SALE
  • RENT
  • NEW_DEVELOPMENT

Price-Range Splitting

For broad searches, enable enablePriceSplitting to split the search into price ranges and reduce truncation.

{
"mode": "SEARCH",
"searchUrls": [
{ "url": "https://www.idealista.com/en/venta-viviendas/madrid-madrid/" }
],
"enablePriceSplitting": true,
"maxPagesPerSearch": 20,
"maxSplitDepth": 2,
"maxItems": 0
}

The Actor records a coverage report for every search URL. The report includes:

  • reported total results
  • reported pages
  • pages fetched
  • rows pushed
  • duplicate skips
  • range count
  • truncation status

If a range is still too large, the truncated field tells you that the current input limits did not cover the full result set.

Monitoring Mode

Set monitoring=true to compare a search with previous runs stored in a named key-value store.

{
"mode": "SEARCH",
"searchUrls": [
{ "url": "https://www.idealista.com/en/alquiler-viviendas/barcelona-barcelona/" }
],
"monitoring": true,
"monitoringStoreName": "idealista-monitoring"
}

Property rows can be marked as:

  • new
  • unchanged
  • price_changed

When a run is not truncated, removed listings can be emitted as _recordType=change rows.

Output

Each dataset item has _recordType so you can distinguish property rows, coverage reports, change rows, and error rows.

Search Result Example

{
"_recordType": "property",
"source": "idealista",
"propertyId": "108563656",
"url": "https://www.idealista.com/en/inmueble/108563656/",
"title": "Flat / apartment in Calle Simpatia, 11, El Canaveral, Madrid",
"price": "327,000 EUR",
"priceValue": 327000,
"currency": "EUR",
"sizeM2": 64,
"bedrooms": 1,
"advertiserName": "Soldit Homes",
"photoCount": 13,
"hasVideo": false,
"has3DTour": false,
"hasFloorPlan": true,
"country": "ES"
}

Detail Result Example

{
"_recordType": "property",
"source": "idealista",
"propertyId": "108563656",
"title": "Flat / apartment for sale in Calle Simpatia, 11",
"price": "327,000 EUR",
"priceValue": 327000,
"sizeM2": 64,
"bedrooms": 1,
"bathrooms": 1,
"address": "Calle Simpatia, 11",
"city": "Madrid",
"province": "Madrid city, Madrid",
"advertiserName": "Soldit Homes",
"photoCount": 13,
"url": "https://www.idealista.com/en/inmueble/108563656/"
}

Fields vary by listing and by country. Idealista sometimes hides exact addresses, coordinates, or advertiser details, so those fields can be null.

Important Fields

Common property fields include:

  • propertyId
  • url
  • title
  • price
  • priceValue
  • currency
  • priceByArea
  • sizeM2
  • bedrooms
  • bathrooms
  • floorText
  • floorNumber
  • hasLift
  • exterior
  • description
  • address
  • neighborhood
  • district
  • city
  • province
  • latitude
  • longitude
  • advertiserName
  • advertiserUrl
  • photos
  • photoCount
  • hasVideo
  • has3DTour
  • hasFloorPlan
  • energyConsumption
  • energyEmissions
  • hasTerrace
  • hasBalcony
  • hasAirConditioning
  • hasHeating
  • hasGarden
  • hasSwimmingPool
  • hasStorageRoom

Pricing Notes

This Actor uses pay-per-event pricing with the dataset item as the primary event. In SEARCH mode, the Actor writes property rows and coverage report rows to the default dataset. In DETAIL mode, it writes one dataset row per processed detail URL, either a property row or an error row if the URL could not be fetched.

Proxy and Blocking Notes

Idealista uses anti-bot protection, and cloud datacenter IPs can be challenged. Residential proxies are recommended on Apify:

{
"proxy": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

The Actor retries proxy errors and DataDome challenge pages. If one search URL fails and failOnSearchError=false, the run continues and writes an _recordType=error item for that URL.

Contact Phones

includeContactPhones is available as an experimental option. Idealista's contact-phone AJAX endpoint is stricter than the public HTML pages and can return DataDome challenges even when listing pages load correctly. For stable production runs, keep includeContactPhones=false.

Limits and Recommendations

  • Start with maxPagesPerSearch=1 for tests.
  • Use maxItems to cap large runs.
  • Use residential proxies for production runs.
  • Enable enablePriceSplitting for very broad searches.
  • Use includeDetails=true only when you need detail-page fields for every search result, because it adds one extra request per listing.
  • Keep failOnSearchError=false for large batches so one blocked URL does not stop the whole run.

FAQ

Does this Actor use a browser?

No. It is request-only and uses browser TLS impersonation via HTTP requests.

Can it scrape Spain, Italy, and Portugal?

Yes. It supports Idealista's .com, .it, and .pt domains.

Can I paste filtered Idealista URLs?

Yes. The Actor respects existing Idealista URL filters such as price ranges, sale/rent paths, and location slugs.

Does it always return phone numbers or emails?

No. Emails are not exposed on normal listing pages, and phone endpoints are protected more strictly. The Actor focuses on stable listing, advertiser, location, feature, and photo data.

Why do I see truncated=true in coverage reports?

It means the reported number of pages is higher than your maxPagesPerSearch setting. Increase the page limit or enable price splitting if you need broader coverage.

Why are there coverage report rows in my dataset?

Coverage reports make search runs auditable. They tell you how many results Idealista reported, how many pages were fetched, and whether the run was truncated.