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

15

Total users

10

Monthly active users

5 days ago

Last modified

Share

๐Ÿ  Idealista Scraper

Fast, request-only scraper for Idealista โ€” Spain ๐Ÿ‡ช๐Ÿ‡ธ, Italy ๐Ÿ‡ฎ๐Ÿ‡น and Portugal ๐Ÿ‡ต๐Ÿ‡น. Pull prices, full listing details, GPS, photos and advertiser phone numbers ๐Ÿ“ž โ€” no browser, no captcha solving.

Point it at a search URL or a listing URL, press Start, and get clean structured data: one row per property. Perfect for real-estate datasets, market analysis, lead generation, competitor tracking and price monitoring.


โœจ Highlights

๐Ÿ“ž Advertiser phones includedReal contact numbers, resolved automatically โ€” no extra toggle, no captcha
๐Ÿ”Ž Search & ๐Ÿ“„ detailScrape result pages or individual listings โ€” or let Auto-detect decide
๐ŸŒ 3 countriesidealista.com, idealista.it, idealista.pt
๐Ÿ’ฐ Sale / rent / new-buildBuild URLs from a location, or paste your own filtered URLs
๐Ÿช“ Full-coverage modePrice-range splitting beats Idealista's pagination cap on big cities
๐Ÿ” MonitoringDetect new / unchanged / price_changed / removed between runs
๐Ÿ›ก๏ธ Anti-block built inSafari TLS impersonation + residential proxy + smart retries
โšก No browserPure HTTP requests โ†’ cheap, fast, low memory

๐Ÿš€ Quick start

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

๐Ÿ“„ Scrape specific listings

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

๐Ÿ—๏ธ Let the actor build the URL for you

{
"country": "ES",
"operation": "SALE",
"locationSlug": "madrid-madrid",
"language": "en",
"maxItems": 100
}

๐Ÿ’ก Just paste URLs and go. With mode on Auto-detect (the default), detail URLs / listing IDs / a dataset trigger DETAIL mode; anything else runs SEARCH.


๐Ÿงญ Modes

ModeUse it forYou get
๐Ÿ”€ AUTO (default)Just paste URLs and let the actor chooseDETAIL for detail URLs / IDs / dataset, otherwise SEARCH
๐Ÿ”Ž SEARCHResult pages, region pages, filtered searches, generated URLsOne row per listing, optionally enriched with detail fields
๐Ÿ“„ DETAILSingle property URLs, listing IDs, or a previous datasetFull detail records for each listing

๐Ÿ“ž How phone numbers work

Idealista hides the advertiser's real number behind a captcha-gated widget on the website. This actor skips the website entirely for phones and asks Idealista's mobile-app API โ€” the same backend the official Android/iOS app uses โ€” which returns the number as plain JSON.

listing โ”€โ”€โ–บ HTML page (curl_cffi + Safari TLS) โ”€โ”€โ–บ price, details, photos, GPS
โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ mobile app API (signed request) โ”€โ”€โ–บ ๐Ÿ“ž advertiser phone

โœ… No captcha ยท โœ… no browser ยท โœ… no paid solver โ€” phones come for free with every run.

Phone fields (populated when Idealista exposes them): phone, phoneFormatted, phoneLocal, phonePrefix, phoneRequiresLogin, secondaryPhone, secondaryPhoneFormatted.


โš™๏ธ Input reference

The input form is grouped into sections โ€” you rarely need more than the first one.

๐ŸŽฏ What to scrape

FieldDescription
mode๐Ÿ”€ AUTO (default) / SEARCH / DETAIL
searchUrls๐Ÿ”Ž Idealista search / result URLs (SEARCH)
detailUrls๐Ÿ“„ Individual property URLs (DETAIL)
startUrls๐Ÿงฉ Mixed URLs, routed by their type
listingIds๐Ÿ†” Raw listing IDs (DETAIL)
datasetId๐Ÿ—‚๏ธ Re-scrape a previous run's dataset

๐Ÿ—๏ธ Build search URLs from a location (optional)

FieldDescription
country๐ŸŒ ES / IT / PT
operation๐Ÿท๏ธ SALE / RENT / NEW_DEVELOPMENT
locationSlug, locationSlugs๐Ÿ“ e.g. madrid-madrid, milano-milano, lisboa
language๐Ÿ—ฃ๏ธ URL language segment, e.g. en

๐Ÿ’ถ Filters & limits

