Pisos.com Scraper - Spain Property Listings
Pricing
from $1.79 / 1,000 listings
Pisos.com Scraper - Spain Property Listings
Pisos.com scraper for Spanish property for sale or to rent. Give a province or town, or paste a search, and get one row per listing: price, price per m², area, rooms, bathrooms, floor, neighbourhood, coordinates, agency and phone. $1.85 per 1,000 listings.
Pricing
from $1.79 / 1,000 listings
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Give it a Spanish province or town, or paste a pisos.com search, and get one row per property listing for sale or to rent: asking price or monthly rent, price per m², built area, rooms, bathrooms, floor, neighbourhood, coordinates, the agency and its phone number. Turn on the detail pages and each row also gets the full feature list, the whole description, every photo and the agency's own reference.
The catch is depth. pisos.com never serves past page 100 of a search, so one search stops at 3,000 listings however many it advertises, and a bigger area has to be split by province or price band.
| Input | A place plus sale or rent, or pisos.com search URLs |
| Output | One row per listing: price, price per m², area, rooms, bathrooms, floor, neighbourhood to province, coordinates, agency and phone, photos |
| Ceiling | 3,000 listings per search, 5,000 per run |
| Account needed | None |
| Price | $1.85 per 1,000 listings on the free plan, down to $1.79 on Business. The free plan's $5 a month covers about 2,700 |
🔍 What Pisos.com Scraper does
It reads the same results pages a logged-out visitor sees, 30 listings a page, and builds each row from the listing card. With includeDetails on, it also opens each listing's own page.
pisos.com spells some places its own way. elche is a 404 and elche_elx is the real page. The usual spellings are mapped for you, so elche, Elx, San Sebastián, La Coruña, Palma and Vitoria all land in the right place. A name it does not recognise gives you a free LOCATION_NOT_FOUND row, and the fix is always the same: open the search on pisos.com and paste the address into startUrls.
The site also ignores a filter it does not understand, and answers with the unfiltered set as if nothing were wrong. So when you set a price bound with location, the run first compares the result count with the unfiltered count. If they match, the filter was dropped, and you get a free FILTER_IGNORED row instead of listings you never asked for.
Three more things the run catches so you do not pay for them. The site lets listings up to about 10% over your maximum price through, so each price is checked and those are left out. Past the last page, pisos.com hands back page 1 again, and the run stops instead of charging you twice for the same flats. And when a search has only a handful of matches, the site can pad the page with other listings it thinks you might like, which are skipped.
📋 What data you get from each pisos.com listing
| What you get | Field |
|---|---|
| pisos.com's listing id, the link and the title | listingId, url, title |
| Sale or rent, and the property type | operation, propertyType |
| Asking price or monthly rent, and price per m² | price, priceCurrency, pricePerM2 |
| Built area, rooms, bathrooms and floor | areaM2, rooms, bathrooms, floor |
| Neighbourhood, district, town, province and country | neighbourhood, district, municipality, province, country |
| Map position | latitude, longitude |
| The advertiser, its type, its page on pisos.com and its phone | advertiserName, advertiserType, advertiserUrl, phone |
| Whether it is a new-build promotion | isNewDevelopment |
| Photo count, lead photo and photo links | imageCount, imageUrl, images |
| The short description from the results page | descriptionSnippet |
With includeDetails: the whole description, feature list, agency reference and last update | description, features, reference, lastUpdated |
| Which search found it, and where on it | searchUrl, page, position, scrapedAt |
▶️ How to scrape pisos.com listings
- Open Pisos.com Scraper and click Try for free.
- Type a province or town into Where, then pick Sale or rent and a Property type. To use a search you set up on pisos.com, paste its address into Search URLs instead.
- Set Maximum listings. The form starts at 50.
- Tick Include full detail pages if you want the description, every photo and the feature list.
- Click Start, then export the dataset as CSV, JSON or Excel.
Leave both Where and Search URLs empty and you get one labelled sample row, not charged, so you can see the columns first.
💰 How much does it cost to scrape pisos.com?
$1.85 per 1,000 listings on the free plan, with the detail pages or without. On the free plan, the $5 Apify gives you each month covers about 2,700 listings.
| Free | Starter | Scale | Business | |
|---|---|---|---|---|
| Per 1,000 listings returned | $1.85 | $1.83 | $1.81 | $1.79 |
Per 1,000 listings privateSellersOnly checks and leaves out | $0.08 | $0.079 | $0.078 | $0.077 |
A privateSellersOnly run that checks the most it can, 3,000 listings | $0.24 | $0.237 | $0.234 | $0.231 |
Not charged: the sample row, every diagnostic row, a listing above your maxPrice, a padding listing that is not part of your search, and a listing already delivered earlier in the same run. maxItems is a hard stop, so 200 means at most 200 listings are charged. A pasted single listing costs the same as any other. If its page shows none of the price, size or location, you get a free FETCH_FAILED row for it instead.
📥 What you give it
{"location": "madrid","operation": "venta","propertyType": "pisos","minPrice": 200000,"maxPrice": 300000,"sortBy": "newest","maxItems": 200}
| Field | Default | What it is |
|---|---|---|
location | none: a free sample row, unless startUrls is set | A province or town, such as madrid, alicante, marbella or elche_elx. Accents and capitals are fine. |
operation | venta | venta for sale, alquiler to rent. |
propertyType | pisos | pisos (flats, the broadest choice), casas, aticos, duplexs, estudios, lofts, chalets or fincas_rusticas. |
minPrice, maxPrice | no bound | Euros, and monthly rent when renting. Every listing you get is at or under maxPrice. |
sortBy | relevance | relevance, newest, cheapest or priciest. newest is the one for keeping an eye on an area. |
maxItems | 50 | Listings across every search in the run, 1 to 5,000. You pay per listing returned. |
startUrls | none | pisos.com search or listing URLs. A search URL keeps every filter it carries, including ones this form does not have, and pages on from wherever it points. |
includeDetails | off | Also open each listing's own page. Same price per listing, but the run takes roughly ten times longer. |
privateSellersOnly | off | Only listings placed by the owners, not by agencies. pisos.com has no filter for it, so the run reads the results and leaves out the agency listings, each one billed as a checked listing. Private sellers were about one listing in 464 when we counted, so most of what such a run pays for is checking. One run checks at most 3,000 listings, and only on searches. |
proxyConfiguration | not needed | Leave it alone. Only a list of your own servers entered here is used; the other settings in this box change nothing. |
📤 What you get back
A real row, with the description snippet cut short:
{"listingId": "61748204239.106400","url": "https://www.pisos.com/comprar/duplex-las_retamas_prado_santo_domingo_ensanche_sur28922-61748204239_106400/","title": "Dúplex en calle de Juan Ramón Jiménez, 4","operation": "venta","propertyType": "duplex","price": 450000,"priceCurrency": "EUR","pricePerM2": 4091,"areaM2": 110,"rooms": 3,"bathrooms": 3,"floor": "2ª planta","neighbourhood": "Las Retamas-Prado Santo Domingo-Ensanche Sur","district": null,"municipality": "Alcorcón","province": "Madrid","country": "ES","latitude": 40.3397,"longitude": -3.8323,"advertiserType": "professional","advertiserName": "Inmobiliaria Maqueda","advertiserUrl": "https://www.pisos.com/inmobiliaria-inmobiliaria_maqueda_993744_0/","phone": "919387329","isNewDevelopment": false,"imageCount": 43,"imageUrl": "https://fotos.imghs.net/mm-wp/1064/390/1064_IJ364-99380390_1_202602190946518929476.jpg","images": ["https://fotos.imghs.net/mm-wp/1064/390/1064_IJ364-99380390_1_202602190946518929476.jpg","https://fotos.imghs.net/mm-wp/1064/390/1064_IJ364-99380390_2_202602190946518929767.jpg"],"descriptionSnippet": "¡Sin comisiones al comprador! Inmobiliaria maqueda presenta este ático dúplex en venta en prado santo domingo...","description": null,"features": null,"reference": null,"lastUpdated": null,"searchUrl": "https://www.pisos.com/venta/pisos-madrid/","page": 1,"position": 2,"scrapedAt": "2026-09-29T13:27:49.166Z"}
| Field | How to read it |
|---|---|
price, pricePerM2 | The asking price in euros, or the monthly rent on a rental. So a pricePerM2 of 15 on a rental means €15 per m² a month. On grid rows it is usually worked out as price over area, which can sit a euro away from the site's own figure; with includeDetails it is read off the listing page. |
floor | Text, such as "2ª planta". |
district | Only cities split into districts, such as Madrid, fill it. |
advertiserType, phone | The site is fed by agencies, so this is nearly always professional and the phone is the agency's line. |
isNewDevelopment | true on the new-build promotions the site slots into the grid, which is why a page can bring 33 rows instead of 30. |
images | On grid rows, only the few photos the results page loads. imageCount is the real count. |
description, features, reference, lastUpdated | Filled only with includeDetails, otherwise null. |
How often each field is filled, measured over 305 listings from ten searches in September 2026:
| Field | Filled |
|---|---|
listingId, url, price, municipality, province, latitude, longitude, bathrooms | 100% |
imageUrl, imageCount | 99.7% |
areaM2, pricePerM2 | 96.7% |
advertiserType, phone | 95.1% |
rooms | 93.4% |
advertiserName, advertiserUrl | 89.2% |
neighbourhood | 88.9% |
floor | 43.6% |
district | 42.3% |
floor and district are low because plenty of homes have neither. A detached house has no floor, and most Spanish towns have no districts.
🧾 Reading the output
| Row | How to spot it | Charged |
|---|---|---|
| A listing | no _sample, _diagnostic or charged field | yes |
| The sample row | _sample: true, charged: false. Only when there was no location and no startUrls | no |
| A diagnostic row | _diagnostic: true, charged: false, and an errorCode | no |
Real listings carry no charged field at all, so drop every row where charged is false and you are left with the listings.
| Code | What happened |
|---|---|
LOCATION_NOT_FOUND | pisos.com has no search for that place name. Paste the search URL instead. |
BAD_LOCATION | The place name could not be turned into anything to search for. |
FILTER_IGNORED | The site dropped your price bound and answered with everything, so nothing was delivered for that search. |
DEPTH_LIMIT | The search advertised more than 3,000 listings and the run reached page 100. Split it up. |
NO_RESULTS | The search matched nothing, nothing at or under your maxPrice, or no private seller among the listings checked. |
BAD_URL | That is not a pisos.com search or listing URL the run can read, or it is a single listing while privateSellersOnly is on. |
OPTION_NOT_LIVE | privateSellersOnly could not be switched on for that run. Nothing was searched. |
CHECK_LIMIT | The run checked 3,000 listings for private sellers and stopped there. |
NOT_FOUND | A pasted listing has been taken down, usually because it sold or was withdrawn. |
FETCH_FAILED | pisos.com did not return the page, or a pasted listing's page showed no price, size or location. Run it again. |
💡 What people use it for
- Comparables before an offer: the asking price per m² of every flat in the same neighbourhood.
- Rent against buy for one town, from a sale run and a rental run with the same filters.
- A daily
newestrun with a smallmaxItems, to see what came on the market overnight in one area. - Feeding a market report with the price, area and link for each listing.
🚧 What it does not do
- Sold prices. pisos.com publishes asking prices only, and asking prices are what you get.
- Energy ratings, floor plans or price history. None of them is on the logged-out page.
- Many private sellers. The site is fed by agencies, so
privateSellersOnlyreads a lot of listings to find a few. - Place names on a pasted single listing. A listing URL on its own gives the price, size, rooms, map point, description, features and photos, but leaves the neighbourhood, district, town, province, advertiser type and agency link empty. Search results fill those in, so paste a search when you need them.
- A pasted single rental listing. Only listings for sale can be pasted one by one; a rental listing's own URL gets a free
BAD_URLrow. Paste the rental search instead. - The ignored-filter check on pasted searches. It runs only when you use
locationwith a price bound, and a pasted search's own price ceiling is not re-checked. - It is not an official pisos.com tool. Dami's Studio is independent and is not affiliated with or endorsed by pisos.com, or by any other company named on this page.
🧭 Which Spanish property scraper do you need?
| If you want | Use |
|---|---|
| Spain on Fotocasa, with map coordinates and searches near a point | Fotocasa Scraper |
| Spain on pisos.com | This one |
| Short-stay prices on Airbnb, to set against long-term rents | Airbnb Listings Scraper |
❓ Questions people ask
Do I need a pisos.com account or an API key?
No. It reads the public pages anyone can open.
How do I find the right place name?
Type it the way you would say it. If it does not resolve, search on pisos.com and paste the URL into startUrls, since an address copied from the site is the most reliable way in.
Can I filter on a garage or a terrace?
Yes, through startUrls. Set the filter up on pisos.com and paste the address.
How fresh is the data, and can I run it every day?
It is read live when the run starts. With includeDetails, lastUpdated tells you when the advertiser last touched the listing. Yes, schedule it with sortBy on newest.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/pisos-com-scraper. Either way the run happens on your Apify account at the same price.
Is scraping pisos.com legal?
These are public adverts. Rows carry agency names and phone numbers, and data-protection law such as GDPR can cover contact details, so have a reason for collecting them. With privateSellersOnly, rows hold private people's phones: keep only what you need and mind cold-call rules. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Include the run ID and the input you used, or the search URL.