# Pisos.com Scraper: Spain Real Estate & Rentals (`responsible_front_evw/pisos-com-scraper`) Actor

Scrape Pisos.com: Spain property and real estate data. Flats, apartments and houses for rent or sale in any city or province. Price, price per m², price drops, size, rooms, coordinates, seller type. Detail mode adds energy certificate and small or large landlord. No private sellers' contacts.

- **URL**: https://apify.com/responsible_front_evw/pisos-com-scraper.md
- **Developed by:** [Open Data Tools](https://apify.com/responsible_front_evw) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

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: Spain Real Estate & Rentals

Get clean, structured data from **Pisos.com**, one of Spain's long-standing property portals, with strong coverage outside the big cities (Andalusia, the Valencian Community, Aragon, Castile and more). Paste a search URL or type a city or province, and get a table of listings with price, price per m², size, rooms, neighbourhood, postal code, coordinates and price drops. Export to Excel, CSV, JSON or connect it to your tools via API.

**New for the Spanish rental market:** in detail mode, each listing tells you whether the landlord is a **small holder or a large holder** ("pequeño tenedor" / "gran tenedor"), the category that matters under Spain's Housing Law and in stressed rental areas.

### What is it for?

- **Real estate investors:** compare price per m² by neighbourhood and postal code, and spot listings whose price has just dropped (`priceDrop`, `priceDropPercent`).
- **Agencies and property managers:** monitor the competition's stock in your town, see who publishes what, and track new listings every day.
- **Rental market analysts, housing researchers and journalists:** build rent indexes by district and see the share of small vs large landlords in an area.
- **Proptech and data teams:** a reliable daily feed of Spanish listings outside Idealista, without maintaining your own scraper.

### Example output (one listing, detail mode, shortened)

```json
{
  "id": "66703291365.521710",
  "url": "https://www.pisos.com/comprar/piso-arenal_la_polvora41701-66703291365_521710/",
  "operation": "sale",
  "propertyType": "piso",
  "title": "Piso en Avenida de Cristóbal Colón, 38",
  "price": 183000,
  "currency": "EUR",
  "priceDrop": 10000,
  "priceDropPercent": 5,
  "pricePerM2": 1759.62,
  "surfaceM2": 104,
  "usableSurfaceM2": 65,
  "rooms": 2,
  "bathrooms": 2,
  "floor": "2ª",
  "neighbourhood": "Arenal-La Pólvora",
  "district": "Zona Centro",
  "city": "Dos Hermanas",
  "province": "Sevilla",
  "postalCode": "41701",
  "latitude": 37.281933,
  "longitude": -5.930022,
  "sellerType": "professional",
  "agencyName": "Example Agency",
  "condition": "En buen estado",
  "age": "Entre 10 y 20 años",
  "communityFees": "Entre 40 y 60 €",
  "orientation": "Sur",
  "energyCertificate": "En trámite",
  "landlordType": "small",
  "updatedAt": "2026-10-22",
  "tags": ["Oportunidad"],
  "photoCount": 25,
  "detailFetched": true
}
```

### What data do you get?

| Group | Fields | Search page | Detail mode |
|---|---|---|---|
| Price | price (EUR), monthly or total, price drop (EUR and %), price per m² | yes | yes |
| Size and layout | built size, rooms, bathrooms, floor | yes | yes |
| More size | usable size, land area | | yes |
| Location | street, neighbourhood, district, city, province, postal code (when shown), latitude and longitude, area codes | yes | yes |
| Property | type (flat, penthouse, house, chalet, loft...), tags ("Oportunidad", "Exclusivo", "Amueblado"...), condition, age, orientation, heating, community fees, all other features (lift, air conditioning, terrace, parking...) | type and tags | everything |
| Listing | title, short description, full description, main photo, photo count, last update date, reference, listing URL | most | everything |
| Seller | seller type (`private` or `professional`), agency profile URL, agency name, optional agency phone | yes | yes |
| Landlord | `landlordType`: `small` or `large` holder, when the listing states it | | yes |

A search page has 30 listings, so a run is fast and cheap: 60 listings take under 10 seconds.

### How to use it

1. Go to [pisos.com](https://www.pisos.com), choose rent or buy, the city, province or area.
2. Copy the URL of the results page (for example `https://www.pisos.com/alquiler/pisos-valencia/`) and paste it into **Pisos.com search URLs**. You can add several URLs.
3. Or simply type a **City or province** (`valencia`, `sevilla`, `zaragoza`, `malaga`...) and choose **Operation**.
4. Set **Max listings** and click **Start**.
5. Turn on **Open each listing's detail page** if you need all features, the full description, the energy certificate, the last update date and the landlord type.

#### Example input

```json
{
  "startUrls": [{ "url": "https://www.pisos.com/alquiler/pisos-valencia/" }],
  "maxItems": 100,
  "fetchDetails": false,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

### Pricing

Pay only for what you get (pay per event):

| Event | Price |
|---|---|
| Listing returned | **$2.00 per 1,000 listings** ($0.002 each) |
| Detail page opened (optional, `fetchDetails`) | $2.00 per 1,000 listings, extra |
| Run start | $0.00005 per run |

Example: 1,000 rental listings in Valencia cost about $2. With detail pages, about $4. Platform usage is included. Set a maximum cost per run in the run options if you want a hard limit.

### Limitations

- Pisos.com shows no publication date, only the last update date (`updatedAt`, detail mode).
- Some listings hide the price: `price` is then empty.
- The postal code appears only when the listing URL includes it (about one in three listings).
- The landlord type appears only when the listing states it.
- If the website changes its layout, the Actor may stop working for a while until it is updated.
- Proxy: start without proxy. If runs get blocked, use Apify datacenter proxy.

### Responsible use

- The Actor only reads public search and listing pages that `robots.txt` allows. URLs that `robots.txt` disallows (map pages, `.aspx` pages, language versions, holiday rentals, internal services) are refused before any request.
- It **never collects phone numbers, emails or names of private sellers.** For private listings, the street number is removed and coordinates are rounded to about 100 metres, so the exact home is not published. Agency phone is optional and off by default. Phone numbers and emails written inside the description text are replaced with `[phone removed]` or `[email removed]`.
- It waits between requests (2 seconds by default) to keep the load on the website low.
- You are responsible for how you use the data. Respect Pisos.com's terms, intellectual property and database rights, and data protection law (GDPR). Do not use the data to send unsolicited messages to private owners.

### FAQ

#### Is there a Pisos.com API?

Pisos.com has no public API for listings. This Pisos.com scraper works as one: run it from the Apify API, schedule it, and get JSON, CSV or Excel.

#### How much does it cost?

$2 per 1,000 listings. Detail mode adds $2 per 1,000. No monthly fee.

#### Small or large landlord ("pequeño tenedor" / "gran tenedor")?

In detail mode, `landlordType` says `small` or `large` when the listing states it. Useful for Spain's Housing Law and stressed rental areas.

#### Is it an alternative to Idealista or Fotocasa scrapers?

Pisos.com is a different Spanish property portal with its own stock, strong outside the big cities. Use it together with Idealista, Fotocasa or Habitaclia scrapers to cover more of the Spanish real estate market.

#### Can I track price drops and new listings?

Yes. Schedule a daily run on the same search. Each listing shows its price drop.

#### Does it collect personal data?

No personal data of private sellers: no names, phones or emails.

### En español

**Scraper de pisos.com: pisos y casas en venta y alquiler en toda España.** Pega la URL de una búsqueda de pisos.com o escribe una ciudad o provincia, y sacas una tabla con precio, precio por m², metros, habitaciones, barrio, código postal, coordenadas y bajadas de precio. Resultados en JSON, CSV o Excel, y se puede programar cada día para seguir anuncios nuevos y bajadas.

- **Pequeño o gran tenedor:** en modo ficha, cada anuncio dice si el arrendador es pequeño o gran tenedor cuando el anuncio lo indica (Ley de Vivienda y zonas tensionadas).
- **Sin datos personales:** de los particulares no salen nombre, teléfono, correo ni número de portal, y las coordenadas se redondean a unos 100 metros.
- **Precio:** 2 $ por 1.000 anuncios, y 2 $ más por 1.000 si abres las fichas. Sin cuota mensual.
- **Para qué sirve:** precio por m² por barrio y código postal, índices de alquiler, seguimiento del mercado fuera de las grandes ciudades, comparar con Idealista, Fotocasa o Habitaclia.

### Questions or a missing field?

Open an issue in the **Issues** tab. Feature requests are welcome.

# Actor input Schema

## `startUrls` (type: `array`):

One or more results pages from pisos.com. Open pisos.com, choose rent or buy, the city or area and your filters, then paste the URL of the results page. Example: https://www.pisos.com/alquiler/pisos-valencia/

## `city` (type: `string`):

Name in Spanish, for example valencia, madrid, sevilla, malaga, zaragoza. Used together with 'Operation'.

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

Rent or sale. Only used with 'City'.

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

Maximum number of listings to return in total. You only pay for the listings you get.

## `maxPagesPerSearch` (type: `integer`):

0 = no limit. Each results page has 30 listings.

## `fetchDetails` (type: `boolean`):

Slower and charged extra (one more request per listing). Adds the full description, all features (lift, air conditioning, heating, orientation...), usable size, condition, energy certificate, last update date, agency name and whether the landlord is a small or large holder.

## `includeAgencyContact` (type: `boolean`):

Only for listings published by real estate agencies. Contact data of private sellers is never collected.

## `requestDelaySecs` (type: `integer`):

Pause between page requests, to be gentle with the website.

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

Start with no proxy. If the website blocks the run, use Apify datacenter proxy. Residential proxy is rarely needed and costs much more.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.pisos.com/alquiler/pisos-valencia/"
    }
  ],
  "operation": "alquiler",
  "maxItems": 60,
  "maxPagesPerSearch": 0,
  "fetchDetails": false,
  "includeAgencyContact": false,
  "requestDelaySecs": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `results` (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 = {
    "startUrls": [
        {
            "url": "https://www.pisos.com/alquiler/pisos-valencia/"
        }
    ],
    "maxItems": 60,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("responsible_front_evw/pisos-com-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 = {
    "startUrls": [{ "url": "https://www.pisos.com/alquiler/pisos-valencia/" }],
    "maxItems": 60,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("responsible_front_evw/pisos-com-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 '{
  "startUrls": [
    {
      "url": "https://www.pisos.com/alquiler/pisos-valencia/"
    }
  ],
  "maxItems": 60,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call responsible_front_evw/pisos-com-scraper --silent --output-dataset

```

## MCP server setup

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