
Global Sources Supplier Scraper
scrape.ly/store/cornerledger/globalsources-scraperLead generationE-commerce
2 monthly users

Scrape pisos.com property listings in Spain by location with filters, or from search and listing URLs. Get price, rooms, bathrooms, m², floor, address, coordinates, photos, energy rating, features and the agency or owner with phone.
Turn pisos.com, one of Spain's big property portals, into a clean spreadsheet. Type a city, province or neighbourhood (or paste any pisos.com search) and get every listing with price, €/m², rooms, bathrooms, area, floor, address, map coordinates, photos, energy rating, 20+ amenity flags and the agency or owner with phone. No login, no browser, about 1,000 fully detailed listings a minute.
Madrid Capital, Marbella or Chamberí; the scraper finds the matching pisos.com area for you. Location slugs and pasted search URLs work too.Madrid Capital, Barcelona, Sevilla) or paste pisos.com URLs (search pages with your filters, or single listings).| Field | What it does |
|---|---|
locations | Places in Spain: city, province, district, neighbourhood or town (Madrid Capital, Madrid, Chamberí, Marbella) or a pisos.com slug (madrid_capital). Madrid is the province, Madrid Capital the city. |
startUrls | pisos.com search URLs (filters set on the site are kept) or listing URLs. |
maxItems | Listings to save in total (default 20, 0 = no limit). Shared by all searches. |
transactionType | sale, rent or newBuild (obra nueva). |
propertyType | homes, apartment, house, attic, duplex, studio, loft, ruralEstate, commercial, office, warehouse, land, garage, storage. |
sortBy | relevance, newest, priceAsc, priceDesc, areaDesc, areaAsc. |
minPrice / maxPrice | Price range in euros (monthly rent for rentals). |
minArea / maxArea | Built area range in m². |
minRooms / maxRooms / minBathrooms | Bedroom and bathroom counts. |
features | Must have: terrace, elevator, garden, pool, parking, storageRoom, heating, airConditioning. |
publishedWithin | any, lastWeek, lastMonth. |
priceDropOnly / brandNewOnly | Only reduced listings / only brand-new properties. |
keyword | Only listings that mention a word (chimenea, vistas al mar). |
advertiserType | all, agency or private. |
fetchDetails | Open each listing page for the full data (default on). Turn off for a faster export from the result pages only. |
maxItemsPerSearch | Cap per location or URL, so one big search does not use up maxItems. |
Example: three-bedroom flats for sale in Madrid with a terrace, newest first:
{
"locations": ["Madrid Capital"],
"transactionType": "sale",
"propertyType": "apartment",
"minRooms": 3,
"maxPrice": 600000,
"features": ["terrace"],
"sortBy": "newest",
"maxItems": 100
}
One row per listing. The main fields:
| Field | Description |
|---|---|
id, url, title | pisos.com listing id, link and headline |
transactionType, propertyType, propertySubtype | sale / rent / newBuild, English type and the site's own type (piso, chalet_adosado...) |
price, priceText, pricePerSqm, currency | Price in euros (rent per month), as shown, per m² |
hasPriceDrop, priceDrop, priceDropPercent | Price reduction amount and percentage |
rooms, bathrooms, areaSqm, usableAreaSqm, plotAreaSqm, floor | Size and layout |
condition, buildingAge, orientation, communityFees, heatingType, kitchen, flooring | Property details (listing page) |
energyClass, energyConsumption, energyEmissions | Energy certificate (listing page) |
hasElevator, hasParking, hasTerrace, hasPool, hasGarden, isFurnished, ... | 16 amenity flags (listing page) |
features | Every feature the listing shows, as label → value |
address, neighborhood, district, city, province, postalCode, latitude, longitude | Location |
mainImage, images, imageCount | Photos |
advertiserName, advertiserType, advertiserId, advertiserUrl, advertiserAddress, phone | Agency or private owner |
description, updatedAt, tags, scrapedAt | Text, last update date, badges, scrape time |
Example row (trimmed; advertiser data replaced with a fictional agency):
{
"id": "65077851154.510936",
"url": "https://www.pisos.com/comprar/piso-carabanchel_san_isidro28019-65077851154_510936/",
"title": "Piso en venta en Calle de San Cándido",
"transactionType": "sale",
"propertyType": "apartment",
"price": 439900,
"pricePerSqm": 4887,
"currency": "EUR",
"hasPriceDrop": false,
"rooms": 3,
"bathrooms": 2,
"areaSqm": 90,
"usableAreaSqm": 80,
"floor": "1",
"condition": "En buen estado",
"buildingAge": "Más de 50 años",
"orientation": "Este",
"energyClass": "F",
"energyConsumption": 314,
"energyEmissions": 66,
"communityFees": "Entre 80 y 100 €",
"hasElevator": true,
"hasTerrace": true,
"hasPool": false,
"isExterior": true,
"features": { "Superficie útil": "80 m²", "Armarios empotrados": "2", "Terraza": true, "Soleado": true },
"address": "San Isidro, Carabanchel, Madrid Capital, Madrid",
"neighborhood": "San Isidro",
"district": "Carabanchel",
"city": "Madrid Capital",
"province": "Madrid",
"postalCode": "28019",
"latitude": 40.399459,
"longitude": -3.7209612,
"mainImage": "https://fotos.imghs.net/fch-wp/510936/65077851154.510936/510936_65077851154_74e3db83-c061-48be-afcc-7ca46520b75f.jpg",
"imageCount": 35,
"advertiserName": "Inmobiliaria Ejemplo Madrid",
"advertiserType": "agency",
"advertiserAddress": "Calle Ejemplo 1, Madrid Capital (Madrid)",
"phone": "+34910000000",
"updatedAt": "2026-08-18",
"detailScraped": true,
"scrapedAt": "2026-10-21T12:14:27.322Z"
}
You pay $3.00 per 1,000 listings ($0.003 per saved listing), with or without listing pages. There is no start fee. Platform usage (compute and proxy traffic) is billed separately and is small: a 1,000-listing run with full details measured about $0.03 of usage on the default settings.
Example: 1,000 detailed listings ≈ $3.00 + about $0.03 usage.
You can cap the spend of any run with the maximum charge setting; the run stops cleanly and keeps what it saved.
Is it legal to scrape pisos.com? The scraper collects only public listing pages that anyone can open without an account. Personal data (for example a private owner's phone) is covered by the GDPR in Spain, so make sure you have a lawful reason to process it. If in doubt, ask a lawyer.
Do I need a pisos.com account or my own proxy? No. The scraper does not log in. It uses the platform's proxies and switches to Spanish residential addresses on its own if pisos.com starts refusing requests.
How many listings can I get? As many as pisos.com has for your search. One pisos.com search stops at 100 pages (about 3,000 listings); bigger searches are split by price automatically. A 10,000-listing run with full details is supported.
Why is a field empty? Fields come from what each advertiser filled in. Energy rating, orientation or community fees are often missing on the site itself. Amenity flags, the full description and advertiser details need Open each listing page (on by default). With it off, the agency name is read from its pisos.com profile link, so accents can be missing and private owners have no name.
How do I search a city instead of the whole province?
Use Madrid Capital, Barcelona Capital, Valencia Capital and so on. Madrid alone is the whole province.
Can I schedule it or use it from code? Yes. Save your input as a task and schedule it (for example daily, sorted by newest), or start runs and read results through the API.
compartir) and holiday rentals are not covered by the search options (single listing URLs still work).Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
locationsarrayOptionalLocations
Places in Spain to search: a city, province, district, neighbourhood or town (for example Madrid Capital, Barcelona, Chamberí, Marbella) or a pisos.com location slug such as madrid_capital. Each one is a separate search using the settings below. Use 'Madrid Capital' for the city and 'Madrid' for the whole province.
startUrlsarrayOptionalpisos.com URLs
Search result pages from pisos.com (any filters you set on the site are kept) or single listing pages. Example: https://www.pisos.com/alquiler/pisos-barcelona_capital/
maxItemsintegerOptionaldefault 20Max listings
How many listings to save in total. 0 means no limit. Searches with more than 3,000 listings are split by price automatically so you can go past the site's 100-page limit.
transactionTypeenumOptionaldefault "sale"Operation
Buy, rent, or new developments (obra nueva). Used with Locations.
propertyTypeenumOptionaldefault "homes"Property type
What kind of property to search for. Used with Locations (new developments always list homes).
sortByenumOptionaldefault "relevance"Sort by
Order of the results.
Used with Locations. To filter a pasted search URL, set the filters on pisos.com and copy the URL.
minPriceintegerOptionalMin price (€)
Lowest price in euros (monthly rent for rentals).
maxPriceintegerOptionalMax price (€)
Highest price in euros.
minAreaintegerOptionalMin area (m²)
Smallest built area in square metres.
maxAreaintegerOptionalMax area (m²)
Largest built area in square metres.
minRoomsintegerOptionalMin bedrooms
Fewest bedrooms.
maxRoomsintegerOptionalMax bedrooms
Most bedrooms.
minBathroomsintegerOptionalMin bathrooms
Fewest bathrooms.
featuresarrayOptionalMust have
Only listings with all of these features.
publishedWithinenumOptionaldefault "any"Published
Only listings published or updated recently.
priceDropOnlybooleanOptionaldefault falsePrice drops only
Only listings whose price was lowered.
brandNewOnlybooleanOptionaldefault falseBrand new only
Only brand-new properties (a estrenar).
keywordstringOptionalKeyword
Only listings that mention this word, for example chimenea or vistas al mar. Uses the site's own keyword search.
advertiserTypeenumOptionaldefault "all"Advertiser
Agencies, private owners, or both.
fetchDetailsbooleanOptionaldefault trueOpen each listing page
Adds the full description, every feature (lift, terrace, pool, furnished, heating...), usable and plot area, condition, building age, orientation, energy certificate, all photos, exact map point, last update date and the advertiser's name, address and phone. One extra page per listing; turn off for faster, search-page-only exports.
maxItemsPerSearchintegerOptionaldefault 0Max listings per search
Cap for each location or URL on its own, so one big search does not use up Max listings. 0 means no per-search cap.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy
Datacenter addresses are used first; if pisos.com refuses them, the run switches to Spanish residential addresses by itself.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| id | string | null | |
| url | string | null | |
| title | string | null | |
| transactionType | string | null | |
| propertyType | string | null | |
| propertySubtype | string | null | |
| price | number | null | |
| priceText | string | null | |
| priceFrom | boolean | null | |
| currency | string | null | |
| pricePerSqm | number | null | |
| hasPriceDrop | boolean | null | |
| priceDrop | number | null | |
| priceDropPercent | number | null | |
| rooms | number | null | |
| bathrooms | number | null | |
| areaSqm | number | null | |
| areaMaxSqm | number | null | |
| usableAreaSqm | number | null | |
| plotAreaSqm | number | null | |
| floor | string | null | |
| condition | string | null | |
| buildingAge | string | null | |
| orientation | string | null | |
| energyClass | string | null | |
| energyEmissionsClass | string | null | |
| energyConsumption | number | null | |
| energyEmissions | number | null | |
| energyStatus | string | null | |
| heatingType | string | null | |
| airConditioningType | string | null | |
| kitchen | string | null | |
| flooring | string | null | |
| parkingSpaces | number | null | |
| communityFees | string | null | |
| hasElevator | boolean | null | |
| hasParking | boolean | null | |
| hasTerrace | boolean | null | |
| hasBalcony | boolean | null | |
| hasGarden | boolean | null | |
| hasPool | boolean | null | |
| hasStorageRoom | boolean | null | |
| hasFittedWardrobes | boolean | null | |
| hasAirConditioning | boolean | null | |
| hasHeating | boolean | null | |
| hasFireplace | boolean | null | |
| isFurnished | boolean | null | |
| isExterior | boolean | null | |
| isAccessible | boolean | null | |
| hasSecurity | boolean | null | |
| petsAllowed | boolean | null | |
| features | object | null | |
| description | string | null | |
| address | string | null | |
| street | string | null | |
| neighborhood | string | null | |
| district | string | null | |
| city | string | null | |
| province | string | null | |
| postalCode | string | null | |
| country | string | null | |
| latitude | number | null | |
| longitude | number | null | |
| locationText | string | null | |
| mainImage | string | null | |
| images | array | null | |
| imageCount | number | null | |
| advertiserName | string | null | |
| advertiserType | string | null | |
| advertiserLabel | string | null | |
| advertiserId | string | null | |
| advertiserUrl | string | null | |
| advertiserLogo | string | null | |
| advertiserAddress | string | null | |
| phone | string | null | |
| reference | string | null | |
| tags | array | null | |
| updatedAt | string | null | |
| detailScraped | boolean | null | |
| searchUrl | string | null | |
| searchLocation | string | null | |
| scrapedAt | string | null |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Listing | One pisos.com listing saved to the dataset | $0.003 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('roamandroof/pisos-scraper').call({
"locations": [
"Madrid Capital"
],
"maxItems": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run roamandroof/pisos-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=roamandroof/pisos-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Newest rentals in Barcelona city with full listing details and agency phone.
Scrape any pisos.com search URL with the filters you set on the site.
Result pages only: price, size, rooms, location and photos in seconds.
Newest brand-new developments with starting price and size range.
Cheapest reduced houses first, with the drop amount and percentage.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.