Idealista Scraper avatar

Idealista Scraper

Deprecated

Pricing

from $0.005 / property listing

Go to Apify Store
Idealista Scraper

Idealista Scraper

Deprecated

Fast Idealista scraper for Spain, Italy, and Portugal. Returns 100+ fields per listing including AI summaries, Q&A pairs, deal signals, engagement scores, and price tracking. Supports 60+ search filters, multiple locations per run, and outputs data optimized for RAG pipelines and answer engines.

Pricing

from $0.005 / property listing

Rating

0.0

(0)

Developer

Datacut

Datacut

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

2

Monthly active users

2 months ago

Last modified

Share

Fast, lightweight scraper for Idealista real estate listings in Spain, Italy, and Portugal. Extracts 100+ fields per listing with AI-ready enrichment for RAG, vector search, and answer engines.

Built by datacut — AI-first data extraction.

Features

  • 60+ search filters — every filter Idealista supports (property type, price, size, features, rental criteria, and more)
  • Full property details — floor plans, energy certificates, building characteristics, agent info
  • Engagement stats — views, emails, favorites, shares per listing
  • AI/LLM enrichment — 15+ computed fields for RAG, AEO, classification, and analytics
  • Price tracking — cross-run price change detection with delta and percentage
  • 3 countries — Spain (13,400+ locations), Italy, Portugal
  • Multiple locations — search across multiple cities in a single run with deduplication
  • Self-healing — adaptive pacing, circuit breaker, identity rotation, checkpoint/resume
  • Proxy pool — rotate across multiple HTTP/HTTPS proxies on identity change
  • Graceful shutdown — SIGINT/SIGTERM saves progress, resume from checkpoint
  • Discord/Slack alerts — breaker trips, identity rotations, run summaries
  • Low resource usage — ~15MB Docker image, 128MB RAM, no browser needed

Quick Start

# Build
go build -o ./idealista-scraper .
# Search by city name
APIFY_INPUT='{"location":"Madrid","maxItems":10}' ./idealista-scraper
# Search with filters
APIFY_INPUT='{"location":"Barcelona","operation":"rent","maxItems":20,"minPrice":500,"maxPrice":1500,"bedrooms":"2","elevator":true}' ./idealista-scraper
# Full details + stats (best for AI)
APIFY_INPUT='{"location":"Madrid","maxItems":5,"fetchDetails":true,"fetchStats":true}' ./idealista-scraper
# Multiple locations
APIFY_INPUT='{"locations":["Madrid","Barcelona","Valencia"],"maxItems":100}' ./idealista-scraper
# With proxy pool + Discord alerts
APIFY_INPUT='{"location":"Madrid","maxItems":50,"proxyUrls":["http://user:pass@proxy1:8080"],"webhookUrl":"https://discord.com/api/webhooks/..."}' ./idealista-scraper
# Docker
docker build -t idealista-scraper .
docker run -e APIFY_INPUT='{"location":"Madrid","maxItems":5}' idealista-scraper

Input

Core

ParamTypeDefaultDescription
countrystring"es"Country: es (Spain), it (Italy), pt (Portugal)
operationstring"sale"sale or rent
propertyTypestring"homes"homes, offices, premises, garages, lands, bedrooms, storageRooms, buildings
locationstringCity name ("Madrid") or location ID ("0-EU-ES-28")
locationsstring[]Multiple locations, max 10 (searched sequentially, results deduplicated)
propertyCodesstring[]Specific listing IDs to fetch (max 100)
maxItemsint50Max listings to collect (max 500 per run)
sortBystring"relevance"relevance, price_asc, price_desc, size_asc, size_desc, date_desc, price_per_m2_asc, price_drop

Price & Size

ParamTypeDescription
minPrice / maxPricefloatPrice range (EUR)
minSize / maxSizefloatSize range (m²)
bedroomsstringBedrooms (e.g. "2", "3+")
bathroomsstringBathrooms

Property Subtypes (boolean)

flat, penthouse, duplex, studio, chalet, countryHouse

Building Features (boolean)