FieldDescription
minPrice, maxPrice๐Ÿ’ถ Price filter (replaces any in the URL)
maxItems๐Ÿ”ข Output cap ยท 0 = unlimited
maxPagesPerSearch๐Ÿ“„ Pages per search / price band
maxDetailUrls๐Ÿ”ข Cap on DETAIL inputs ยท 0 = no cap

๐Ÿ”ฌ Coverage & enrichment

FieldDescription
enablePriceSplitting๐Ÿช“ Split broad searches into price bands for full coverage
maxSplitDepth๐Ÿช“ How deep to keep splitting
includeDetailsโž• Enrich each search result with its detail page
rawOutput๐Ÿงช Add raw parsed JS config to detail records

๐Ÿ” Monitoring

FieldDescription
monitoring๐Ÿ” Label listings new / unchanged / price_changed / removed
monitoringStoreName๐Ÿ’พ Named key-value store for snapshots

๐ŸŒ Network & anti-block (advanced โ€” good defaults)

FieldDescription
proxy๐ŸŒ Defaults to Apify Residential (recommended)
maxConcurrencyโšก Parallel detail requests
maxRetries, maxProxyRetries, maxBlockRetries๐Ÿ” Retry budgets (general / proxy / DataDome)
requestTimeoutSecsโฑ๏ธ Per-request timeout
failOnSearchError๐Ÿšจ Abort the run if a search URL fails
impersonateProfile, acceptLanguage๐ŸŽญ TLS fingerprint & language header

๐Ÿ“ฆ Output

One dataset item per listing. Example detail record (trimmed):

{
"_recordType": "property",
"source": "idealista",
"propertyId": "106387165",
"url": "https://www.idealista.com/en/inmueble/106387165/",
"title": "Flat in Madrid",
"price": "450,000 euro",
"priceValue": 450000,
"currency": "EUR",
"sizeM2": 92,
"bedrooms": 3,
"bathrooms": 2,
"floorNumber": 4,
"hasLift": true,
"hasTerrace": true,
"address": "Madrid",
"city": "Madrid",
"province": "Madrid",
"latitude": 40.4168,
"longitude": -3.7038,
"advertiserName": "Example Agency",
"phone": "+34919017396",
"phoneFormatted": "919 01 73 96",
"phoneLocal": "919017396",
"phonePrefix": "34",
"phoneRequiresLogin": false,
"photoCount": 24,
"country": "ES"
}

โ„น๏ธ Empty fields mean Idealista didn't expose that value for the listing or country.

๐Ÿงพ Special rows

Alongside property rows, the dataset may contain:

  • _recordType: "error" โ€” a URL that failed (with sourceUrl and error)
  • _recordType: "coverageReport" โ€” per-search summary: totals, pages fetched, whether results were truncated
  • _recordType: "change" โ€” a removed listing (monitoring mode)

๐Ÿช“ Full-coverage price splitting

Idealista stops paginating broad searches after a limited number of pages, so a huge city can silently truncate. Turn on splitting to slice the search into price bands and recover the long tail:

{
"enablePriceSplitting": true,
"maxSplitDepth": 2,
"maxPagesPerSearch": 10
}

Each run emits a coverageReport row per band so you can see exactly what was covered and what (if anything) was still truncated.


๐Ÿ” Monitoring

Run the same search on a schedule and diff it against the previous snapshot:

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

Every listing is labelled new, unchanged, price_changed (with previousPriceValue) or removed. Use a distinct store name per saved search.



๐Ÿฉน Troubleshooting

SymptomFix
๐Ÿ˜• Fewer results than expectedRaise maxPagesPerSearch, enable enablePriceSplitting, or split a big city into smaller searches
๐Ÿ•ณ๏ธ Detail fields missing in SEARCHEnable includeDetails, or run DETAIL mode on the URLs / dataset
๐Ÿ›ก๏ธ Hitting blocksKeep Apify Residential proxy on, lower maxConcurrency, raise retry budgets
๐Ÿ“ž Phone emptyThe advertiser hides it (phoneRequiresLogin: true) or Idealista didn't expose it for that listing

๐Ÿ’ฌ Feature requests & issues

Need a new field, a different format, or a workflow this actor doesn't cover yet? Hit a listing that doesn't parse? Open an issue on the actor's page in Apify Console and include the run ID, your input, what you expected, and a short sample of the data you need. Clear reports get fixed faster. ๐Ÿ™Œ