Pisos.com Scraper & Property Listings Monitor (Spain)
Pricing
from $3.40 / 1,000 listing returneds
Pisos.com Scraper & Property Listings Monitor (Spain)
pisos.com homes for sale and for rent in Spain, newest first: price in EUR, price per m², size, rooms, bathrooms, floor, location, agency or private seller, listing date and photos. Watch mode returns only new listings and price drops since your last check. Export to JSON, CSV or Excel.
Pricing
from $3.40 / 1,000 listing returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
A pisos.com scraper with alerts for new listings and price drops in Spain. Get pisos.com homes for sale (venta) and for rent (alquiler) in any Spanish province or city, newest first, as clean rows: price in EUR, price per m², size, rooms, bathrooms, floor, neighbourhood, municipality, province, coordinates, agency or private seller, listing date and photos. Turn on watch mode and schedule it: each run returns only the listings published since your last check and the listings whose price went down, with the previous price.
Built for real estate agencies watching their area, investors looking for new stock before others, and analysts tracking asking prices and rents in Madrid, Barcelona, Sevilla, Málaga or any town on pisos.com.
Export as JSON, CSV or Excel, or push new listings to Slack, email or a sheet with an Apify integration.
What you get
One row per listing:
| Field | Example | Notes |
|---|---|---|
listingId, url | 66708651257.100500, https://www.pisos.com/comprar/... | pisos.com's own ID and link |
operation, price, currency, pricePeriod | venta, 194900, EUR, total | Rentals are alquiler with pricePeriod: month. Listings shown as "A consultar" get null (never 0) |
pricePerM2, surfaceM2, builtAreaM2 | 4331.11, 45, 155 | Price per m² is price ÷ size |
siteDropAmount, siteDropPercent, sitePreviousPrice | 5000, 3, 199900 | The price reduction pisos.com itself shows on the listing |
rooms, bathrooms, floor, floorNumber, hasElevator | 3, 2, 3ª planta, 3, true | As stated by the advertiser |
neighborhood, district, municipality, province, latitude, longitude | Zona Noreste, Torrejón de Ardoz, Madrid | Only what the listing shows publicly |
sellerType, agencyName, agencyUrl | agency, Princess Homes | Private sellers are never named |
publishedDate, updatedDate | 2026-10-19 | From the listing's own page |
energyRating, condition, age, orientation, features | D, Reformado, ["Ascensor", "Terraza", ...] | From the listing's own page |
description, imageUrl, imageUrls, photoCount | Phone numbers and e-mails in the text are replaced with [phone removed] / [email removed] | |
changeType, previousPrice, priceChange, priceChangePercent | new, price-drop | Watch mode only |
In a sample of the 90 newest listings for sale in the province of Madrid (2026-10-20): price, size, price per m², municipality, province, coordinates, photos and link were present in 90 of 90; bathrooms in 88; rooms in 85; neighbourhood in 80; floor in 65. 31 of the 90 carried a price reduction shown by pisos.com. The median listing had 23 photos.
How to use it
Plain search: put places in locations as pisos.com writes them, for example Madrid (the province), madrid_capital (the city), Sevilla, barcelona_capital or malaga_capital. Choose operation (venta or alquiler), and set maxListings to how many listings you want per place (up to 1000). includeDetails (on by default) opens each listing for its date, all photos, full description, energy rating and agency name; turn it off for list data only.
{ "locations": ["Sevilla", "malaga_capital"], "operation": "alquiler", "maxListings": 100, "maxPrice": 1500 }
Or paste a pisos.com list address in searchUrls, with the filters you set on pisos.com:
{ "searchUrls": ["https://www.pisos.com/venta/pisos-madrid/"] }
Filters: minPrice, maxPrice, minBedrooms, maxBedrooms, minBathrooms, minSizeM2, maxSizeM2, sellerType (agency / private), requirePrice, onlyReduced. Every returned row is checked against them, so a row that does not match is never returned.
Watch mode: set monitoringMode to true and schedule the same input (hourly or daily). The first run returns the newest listings and remembers them. Later runs return:
new: listings published after the watch started that you have not received yet;price-drop: listings you already received whose price went down, withpreviousPriceandpriceChange(turn this off by settingincludePriceDropsto false).
To start a watch again from scratch, run it once with resetMonitoringState set to true. Each run checks the newest watchPages pages (30 listings each, default 3). For a busy place such as the whole province of Madrid, raise watchPages or narrow the place to a city. Use watchName to keep separate watches of the same search.
Pricing
You pay per listing returned. Rows that explain why nothing was returned are free, so a watch run that finds nothing new costs nothing. The first run of a watch is a normal paid result (it returns the newest listings).
When nothing is returned
You always get a row that says why, and it is not charged:
not-found: pisos.com has no such place (check the spelling in a pisos.com address);no-results/none-matching-filters: pisos.com has nothing for that search or those filters;no-new-listings: watch mode, nothing new and no price drops since the last check;not-allowed-by-robots-txt: pisos.com's robots.txt does not allow that address;blocked,unreadable,incomplete: pisos.com could not be read; nothing is guessed.
Limitations
- One search returns at most the 3,000 newest listings (100 pages of 30), the most pisos.com lists for one search.
- Agency and private seller phone numbers are not collected.
- The Actor does not log in and does not get past check pages; if pisos.com shows one, the row says
blocked.
Thanks for using this Actor
We build these tools for people who run them every day, and we improve them from what users tell us.
- Missing a field, or need another filter? Tell us in the Issues tab. If the data is there, we add it.
- Found a bug or a wrong value? Post the run ID in the Issues tab. Wrong data is the thing we fix first.
If this Actor saved you time, a short review helps other people find it.