Pisos.com Scraper
Scrape pisos.com property listings in Spain: price, price per m2, size, rooms, location, coordinates, agency and photos. Sale and rent. No account needed.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
location,operation,propertyType(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.00185 per listing = $1.85 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Listing returned | One property listing returned in the dataset. Diagnostic rows and the labelled sample row are not charged. | $0.00185 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-20, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
location | A pisos.com place slug: a province like madrid, barcelona, alicante, or a town like marbella, elche_elx, san_sebastian_donostia. Common spellings are mapped for you. If a place 404s, open the search on pisos.com and paste the address into Search URLs instead. | string |
operation | venta is for sale, alquiler is to rent. | string |
propertyType | pisos covers flats and apartments and is the broadest choice. The others narrow the search to that one type. | string |
maxItems | Stop after this many listings across every search. You are charged per listing returned. pisos.com serves 30 per page and stops at page 100, so a single search tops out around 3,000. | integer |
startUrls | Optional, and the most reliable way in: set up the search on pisos.com with whatever filters you want, then paste the address here. Search pages and single listing pages both work. Paginates from wherever the URL points. | array |
minPrice | Lower price bound. For rentals this is monthly rent. Leave empty for no lower bound. | integer |
maxPrice | Upper price bound. For rentals this is monthly rent. Every listing you get is at or under it: ones the site lets through above it are left out and not charged. Leave empty for no upper bound. | integer |
sortBy | Which listings come first. Newest first is the one to pick if you are polling for changes. | string |
includeDetails | Off, every listing comes from the results grid: price, size, rooms, location, coordinates, agency, main photo. On, each listing also gets its own page fetched for the full feature list, the whole description, every photo, the agency reference and the date the advert was last updated. Same price per listing either way, but the run takes roughly ten times longer. | boolean |
What you get
A structured dataset — each result includes fields like:
titlepricepricePerM2areaM2roomsbathroomsflooroperationpropertyTypeneighbourhoodmunicipalityprovincelatitudelongitudeadvertiserTypeadvertiserNameimageCounturllistingIdExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Pisos.com Scraper: Spanish property listings for sale and to rent, with price per m²
Give it a Spanish province or town, or paste a pisos.com search, and you get one row per listing: 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 |
| Ceiling | 3,000 listings per search, 5,000 per run |
| Account needed | None |
| Price | $1.85 per 1,000 listings, flat on every plan |
🔍 What Pisos.com Scraper does
It reads the same logged-out results pages a visitor sees, 30 listings a page, and builds each row from the listing card. Price, size, rooms and coordinates all come from there. 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.
Past the last page, pisos.com hands back page 1 again. The run notices the repeat and stops rather than charging you twice for the same flats.
When a search has only a handful of matches, pisos.com can fill the rest of the page with other listings it thinks you might like. Those are not part of your search, so they are skipped and never charged.
📥 What you give it
{
"location": "madrid",
"operation": "venta",
"propertyType": "pisos",
"minPrice": 200000,
"maxPrice": 300000,
"sortBy": "newest",
"maxItems": 200
}
| Field | If you leave it out | What it is |
|---|---|---|
location | 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. The site lets listings up to about 10% over the ceiling through; the run checks each price and leaves those out, uncharged. |
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. |
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 from a real run, 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 | What it is |
|---|---|
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. |
areaM2, rooms, bathrooms, floor | As the listing card shows them. floor is text, such as "2ª planta". |
neighbourhood, district, municipality, province | Where it is. Only cities split into districts, such as Madrid, fill district. |
latitude, longitude | From the location data pisos.com publishes on its own results pages. |
advertiserType, advertiserName, advertiserUrl, phone | Who is advertising it. 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. |
imageCount, imageUrl, images | The real photo count and the lead photo. On grid rows images holds only the few photos the results page loads. |
description, features, reference, lastUpdated | Filled only with includeDetails, otherwise null. |
searchUrl, page, position | Which search the listing came from, and where on it. |
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.
errorCode | 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, or nothing at or under your maxPrice. |
BAD_URL | That is not a pisos.com search or listing URL. |
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. Run it again. |
▶️ How to run it
1. Open Pisos.com Scraper and click Try for free. 2. 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. 3. Set Maximum listings. The form starts at 50. 4. Tick Include full detail pages if you want the description, every photo and the feature list. 5. Click Start, then export the dataset as CSV, JSON or Excel.
💰 How much does it cost?
$1.85 per 1,000 listings, flat on every Apify plan, with the detail pages or without.
Not charged: the sample row, every diagnostic row, a listing above your maxPrice, 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 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 an agency CRM or a market report with the agency, phone and link for each listing.
🚧 What it does not do
- Past page 100. One search stops at 3,000 listings. Split by province or price band to go wider.
- 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.
- Private sellers, mostly. The site is fed by agencies. If private sellers are what you are after, this is the wrong portal.
- 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.
- The ignored-filter check on pasted searches. It runs only when you use
locationwith a price bound.
🧭 Which Spanish property scraper do you need?
| If you want | Use |
|---|---|
| Listings from pisos.com, for sale or to rent | This one |
| Listings from Idealista in Spain, Italy and Portugal | Idealista Scraper |
| Homes for sale and to rent on Fotocasa | Fotocasa Scraper |
| 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.
Can I get every listing in Spain? Not in one search. Run province by province, or split by price band, and you can cover far more.
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 the site's own address always works.
Can I filter on a garage or a terrace? Yes, through startUrls. Set the filter up on pisos.com and paste the address.
How current is the data? It is read live when the run starts. With includeDetails, lastUpdated tells you when the advertiser last touched the listing.
Can I run it on a schedule? Yes. sortBy: "newest" with a modest maxItems makes a cheap daily check of what is new in an area.
🆘 If something breaks
Open the Issues tab on the actor page. Include the run ID and the input you used, or the search URL.