Idealista Scraper
Pricing
from $0.40 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
15
Total users
10
Monthly active users
5 days ago
Last modified
Categories
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 included | Real contact numbers, resolved automatically โ no extra toggle, no captcha |
| ๐ Search & ๐ detail | Scrape result pages or individual listings โ or let Auto-detect decide |
| ๐ 3 countries | idealista.com, idealista.it, idealista.pt |
| ๐ฐ Sale / rent / new-build | Build URLs from a location, or paste your own filtered URLs |
| ๐ช Full-coverage mode | Price-range splitting beats Idealista's pagination cap on big cities |
| ๐ Monitoring | Detect new / unchanged / price_changed / removed between runs |
| ๐ก๏ธ Anti-block built in | Safari TLS impersonation + residential proxy + smart retries |
| โก No browser | Pure HTTP requests โ cheap, fast, low memory |
๐ Quick start
๐ Scrape a search
{"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
modeon Auto-detect (the default), detail URLs / listing IDs / a dataset trigger DETAIL mode; anything else runs SEARCH.
๐งญ Modes
| Mode | Use it for | You get |
|---|---|---|
| ๐ AUTO (default) | Just paste URLs and let the actor choose | DETAIL for detail URLs / IDs / dataset, otherwise SEARCH |
| ๐ SEARCH | Result pages, region pages, filtered searches, generated URLs | One row per listing, optionally enriched with detail fields |
| ๐ DETAIL | Single property URLs, listing IDs, or a previous dataset | Full 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
| Field | Description |
|---|---|
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)
| Field | Description |
|---|---|
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
| Field | Description |
|---|---|
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
| Field | Description |
|---|---|
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
| Field | Description |
|---|---|
monitoring | ๐ Label listings new / unchanged / price_changed / removed |
monitoringStoreName | ๐พ Named key-value store for snapshots |
๐ Network & anti-block (advanced โ good defaults)
| Field | Description |
|---|---|
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 (withsourceUrlanderror)_recordType: "coverageReport"โ per-search summary: totals, pages fetched, whether results were truncated_recordType: "change"โ aremovedlisting (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.
๐๏ธ Recommended settings
๐ฉน Troubleshooting
| Symptom | Fix |
|---|---|
| ๐ Fewer results than expected | Raise maxPagesPerSearch, enable enablePriceSplitting, or split a big city into smaller searches |
| ๐ณ๏ธ Detail fields missing in SEARCH | Enable includeDetails, or run DETAIL mode on the URLs / dataset |
| ๐ก๏ธ Hitting blocks | Keep Apify Residential proxy on, lower maxConcurrency, raise retry budgets |
| ๐ Phone empty | The 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. ๐