# Pisos.com Scraper - Sale, Rent & New Build, All Types (`gio21/pisos-scraper`) Actor

Scrape Pisos.com listings: sale, rent or new build across 7 property types (flats, houses, chalets, offices, retail, garages, land). Price, area, rooms, bathrooms, images. No login. $0.005/listing.

- **URL**: https://apify.com/gio21/pisos-scraper.md
- **Developed by:** [Gio](https://apify.com/gio21) (community)
- **Categories:** Real estate
- **Features:** Limited permissions
- **Stats:** 36 total users, 9 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$5.00 / 1,000 listing scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Pisos.com Scraper - Sale, Rent & New Build, All Property Types

### Why use this scraper

Pisos.com is one of Spain's largest agency-driven property portals, and it
has no public API for search results. If you track property prices, build
a real-estate lead list, or feed listings into a valuation model, the only
way to get this data today is to scrape the site yourself, keep the parser
working as the markup changes, and handle blocking. That is a maintenance
job most teams don't want.

**Pisos.com Scraper** returns structured listing data (price, area, rooms,
bathrooms, location, description, images and more) from a single input:
pick an operation, a property type and a location, and get every listing
Pisos.com shows for that search, no login and no browser to manage on your
end.

### Overview

The actor crawls Pisos.com search-result pages for a given operation,
property type and location, and returns one record per listing found. You
control depth with `maxItems` (up to 500) and `maxPages`. A 20 to 50 listing
run typically finishes in under two minutes. Each listing scraped is
charged at **$0.005**, with a minimum charge of $0.05 per run.

### Supported inputs

- **operation** (required) - `venta` (sale), `alquiler` (rent) or
  `obra-nueva` (new build).
- **propertyType** (optional, default `pisos`) - `pisos` (flats), `casas`
  (houses), `chalets`, `oficinas` (offices), `locales` (retail), `garajes`
  (garages) or `terrenos` (land).
- **location** (required) - a Pisos.com location slug, e.g. `madrid`,
  `barcelona`, `valencia`, `sevilla`, `malaga`.
- **startUrl** (optional, advanced) - a direct Pisos.com search URL, which
  overrides `operation`, `propertyType` and `location` when set. Useful for
  filtered searches (price range, number of rooms) built directly on the
  site.
- **maxItems** (optional, default 50, max 500) - hard cap on listings
  returned.
- **maxPages** (optional, default 5, max 20) - hard cap on result pages
  crawled.

Three operations times seven property types means 21 distinct search
combinations in one actor, plus the `startUrl` override for anything more
specific than the built-in filters cover.

### Use cases

- **Agency and portfolio benchmarking.** Pull every listing for a location
  and property type to see how your own inventory's pricing compares to
  the market.
- **Market research before buying or renting.** Compare price per square
  meter (`pricePerSqm`) across neighborhoods in a city before committing to
  an area.
- **New-build tracking.** Monitor the `obra-nueva` operation for a city to
  catch new development launches as they're listed.
- **Real-estate lead generation.** Collect listing URLs and descriptions by
  area for outreach to agencies or private sellers.
- **Valuation and pricing models.** Feed price, area, rooms and location
  data into a comparable-sales or rental-yield model.

### How it works

The actor requests the Pisos.com search-results page that matches the
chosen operation, property type and location (or the custom `startUrl`,
when set), and reads each listing card exactly as a visitor's browser
would: title, price, area, rooms, bathrooms, neighborhood, description and
images. It paginates until it reaches `maxItems` or `maxPages`, whichever
comes first, and needs no login or session.

### Input configuration

**1. Flats for sale in Madrid**

```json
{
  "operation": "venta",
  "propertyType": "pisos",
  "location": "madrid",
  "maxItems": 50
}
```

**2. Houses for rent in Valencia**

```json
{
  "operation": "alquiler",
  "propertyType": "casas",
  "location": "valencia",
  "maxItems": 30,
  "maxPages": 3
}
```

**3. Custom filtered search via direct URL**

```json
{
  "operation": "venta",
  "location": "barcelona",
  "startUrl": "https://www.pisos.com/venta/pisos-barcelona_capital/con-3-habitaciones/",
  "maxItems": 100
}
```

### Output sample

Real output from a production run against Pisos.com Madrid listings
(September 2026):

```json
[
  {
    "listingId": null,
    "title": "Piso en calle de la Princesa, 76",
    "propertyType": "pisos",
    "operation": "venta",
    "price": 1600000,
    "currency": "EUR",
    "pricePerSqm": 10323,
    "area": 155,
    "rooms": 3,
    "bathrooms": 3,
    "location": "Madrid",
    "neighborhood": null,
    "addressHint": null,
    "description": "Gaztambide (Distrito Chamberi. Madrid Capital)",
    "features": [],
    "agency": null,
    "phone": null,
    "images": [
      "https://fotos.imghs.net/mm-wp/1005/101/1005_2935432214101_1_202606051854533172743.jpg",
      "https://fotos.imghs.net/mm-wp/1005/101/1005_2935432214101_2_202606051854533172928.jpg"
    ],
    "url": "https://www.pisos.com/comprar/piso-gaztambide-65098413759_100500/",
    "scrapedAt": "2026-09-28T19:09:23.371Z"
  },
  {
    "listingId": null,
    "title": "Duplex en calle de Juan Ramon Jimenez, 4",
    "propertyType": "pisos",
    "operation": "venta",
    "price": 450000,
    "currency": "EUR",
    "pricePerSqm": 4091,
    "area": 110,
    "rooms": 3,
    "bathrooms": 3,
    "location": "Madrid",
    "neighborhood": null,
    "addressHint": null,
    "description": "Las Retamas-Prado Santo Domingo-Ensanche Sur (Alcorcon)",
    "features": [],
    "agency": null,
    "phone": null,
    "images": [
      "https://fotos.imghs.net/mm-wp/1064/390/1064_IJ364-99380390_1_202602190946518929476.jpg"
    ],
    "url": "https://www.pisos.com/comprar/duplex-las_retamas_prado_santo_domingo_ensanche_sur28922-61748204239_106400/",
    "scrapedAt": "2026-09-28T19:09:23.380Z"
  }
]
```

### Key output fields

| Field | Type | Description |
|-------|------|-------------|
| `title` | string | Listing title as shown on Pisos.com. |
| `propertyType` / `operation` | string | The search parameters that produced this listing (`pisos`, `venta`, etc.). |
| `price` | number | Listed price in euros. |
| `currency` | string | Always `EUR`. |
| `pricePerSqm` | number | null | Price divided by area, when Pisos.com shows or allows computing it. |
| `area` | number | Living area in square meters. |
| `rooms` / `bathrooms` | number | Bedroom and bathroom counts. |
| `location` | string | The city or area searched. |
| `neighborhood` / `addressHint` | string | null | Finer location detail, when Pisos.com exposes it on the listing card. |
| `description` | string | Short listing description or location note. |
| `features` | array | Listed amenities, when present. |
| `agency` / `phone` | string | null | Listing agency name and phone, when Pisos.com shows them on the card (see **Notes & limitations**). |
| `images` | array | Listing image URLs. |
| `url` | string | Canonical listing URL. |
| `scrapedAt` | string | Scrape timestamp. |

### Pricing

Pay-per-event, one charge type, minimum charge per run:

| Event | Price |
|-------|-------|
| Listing scraped | $0.005 |

Minimum charge per run: **$0.05**. That is **$5.00 per 1,000 listings**.

### What makes this richer than the competition

Two other actors on the Apify Store cover Pisos.com listings:

- **[logiover/pisos-com-property-scraper](https://apify.com/logiover/pisos-com-property-scraper)**
  (17 users in the last 30 days) charges $0.0035 per result on its Free
  tier plus a small actor-start fee, cheaper per item than this actor's
  $0.005.
- **[swerve/pisos-scraper](https://apify.com/swerve/pisos-scraper)** (1 user
  in the last 30 days) charges $0.0025 per result plus a small actor-start
  fee, also cheaper per item.

Neither competitor is cheaper by enough to matter on a typical research run
(a 200-listing pull is $0.70 to $1.00 more with this actor), and this is
not the cheapest Pisos.com scraper on the Store. What this actor covers
that neither publishes in its store listing is **three operations (sale,
rent, new build) crossed with seven property types (flats, houses,
chalets, offices, retail, garages, land)** as built-in search parameters,
plus a `startUrl` override for filtered searches (price range, room count)
built directly on the Pisos.com site. If price per item is your only
criterion, try logiover's or swerve's actor first; if you need new-build or
commercial-property coverage with one consistent output schema, this actor
covers more ground.

### Notes & limitations

- **`agency` and `phone` are frequently `null`.** Pisos.com does not show
  agency name or phone on every listing card in search results; when it
  isn't shown, the field is `null` rather than guessed.
- **`neighborhood` and `addressHint` depend on the listing.** Location
  precision on Pisos.com search cards varies; some listings show only a
  city-level location.
- **No GPS coordinates.** This actor does not extract latitude/longitude.
- **`location` is a Pisos.com slug, not free text.** Use the slug Pisos.com
  itself uses for that city or area (e.g. `madrid`, not `Madrid, Spain`).
- **Not the cheapest option per item.** See **What makes this richer than
  the competition** above for an honest price comparison.

### FAQ

**Do I need a Pisos.com account to use this?**
No. The actor reads public search-result listings; no login or credentials
are required.

**Which operations and property types are supported?**
Three operations (sale, rent, new build) and seven property types (flats,
houses, chalets, offices, retail, garages, land), for 21 combinations, plus
a custom `startUrl` for anything more specific.

**Can I filter by price range or number of rooms?**
Not through the built-in `operation`/`propertyType`/`location` fields.
Build the filtered search URL on Pisos.com directly and pass it as
`startUrl`.

**Why are `agency` and `phone` sometimes empty?**
Pisos.com doesn't show the agency name or phone number on every search
result card. The actor returns `null` rather than a guessed value.

**Does this actor return GPS coordinates?**
No. It returns the location and neighborhood text Pisos.com shows, not
latitude/longitude.

**How much does a 100-listing run cost?**
$0.50 at $0.005 per listing scraped (minimum $0.05 per run).

**Can I schedule this to run automatically?**
Yes, use Apify's built-in [schedules](https://docs.apify.com/platform/schedules)
for recurring market monitoring.

### For AI Agents & LLM Apps

This actor is callable from any MCP-compatible AI assistant through the
[Apify MCP server](https://mcp.apify.com), and directly from code through
the Apify API.

**Via MCP** (`mcp.apify.com`): add the Apify MCP server to your AI
assistant and call the `gio21/pisos-scraper` actor by name with
`operation`, `propertyType` and `location`.

**Via API** (`run-sync-get-dataset-items`):

```bash
curl "https://api.apify.com/v2/acts/gio21~pisos-scraper/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"operation": "venta", "propertyType": "pisos", "location": "madrid", "maxItems": 50}'
```

### Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by,
or sponsored by Pisos.com or any of its subsidiaries. All trademarks
mentioned are the property of their respective owners.

### SEO Keywords

pisos.com scraper, spain real estate scraper, pisos.com api, scrape spanish property listings, madrid property data, spain real estate data extraction

# Actor input Schema

## `operation` (type: `string`):

Type of operation: sale (venta), rent (alquiler) or new build (obra-nueva)

## `propertyType` (type: `string`):

Property type category

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

Pisos.com location (e.g. madrid, barcelona, valencia, sevilla, malaga)

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

Optional: direct Pisos.com search URL. Overrides operation/propertyType/location.

## `maxItems` (type: `integer`):

Maximum listings. Each costs $0.005. Capped at 500.

## `maxPages` (type: `integer`):

Maximum number of search result pages to scrape.

## Actor input object example

```json
{
  "operation": "venta",
  "propertyType": "pisos",
  "location": "madrid",
  "maxItems": 20,
  "maxPages": 3
}
```

# Actor output Schema

## `results` (type: `string`):

Listings with price, area, rooms, features, agency, images and URL.

# 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 = {
    "operation": "venta",
    "propertyType": "pisos",
    "location": "madrid",
    "maxItems": 20,
    "maxPages": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("gio21/pisos-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 = {
    "operation": "venta",
    "propertyType": "pisos",
    "location": "madrid",
    "maxItems": 20,
    "maxPages": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("gio21/pisos-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 '{
  "operation": "venta",
  "propertyType": "pisos",
  "location": "madrid",
  "maxItems": 20,
  "maxPages": 3
}' |
apify call gio21/pisos-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gio21/pisos-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/EpgGQDsJJ4UEAsMar/builds/QqnCEvVteROPLcjr8/openapi.json
