# Pisos.com Property Scraper (`parsebird/pisos-com-property-scraper`) Actor

Scrape property listings from Pisos.com — Spain's real estate portal. Extract prices, bedrooms, bathrooms, size, floor, location, GPS coordinates, agency info, and photo galleries.

- **URL**: https://apify.com/parsebird/pisos-com-property-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### Pisos.com Property Scraper

Extract property listings from [Pisos.com](https://www.pisos.com/), one of Spain's largest real estate portals with hundreds of thousands of homes, flats, houses, and apartments for sale across every Spanish city and region.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search any Spanish city or paste a filtered Pisos.com search URL — get 20+ structured fields per listing including price, bedrooms, bathrooms, size, floor, GPS coordinates, and full high-resolution photo galleries.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
parsebird/pisos-com-property-scraper on Apify. Call: ApifyClient("TOKEN").actor("parsebird/pisos-com-property-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items for results. Key inputs: location (string, e.g. "Madrid", "Barcelona", default "Madrid"), startUrl (string, direct Pisos.com search results URL, overrides location), results_wanted (integer, max listings to collect, default 20), max_pages (integer, safety cap on search-results pages, default 5), proxyConfiguration (object, default Apify Proxy). Output fields: id, title, url, location, price, price_eur, price_drop, bedrooms, bathrooms, size_m2, floor, property_type, description, image_url, image_gallery, image_count, photos_count_declared, badge, agency_logo, address_locality, address_region, country_code, latitude, longitude. Full actor spec: fetch via GET https://api.apify.com/v2/acts/parsebird~pisos-com-property-scraper (Bearer TOKEN). Get token: https://console.apify.com/account/integrations
```

### What does Pisos.com Property Scraper do?

**Pisos.com Property Scraper** extracts structured listing data from [Pisos.com](https://www.pisos.com/) search results — prices, bedrooms, bathrooms, area, floor, GPS coordinates, agency logos, and complete photo galleries — without needing to write a single line of scraping code.

Use it as a **Pisos.com API alternative** to pull Spanish real estate data into JSON, CSV, or Excel. Configure a location or paste a pre-filtered search URL, click Start, and download results. Or integrate via the [Apify API](https://docs.apify.com/api/v2) to automate property data collection at scale.

- 🔍 **Search by location** — enter any Spanish city or area name (Madrid, Barcelona, Valencia, Almería...)
- 🔗 **Direct URL mode** — paste any filtered Pisos.com catalog URL (price range, property type, number of rooms) and scrape exactly that result set
- 📸 **Full photo galleries** — every listing includes the complete high-resolution image gallery, not just the thumbnail
- 📍 **GPS coordinates included** — latitude and longitude on every listing, ready for mapping
- 📄 **Automatic pagination** — crawls multiple result pages up to your configured limit
- 🔄 **Schedule recurring runs** — monitor new listings and price changes with [Apify scheduling](https://docs.apify.com/platform/schedules)
- 🔗 **API access and integrations** — connect to Google Sheets, Zapier, Make, webhooks, or any workflow via the Apify API

### What data can you extract from Pisos.com?

| Field | Description |
|-------|-------------|
| `id` | Unique Pisos.com listing ID |
| `title` | Headline of the listing |
| `url` | Full listing URL |
| `location` | Neighborhood and city |
| `price` / `price_eur` | Displayed price and normalized price in euros |
| `bedrooms` / `bathrooms` | Room counts |
| `size_m2` | Area in square meters |
| `floor` | Floor level (e.g. "4ª planta") |
| `property_type` | Piso, Chalet, Ático, Dúplex, Casa, etc. |
| `image_gallery` / `image_count` | Full high-resolution photo URLs and count |
| `agency_logo` | Listing agency's logo image |
| `address_locality` / `address_region` | Locality and region |
| `latitude` / `longitude` | GPS coordinates |

### How to scrape Pisos.com

1. Go to the [Pisos.com Property Scraper](https://apify.com/parsebird/pisos-com-property-scraper) page on Apify Store
2. Click **Try for free** to open the Actor console
3. Enter a **Location** (e.g. Madrid, Barcelona, Valencia) — or paste a **Start URL** copied from a filtered search on Pisos.com
4. Set **Results Wanted** to control how many listings to collect
5. Adjust **Max Pages** if you need a higher safety cap for large searches
6. Click **Start** and wait for the run to finish
7. Download your data in **JSON, CSV, Excel**, or connect via the **Apify API**

#### Python API example

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("parsebird/pisos-com-property-scraper").call(run_input={
    "location": "Barcelona",
    "results_wanted": 50,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['price']} — {item['size_m2']}m² — {item['location']}")
```

#### JavaScript API example

```javascript
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: "YOUR_API_TOKEN" });

const run = await client.actor("parsebird/pisos-com-property-scraper").call({
    location: "Barcelona",
    results_wanted: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.log(`${item.price} — ${item.size_m2}m² — ${item.location}`);
});
```

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrl` | string | No | — | Direct search results URL from Pisos.com |
| `location` | string | No | `"Madrid"` | City or area name to search |
| `results_wanted` | integer | No | `20` | Maximum listings to collect |
| `max_pages` | integer | No | `5` | Safety cap for results pages |
| `proxyConfiguration` | object | No | Apify Proxy | Proxy configuration settings |

### Output example

```json
{
  "id": "63366549974.100500",
  "title": "Piso en calle de Azcona",
  "url": "https://www.pisos.com/comprar/piso-guindalera-63366549974_100500/",
  "location": "Guindalera (Madrid)",
  "price": "730.000 €",
  "price_eur": 730000,
  "bedrooms": 4,
  "bathrooms": 2,
  "size_m2": 145,
  "floor": "3ª planta",
  "property_type": "Piso",
  "image_url": "https://fotos.imghs.net/appswm-wp/.../1.jpg",
  "image_gallery": ["https://fotos.imghs.net/appswm-wp/.../1.jpg", "https://fotos.imghs.net/appswm-wp/.../2.jpg"],
  "image_count": 32,
  "address_locality": "Madrid Capital",
  "address_region": "Madrid",
  "country_code": "ES",
  "latitude": 40.4276,
  "longitude": -3.6723
}
```

Download results in JSON, HTML, CSV, or Excel.

### Use cases

- 📈 **Real estate market analysis** — track pricing trends and average €/m² costs across Spanish cities
- 💼 **Investment research** — compare properties, identify undervalued neighborhoods, monitor price trends
- 🏠 **Relocation and home-search tools** — build filtered shortlists matching specific price, size, or location criteria
- 🗺️ **Mapping and geospatial apps** — plot listings using the included GPS coordinates
- 🔄 **Price monitoring** — schedule recurring runs to track new listings and price changes over time
- 🔗 **PropTech integration** — feed property data into CRMs, valuation models, or analytics dashboards

### How much does it cost to scrape Pisos.com?

| Plan | Price per event | Price per 1,000 |
|------|-----------------|-----------------|
| Free | $0.0009 | **$0.90** |
| Bronze / Silver / Gold | $0.0008 | **$0.80** |

One `listing-scraped` event is charged each time a property listing is successfully scraped and saved to the dataset. You only pay for listings actually returned. Apify offers a **free trial** with platform credits, enough to scrape thousands of listings at no cost.

### How it works

1. Builds a Pisos.com search URL from your `location` input, or uses your `startUrl` directly
2. Requests the search results pages and parses each listing card for price, rooms, size, floor, and location
3. Reads each listing's embedded structured data for GPS coordinates and address details
4. Fetches the full photo gallery for each listing from Pisos.com's media endpoint
5. Paginates through result pages until `results_wanted` is reached or `max_pages` is hit
6. Pushes each property listing to the Apify dataset

### FAQ

**What locations can I search on Pisos.com?**
Any Spanish city or area listed on Pisos.com — Madrid, Barcelona, Valencia, Sevilla, Málaga, Almería, and more. Enter the name as it appears on the site.

**Can I use a pre-filtered search (price range, property type, rooms)?**
Yes. Apply filters directly on [Pisos.com](https://www.pisos.com/), copy the resulting URL, and paste it into the **Start URL** input — the scraper will crawl that exact result set.

**Does this scraper visit individual listing detail pages?**
Only to fetch each listing's complete photo gallery. All other fields (price, rooms, size, floor, GPS, address) come from the search-results pages, keeping runs fast.

**How many Pisos.com listings can I scrape per run?**
There is no hard limit — set `results_wanted` and `max_pages` to control run size. Larger runs use more compute time.

**Can I schedule recurring scrapes?**
Yes. Use [Apify scheduling](https://docs.apify.com/platform/schedules) to run daily, weekly, or at any custom interval, and combine with webhooks or integrations to automate your property data pipeline.

**Can I access the data via API?**
Yes. Every run produces a dataset accessible via the [Apify API](https://docs.apify.com/api/v2). Integrate with Python, JavaScript, Google Sheets, Zapier, Make, or any HTTP-capable tool.

### Is it legal to scrape Pisos.com?

This Actor extracts publicly available data from Pisos.com. Scraping public data is generally considered legal based on recent court rulings, including the US Ninth Circuit's decision in *hiQ Labs v. LinkedIn*. However, users are responsible for ensuring their use of scraped data complies with applicable laws, Pisos.com's Terms of Service, and data protection regulations including GDPR. Do not use extracted personal data for unsolicited contact or purposes incompatible with the original collection context. For more information, read Apify's blog post on [web scraping legality](https://blog.apify.com/is-web-scraping-legal/).

### Other ParseBird real estate scrapers

| Actor | Target site | Region |
|-------|------------|--------|
| [Fotocasa Scraper](https://apify.com/parsebird/fotocasa-scraper) | Fotocasa.es | 🇪🇸 Spain |
| [Funda.nl Scraper](https://apify.com/parsebird/funda-scraper) | Funda.nl | 🇳🇱 Netherlands |
| [Funda in Business Scraper](https://apify.com/parsebird/fundainbusiness-scraper) | FundaInBusiness.nl | 🇳🇱 Netherlands (commercial) |

Browse all ParseBird actors on the [Apify Store](https://apify.com/parsebird).

# Actor input Schema

## `location` (type: `string`):

City or area name to search for sale listings on Pisos.com. Examples: Madrid, Barcelona, Valencia, Sevilla. Ignored when a Start URL is provided.

## `startUrl` (type: `string`):

Direct search results URL from Pisos.com (e.g. a pre-filtered catalog page with price, size, or property-type filters applied in the browser). Overrides Location when set.

## `results_wanted` (type: `integer`):

Maximum number of listings to collect.

## `max_pages` (type: `integer`):

Safety cap on the number of search-results pages to crawl (each page holds up to 30 listings).

## `proxyConfiguration` (type: `object`):

Proxy settings for the scraper.

## Actor input object example

```json
{
  "location": "Madrid",
  "startUrl": "",
  "results_wanted": 20,
  "max_pages": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "location": "Madrid",
    "results_wanted": 20,
    "max_pages": 5,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/pisos-com-property-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "location": "Madrid",
    "results_wanted": 20,
    "max_pages": 5,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/pisos-com-property-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "location": "Madrid",
  "results_wanted": 20,
  "max_pages": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/pisos-com-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/pisos-com-property-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Pw5fHywkdjzFDHKqb/builds/0AqkMHSDKdzYGhYjV/openapi.json