airConditioning, elevator, garage, garden, swimmingPool, terrace, storeRoom, builtinWardrobes, exterior, heating, hotWater, security, corner, smokeVentilation, clotheslineSpace, accessible, luxury, seaViews

Multimedia (boolean)

virtualTour, pictures, professionalVideo, hasPlan

Building Details

ParamTypeDescription
furnishedstringFurnishing status
preservationsstringConservation status
floorHeightsstringFloor height filter
buildingTypestringBuilding type
buildingTypesstring[]Multiple building types

Listing Type (boolean)

bankOffer, newDevelopment, stateSubsidized, rentToOwn, finished, transfer

Owner

ParamTypeDescription
ownerTypestring"privateOwner" or "professionalOwner"

Rental / Roommate

ParamTypeDescription
petsAllowedboolPets allowed
petsPolicystringPet policy
childrenAllowedboolChildren allowed
couplesAllowedboolCouples allowed
gayPartnersboolLGBTQ+ friendly
newGenderstringGender preference
housematesstringHousemate info
occupationstringOccupancy type
ownerNotLivingboolOwner not living in property
smokingPolicystringSmoking policy

Other Filters

ParamTypeDescription
sinceDatestringListing date filter (T=today, W=week, M=month, Y=year)
distanceintDistance radius (meters)
promotionIdstringPromotion ID
agencystringAgency filter
landTypesstring[]Land type filter
typologiesstring[]Property typologies
subTypologystring[]Sub-typologies

Data Fetching

ParamTypeDefaultDescription
fetchDetailsboolfalseFull details per listing (energy cert, characteristics, comments). +1 API call/listing.
fetchStatsboolfalseEngagement stats (views, emails, favorites). +1 API call/listing.

Proxy & Notifications

ParamTypeDescription
proxyUrlstringSingle proxy URL
proxyUrlsstring[]Proxy pool — rotated on identity change
webhookUrlstringDiscord/Slack webhook for real-time alerts

Output

Base Listing Fields

Every listing includes all fields returned by Idealista's API:

propertyCode, propertyType, operation, country, price, priceByArea, size, rooms, bathrooms, floor, address, municipality, district, neighborhood, province, latitude, longitude, description, url, thumbnail, status, exterior, hasLift, numPhotos, contactInfo, features, parkingSpace, multimedia, suggestedTexts, priceDropPercentage, priceDropValue

With fetchDetails: true: moreCharacteristics, ubication, energyCertification, propertyComment, comments, priceReferenceIndex, labels

With fetchStats: true: stats (views, emails, favourites, shares)

AI/LLM Enrichment

Every listing is enriched with computed fields optimized for AI consumption:

FieldTypeDescription
aiSummarystringNatural language paragraph — reads like an analyst brief. Includes engagement, area pricing, amenities, market signals.
llmContextobjectFlat, denormalized key-value map. No nested JSON to parse. Omits empty/null/zero values to save tokens.
keyFactsstring[]Scannable bullet-point array: ["3-bed/2-bath, 120m²", "€10/m²", "A/C", "Pool", "90 views, 27 saves"]
qaReadyobject[]Pre-computed Q&A pairs for Answer Engine Optimization (AEO). Matches how people search: "How much is a 3-bedroom flat to rent in Sitges?"
amenitiesstring[]Flat, deduplicated amenity list extracted from all nested sources (features, characteristics, parking, energy cert).
tagsstring[]Keyword array for faceted search and RAG classification. Covers: type, operation, features, price bracket, engagement tier, location, seller type.
searchableTextstringDense plain-text blob for vector embeddings and full-text search. Includes both metric and imperial, English translations from multilingual comments.
engagementScorefloatWeighted 0-100 composite of views, favorites, contacts, shares. Log-scaled.
priceContextobjectArea comparison: vsAreaMedianPercent, pricePosition (well-below-average to well-above-average), areaMedianPricePerM2. Falls back from municipality to province for small datasets.
dataQualityobjectCompleteness score (0-100) with weighted field breakdown and list of missing fields.
rankInAreaobjectRelative position within municipality: cheapest-in-area, largest-in-area, most-popular-in-area, priceRank, totalInArea.
dealIndicatorstringMarket timing signal: hot-deal, price-reduced, just-listed, trending, fresh, stable, aging, stale
daysOnMarketintMulti-signal estimated listing age (engagement-based when API dates are unreliable)
daysOnMarketEstimatedbooltrue when age is estimated from engagement data rather than exact dates
priceSegmentstringbudget, mid, upper, premium, luxury (rent-aware thresholds)
goldenVisaEligibleboolInvestment threshold check (>=500k in ES/PT)
sizeInSqftfloatImperial size conversion
priceByAreaSqftfloatPrice per sqft
googleMapsUrlstringDirect Google Maps link

