# Spain Bank-Owned Properties (Pisos de Banco) Scraper (`sn41lz/spain-bank-properties`) Actor

Scrape bank-owned homes, garages, land and commercial properties for sale in Spain from Solvia (Sabadell) and Aliseda (Santander) into one unified dataset with price, previous price, discount %, m², rooms and location.

- **URL**: https://apify.com/sn41lz/spain-bank-properties.md
- **Developed by:** [Sergi Espí Zamora](https://apify.com/sn41lz) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 property saveds

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

## Spain Bank-Owned Properties Scraper — Pisos de banco (Solvia + Aliseda + Servihabitat)

Get **every bank-owned property for sale in Spain** from **Solvia** (Banco Sabadell), **Aliseda** (Banco Santander) and **Servihabitat** (CaixaBank) in **one clean, unified dataset**: price, previous price, **discount %**, price per m², size, bedrooms, bathrooms, address, province, occupancy status, photos and a direct link.

No more checking several bank portals by hand. Filter by **province**, **price range** and **minimum discount**, schedule it daily, and export to Excel, CSV, JSON or Google Sheets.

### Who is it for?

- **Real estate investors** hunting bank repossessions (pisos de banco) and discounted properties.
- **Agencies and brokers** tracking bank inventory in their area.
- **Analysts** studying bank-owned stock, prices and discounts across Spain.
- **Deal-alert services**: run it on a schedule and get only the new or cheaper properties.

### What data do you get?

| Field | Example |
|---|---|
| `source` | `solvia` / `aliseda` / `servihabitat` |
| `category` | `viviendas`, `garajes`, `locales`, `terrenos`… |
| `title` | Piso en calle Robador, Barcelona |
| `price` | 160910 |
| `previousPrice` | 168150 |
| `discountPct` | 4.3 |
| `pricePerM2` | 4125 |
| `areaM2`, `bedrooms`, `bathrooms` | 39, 1, 1 |
| `address`, `postalCode`, `city`, `province`, `region` | calle Robador, 08001, Barcelona, Barcelona, Cataluña |
| `latitude`, `longitude` | 41.3787, 2.1712 (Aliseda) |
| `possession` | `LIBRE`, `ALQUILADO`, `OKUPADO`, `SIN POSESION` (occupancy status) |
| `partialOwnership` | `true` when only a share of the property is for sale (Aliseda) |
| `inAuction`, `reserved` | false, false (Solvia) |
| `energyRating`, `publishedAt` | E, 2024-02-19 (Aliseda) |
| `images` | list of photo URLs |
| `changeType`, `previousRunPrice`, `priceDropPct` | `new` or `priceDrop`, 145000, 9.4 (only-changes mode) |
| `url` | direct link to the listing |

Some fields are only published by one of the portals and will be `null` for the other.

#### Sample output

```json
{
  "source": "aliseda",
  "category": "viviendas",
  "title": "Cómodo Piso en Barcelona, ideal para parejas",
  "price": 160910,
  "previousPrice": 168150,
  "discountPct": 4.3,
  "pricePerM2": 4125.0,
  "areaM2": 39,
  "bedrooms": 1,
  "bathrooms": 1,
  "address": "calle Robador",
  "postalCode": "08001",
  "city": "Barcelona",
  "province": "Barcelona",
  "possession": "LIBRE",
  "url": "https://www.alisedainmobiliaria.com/inmueble/ant00030648764"
}
```

### How to use it

1. Pick the **sources** (Solvia, Aliseda, Servihabitat) and **property types**.
2. Optionally set **provinces**, **min/max price** and **min discount %**.
3. Set **Max results** to cap cost, or 0 to get everything.
4. Click **Start** and download your data in any format.

**Tip:** for alerts, see *Daily alerts* below.

### Daily alerts: only new properties and price drops

Turn on **Only new properties and price drops** and schedule the Actor to run every day. Each run then returns only:

- **New properties** (`changeType: "new"`) that you haven't received before, and
- **Price drops** (`changeType: "priceDrop"`) with the previous price and the drop in %.

You only pay for what changed. The first run returns everything as new and becomes your baseline. Each combination of settings keeps its own history; give it a **Monitor name** (for example `madrid-deals`) to run several alerts side by side. Connect the run to email, Slack or Google Sheets in the Integrations tab and you have a bargain alert with no code.

### How much does it cost?

You pay per property saved. Filters are applied before saving, so you only pay for the properties you actually want, and duplicates are removed, so you never pay twice for the same property. Use **Max results** to set a hard cap.

### How long does it take?

- **One province:** usually 1–3 minutes.
- **All of Spain** (homes, all three portals, ~9,000+ properties): about 50 minutes. Schedule it overnight.

### Data coverage

- **Solvia:** every listed property.
- **Servihabitat:** every property shown in its listings. It hides the price of some ("precio a consultar"); those come with an empty price.
- **Aliseda:** its website sometimes shows the same property on two result pages and skips others, so around 4% of Aliseda properties may be missing from a given run. This comes from the site itself.

### Is it legal?

This Actor only collects publicly listed property information (no personal data). It browses the public listing pages at a moderate pace, like a regular visitor. You are responsible for how you use the data. Check the websites' terms and applicable law (including GDPR and database rights) for your use case.

***

### En español: pisos de banco en España

Descarga **todos los pisos y casas de banco en venta** de **Solvia** (Sabadell), **Aliseda** (Santander) y **Servihabitat** (CaixaBank) en un único listado: precio, precio anterior, **% de descuento**, €/m², metros, habitaciones, baños, dirección, provincia, si está ocupado, fotos y enlace.

Filtra por **provincia**, **precio** y **descuento mínimo**, y activa **solo novedades y bajadas de precio** para recibir cada día únicamente los pisos nuevos o rebajados (y pagar solo por esos). Exporta a Excel, CSV o Google Sheets. Ideal para inversores, inmobiliarias y alertas de chollos inmobiliarios.

Incluye viviendas, garajes, locales, oficinas, terrenos, naves, trasteros y edificios.

# Actor input Schema

## `sources` (type: `array`):

Which bank property portals to scrape.

## `categories` (type: `array`):

Types of property to scrape.

## `provinces` (type: `array`):

Only keep properties in these provinces, e.g. "Madrid", "Valencia", "Alicante". Leave empty for all of Spain.

## `onlyChanges` (type: `boolean`):

Return only properties that are new or cheaper than in the previous run with the same settings, and pay only for those. The first run returns everything as new. Ideal for a daily schedule: you get alerts on new bank properties and price cuts.

## `monitorName` (type: `string`):

Only for 'Only new properties and price drops'. Runs with the same name share one history, e.g. 'madrid-deals'. Leave empty to keep one history per combination of settings.

## `minPrice` (type: `integer`):

Only keep properties at or above this price.

## `maxPrice` (type: `integer`):

Only keep properties at or below this price.

## `minDiscountPct` (type: `integer`):

Only keep properties whose price has been reduced by at least this percentage.

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

Stop after saving this many properties. 0 = no limit.

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

Not needed by default. Enable Apify Proxy only if your runs get blocked.

## Actor input object example

```json
{
  "sources": [
    "solvia",
    "aliseda",
    "servihabitat"
  ],
  "categories": [
    "viviendas"
  ],
  "provinces": [],
  "onlyChanges": false,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Price, previous price, discount, size, rooms, location, occupancy and link for each property.

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

Every field for each property, including address, coordinates, description and photos.

# 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 = {
    "provinces": [],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("sn41lz/spain-bank-properties").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 = {
    "provinces": [],
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("sn41lz/spain-bank-properties").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 '{
  "provinces": [],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call sn41lz/spain-bank-properties --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sn41lz/spain-bank-properties"
        }
    }
}
```

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/obe6GCssVRgChRJ66/builds/kvRh4UGlf7mdiOHJB/openapi.json
