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
Kelopr
Maintained by CommunityActor stats
0
Bookmarked
31
Total users
11
Monthly active users
2 days ago
Last modified
Categories
Share
Every property, every price signal, and every available advertiser contact โ exported as structured JSON.
Scrape Idealista properties from Spain, Italy, and Portugal with prices, advertiser phones, locations, photos, pagination, detail enrichment, monitoring, and coverage reports. Request-only, no login.
All examples below use fictional DEMO-* identifiers, reserved .test domains, and masked contact details. They do not represent real people, listings, products, or companies.
๐ What this Actor does
- Flexible collection:
AUTO,SEARCH,DETAIL,Monitoring. - Structured output: clean JSON records organized into
overview,pricing,contacts,locationviews. - Production-ready: concurrency, retries, proxy support, limits, and source-aware diagnostics are exposed through the Actor input.
- Easy automation: run from the Apify Console, API, schedules, webhooks, Make, Zapier, or any HTTP client.
๐๏ธ Modes and workflows
| Mode or workflow | What it does |
|---|---|
AUTO | Detect whether each input is a search page, detail page, listing ID, or prior dataset. |
SEARCH | Paginate search pages, split saturated price ranges when enabled, and optionally enrich every listing. |
DETAIL | Fetch exact property URLs or IDs and return the richest listing record available. |
Monitoring | Compare a named snapshot and label new, changed, unchanged, or removed properties. |
๐ก Common use cases
- Property comps and price-per-area analysis
- Advertiser and agency lead generation
- Listing inventory and price-change monitoring
๐ฅ Input schema
Configure the Actor in the Input tab or send the same JSON through the API. Fields not needed for your workflow can be omitted.
| Field | Type | Description | Default |
|---|---|---|---|
mode | string | ๐ Auto-detect (recommended) routes every target by type and can run SEARCH and DETAIL together when your input is mixed. Force a mode only when every target belongs to that mode. Allowed: AUTO, SEARCH, DETAIL. | AUTO |
searchUrls | array | ๐ Idealista search / result URLs from idealista.com, idealista.it or idealista.pt. Any filters already in the URL (location, rooms, priceโฆ) are respected. Used in SEARCH mode. | โ |
detailUrls | array | ๐ Individual property page URLs (e.g. โฆ/inmueble/106387165/). Used in DETAIL mode. | โ |
startUrls | array | ๐งฉ Mixed bag of Idealista URLs. Search URLs feed SEARCH mode, detail URLs feed DETAIL mode โ handy when you don't want to sort them yourself. | [] |
listingIds | array<string> | ๐ Raw Idealista listing IDs (the number in the URL). They are turned into detail URLs using the Country + Language settings below. Used in DETAIL mode. | [] |
datasetId | string | ๐๏ธ Re-scrape a previous run: pick a dataset and the actor pulls propertyId / adId / url / detailUrl from every item. Used in DETAIL mode. | โ |
country | string | ๐ Country used when building URLs from a location slug or listing IDs. Allowed: ES, IT, PT. | ES |
operation | string | ๐ท๏ธ Buy, rent or new-development โ used only when building search URLs from a location slug. Allowed: SALE, RENT, NEW_DEVELOPMENT. | SALE |
locationSlug | string | ๐ A single Idealista location slug, e.g. madrid-madrid, milano-milano, lisboa. For exact filters prefer pasting a Search URL instead. | โ |
locationSlugs | array<string> | ๐ Several location slugs at once โ one search URL is generated per slug. | [] |
language | string | ๐ฃ๏ธ Language segment for generated URLs. Use en for English output where Idealista offers it (e.g. โฆ/en/โฆ). | en |
minPrice | integer | ๐ถ Only listings at or above this price. Replaces any price filter already present in the search URL. | โ |
maxPrice | integer | ๐ถ Only listings at or below this price. Replaces any price filter already present in the search URL. | โ |
maxItems | integer | ๐ข Hard cap on how many property rows are saved. Set 0 for unlimited. | 100 |
maxPagesPerSearch | integer | ๐ How many result pages to walk for each search URL (or price range). Idealista shows ~30 listings per page. | 3 |
maxDetailUrls | integer | ๐ข Cap on how many URLs DETAIL mode collects from inputs/datasets. Set 0 for no cap. | 0 |
enablePriceSplitting | boolean | ๐ช Idealista caps big searches at a limited number of pages. Turn this on to slice a broad search into price bands, grab far more listings, and get a coverage report per band. | false |
maxSplitDepth | integer | ๐ช How aggressively to keep splitting a price band that still has more pages than the page cap. Higher = more coverage, more requests. | 1 |
includeDetails | boolean | โ Fetch each listing's detail page during a SEARCH run to add full description, features, photos, coordinates and more. Slower โ one extra request per listing (parallelised up to Max concurrency). | false |
rawOutput | boolean | ๐งช Add the parsed raw JS config objects (_rawConfig, _rawMapConfig) to detail records. For debugging / power users. | false |
monitoring | boolean | ๐ Compare this run against the previous snapshot and label every listing new / unchanged / price_changed / removed. | false |
monitoringStoreName | string | ๐พ Named key-value store that holds the snapshots between runs. Use a distinct name per saved search. | idealista-monitoring |
proxy | object | ๐ Idealista is behind DataDome, so residential proxies are strongly recommended. Defaults to Apify Residential; datacenter / no-proxy runs are almost always challenged. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
preferDirect | boolean | ๐ธ Try one direct request first. If it succeeds, the run avoids residential traffic; if DataDome blocks it, the Actor automatically falls back to the configured proxy. | true |
maxConcurrency | integer | โก How many detail requests run in parallel (DETAIL mode and includeDetails enrichment). Lower it if you see blocking. | 5 |
maxRetries | integer | ๐ General retry budget per request (network hiccups, unexpected statuses). | 4 |
maxProxyRetries | integer | ๐ Retry budget dedicated to proxy / transport failures, with a fresh proxy each time. | 4 |
maxBlockRetries | integer | ๐ก๏ธ Retry budget dedicated to DataDome challenge pages โ each retry rotates the session/IP. | 4 |
requestTimeoutSecs | integer | โฑ๏ธ Per-request timeout in seconds. | 30 |
failOnSearchError | boolean | ๐จ Off by default: a failing search URL is logged as an error row and remaining URLs continue. Turn on to stop the remaining search URLs safely after the first error; the run still finishes successfully with diagnostics. | false |
impersonateProfile | string | ๐ญ curl_cffi browser fingerprint for HTML pages. Safari currently passes Idealista best โ change only if you know what you're doing. | safari |
acceptLanguage | string | ๐ฃ๏ธ HTTP Accept-Language header sent with each request. | en-US,en;q=0.9 |
โถ๏ธ Example input
{"mode": "SEARCH","searchUrls": ["https://www.idealista.com/en/venta-viviendas/demo-city/"],"maxItems": 50,"includeDetails": true,"monitoring": true,"monitoringStoreName": "demo-market-watch"}
๐ฆ Output schema
Each successful item is written to the default dataset. Select a dataset view in the Apify Console or export the full dataset as JSON, CSV, Excel, XML, or RSS.
overview โ Properties
A compact table for fast scanning and export.
Fields: _recordType, propertyId, changeStatus, title, subtitle, thumbnail, price, priceValue, priceByAreaValue, currency, sizeM2, bedrooms, bathrooms, floorNumber, condition, yearBuilt, hasLift, hasTerrace, hasBalcony, hasAirConditioning, heatingType, energyConsumptionValue, energyEmissionsValue, address, city, province, photoCount, isHighlighted, hasVideo, has3DTour, advertiserName, phone, phoneFormatted, phoneRequiresLogin, secondaryPhone, url, scrapedAt
pricing โ Pricing & size
Price-focused records for analysis and monitoring.
Fields: propertyId, title, thumbnail, price, priceValue, priceByArea, priceByAreaValue, currency, sizeM2, bedrooms, bathrooms, operation, typology, url
contacts โ Advertiser & contacts
Public contact evidence and normalized contact fields.
Fields: propertyId, title, advertiserLogo, advertiserName, advertiserUrl, ownerType, phone, phoneFormatted, phoneLocal, phonePrefix, phoneRequiresLogin, secondaryPhone, url
location โ Location
Normalized property location fields.
Fields: propertyId, title, address, neighborhood, district, city, province, country, latitude, longitude, url
๐ค Example output
{"_recordType": "property","propertyId": "DEMO-106387","changeStatus": "new","title": "Demo two-bedroom apartment","price": "โฌ325,000","priceValue": 325000,"currency": "EUR","sizeM2": 86,"bedrooms": 2,"bathrooms": 2,"phoneFormatted": "+34 600 XXX XXX","url": "https://www.idealista.com/inmueble/DEMO-106387/"}
Missing source values are returned as null, empty arrays, or documented availability/status fields; the Actor does not invent unavailable source data.
๐ API example
Replace the placeholder with an Apify token and send the same input used in the Console:
curl -X POST "https://api.apify.com/v2/acts/trakk~idealista-scraper/runs?token=<YOUR_APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"mode": "SEARCH", "searchUrls": ["https://www.idealista.com/en/venta-viviendas/demo-city/"], "maxItems": 50, "includeDetails": true, "monitoring": true, "monitoringStoreName": "demo-market-watch"}'
For synchronous integrations, use the run-sync-get-dataset-items API endpoint. For larger jobs, start an asynchronous run and consume its default dataset when the run succeeds.
๐งฉ Automation and exports
- Schedule recurring runs from the Apify Console.
- Trigger downstream systems with webhooks when a run succeeds or fails.
- Reuse named monitoring keys or stores where the selected workflow supports change tracking.
- Export dataset views to JSON, CSV, Excel, XML, or RSS, or access items through the Apify API.
โ FAQ
Do I need a login or browser session?
Use only the inputs shown in the Actor schema. If authentication or cookies are supported, the relevant encrypted field is explicitly available in the Input tab; otherwise no account is required.
Why can some fields be empty?
Source pages vary by region, content type, privacy settings, and availability. Optional enrichment also depends on the selected mode. Empty values are preserved honestly instead of being guessed.
How should I run this at scale?
Start with a small representative input, inspect the dataset and cost, then raise item limits and concurrency gradually. Use Apify Proxy when the schema exposes it, and use schedules plus monitoring keys for recurring collection.
Is the example data real?
No. Every example in this README is intentionally fictional and uses demo identifiers, reserved domains, or masked contact values.