Price Tracking

On repeat runs, each listing gets:

FieldTypeDescription
isNewbooltrue if listing wasn't in previous run
priceChangefloatAbsolute price change (EUR)
previousPricefloatPrice from previous run
priceChangePercentfloatPercentage change

Example AI Summary

3-bedroom flat for rent at €1,600/month in Sitges, Barcelona. The property offers 102m² (1,098 sqft) with 3 bedrooms and 2 bathrooms on floor 1. Features include elevator, exterior-facing, parking available, and pets allowed. Very high interest: 2937 views, 236 saves. At €16/m², this is 10% above the area median. Seasonal rental — limited-term contract. Listed by ABC Inmobiliaria (agency).

Example keyFacts

["3-bed/2-bath, 102m²", "€16/m²", "Good condition", "Elevator", "Exterior", "Parking", "Pets OK", "Energy INPROCESS", "2937 views, 236 saves", "Seasonal rental"]

Example qaReady

[
{"q": "How much is a 3-bedroom flat to rent in Sitges?", "a": "€1,600/month for a 102m² 3-bedroom flat (listing 109185499)."},
{"q": "How big are 3-bedroom flats in Sitges?", "a": "This 3-bedroom flat in Sitges is 102m² (1,098 sqft)."},
{"q": "What amenities does this flat in Sitges have?", "a": "This property includes: elevator, exterior-facing, parking available, and pets allowed."},
{"q": "Are there pet-friendly flats for rent in Sitges?", "a": "Yes — this flat in Sitges allows pets. €1,600/month, 102m²."},
{"q": "Is this flat in Sitges popular?", "a": "It has 2937 views and 236 saves, with an engagement score of 100/100."}
]

Resilience

LayerMechanismPurpose
TimingPoisson-distributed delaysHuman-like, non-fingerpritable inter-request timing
PacingAdaptive pacer (sliding window)Learn safe throughput from observed responses
IdentityUA rotation + device fingerprintNew identity on every rotation
ProxyPool rotation on identity changeDistribute traffic across IPs
RecoveryCircuit breaker with slow-startStop on repeated failures, probe cautiously
LifecycleSession retirement after N requestsPreemptive rotation before detection
AuthProactive token refreshRefresh before expiry
ResumabilityCheckpoint per pageResume from crash without re-scraping
ShutdownSIGINT/SIGTERM handlerSave partial results on graceful stop
AlertsDiscord/Slack webhooksReal-time visibility into run events

Tests

$go test ./...

Countries

CodeCountryLocations
esSpain13,400+
itItalyBundled
ptPortugalBundled

Deployment

Docker

docker build -t idealista-scraper .
docker run -e APIFY_INPUT='{"location":"Madrid","maxItems":5}' idealista-scraper

Apify

Set environment variables:

  • APIFY_TOKEN — API token
  • APIFY_DEFAULT_KEY_VALUE_STORE_ID — Input store
  • APIFY_DEFAULT_DATASET_ID — Output dataset

Or use file-based I/O:

  • Input: storage/key_value_stores/default/INPUT.json
  • Output: storage/datasets/default/*.json
  • Report: storage/key_value_stores/default/REPORT.md
SettingValueWhy
Memory128 MBPure HTTP, no browser
Timeout3600sAllows large multi-location runs
ProxyResidentialDatacenter IPs are blocked
fetchDetailstrueUnlocks energy cert, full descriptions, multilingual comments
fetchStatstrueUnlocks engagement data (views, favorites) — powers AI enrichment