# BOE Subastas Scraper + Catastro: Spanish Property Auctions (`islandata/boe-subastas-catastro`) Actor

Spanish judicial, notarial and tax-agency property auctions from subastas.boe.es, one row per property, enriched with free Catastro data (built surface, year, use) and derived discount and price per m2. No login, no personal data.

- **URL**: https://apify.com/islandata/boe-subastas-catastro.md
- **Developed by:** [Radu Coman](https://apify.com/islandata) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 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.
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?

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

## BOE Subastas Scraper + Catastro: Spanish property auctions, enriched

**One JSON row per property in Spain's official auction portal (subastas.boe.es), enriched with free cadastral data and ready-to-filter numbers: discount vs. auction value, price per m², days to the deadline.** Export Spanish judicial foreclosures, notarial sales and Agencia Tributaria auctions to JSON, CSV or Excel, feed them to Google Sheets, n8n, Make or an AI agent, and monitor new auctions by province.

Judicial foreclosures, notarial sales and tax-agency auctions are published on the BOE's Portal de Subastas. The portal is public but built for humans: one auction per page, four tabs, lots split across sub-pages, and no API. This Actor is the missing **BOE Subastas API**: it turns the portal into structured data for investors, agencies, analysts and AI agents, and adds what the portal lacks: the property's **built surface, year of construction and cadastral use** from the Dirección General del Catastro, so you can compare the auction value with the real asset.

No login is used, no personal data of debtors is collected, and the Actor stays at **one request per second** towards the BOE.

### Who uses it

- **Property investors** looking for repossessed homes (viviendas embargadas), garages, commercial premises or land below market value, filtered by province and by discount on the auction value.
- **Real-estate agencies and asesores** who want a daily list of new auctions in their area in Excel or Google Sheets.
- **Analysts and journalists** studying foreclosure volumes, minimum bids and price per square metre by province.
- **AI agents and automations** (n8n, Make, Zapier, LangChain, MCP) that need small, flat JSON instead of HTML tabs.

### What you get per row

| Block | Fields |
|---|---|
| `auction` | id, URL, type (judicial, notarial, agency), status, start and end date (ISO), BOE announcement id, claimed amount, auction value, appraisal, minimum bid, bid increment, deposit, number of lots, lot number |
| `property` | kind (Vivienda, Garaje, Local, Finca rústica, Solar…), description, address, postal code, locality, province and province code, possession status, visitable, registry inscription, IDUFIR, charges, habitual residence, legal title, cadastral reference |
| `catastro` | use, built surface m², year built, share, parcel type, cadastral address, municipality, parcel surface m², official map link, list of constructions. `null` when the auction publishes no cadastral reference |
| `catastroStatus` | `enriched`, `no-reference`, `failed` (service error, not charged) or `disabled` |
| `derived` | `discountVsAuctionValue` (1 − minimum bid / auction value), `pricePerM2` with `pricePerM2Basis` (`built` or `parcel` for land), `daysToEnd` |
| `bids` | whether the auction has public bids and the current maximum bid |
| `authority` | optional: court, notary or agency running the auction (code, name, institutional address, phone, email) |
| `meta` | source attribution and scrape timestamp |

Auctions with several lots produce one row per property per lot, each with the lot's own value, minimum bid and deposit.

### Input

- **Provinces**: two-digit INE codes (`38` Santa Cruz de Tenerife, `35` Las Palmas, `28` Madrid, `08` Barcelona…) or `all` for the whole country.
- **Status**: `EJ` in progress (default), `PU` announced, or `all`.
- **Max items**: stop after N rows (default 200).
- **Enrich with Catastro**: on by default.
- **Include current maximum bid**: on by default (one extra request per auction).
- **Include managing authority**: off by default.

Example:

```json
{ "provinces": ["38", "35"], "status": "EJ", "maxItems": 500, "enrichCatastro": true }
```

### Pricing

Pay per event, charged only after the row is saved:

- `result`: $0.002 per property row.
- `catastro-enrichment`: $0.003 per row that was actually enriched (not charged when the auction has no cadastral reference or the Catastro service fails).

Measured on real runs in October 2026: Madrid (61 active auctions, 83 rows, 36 enriched) cost $0.27; Las Palmas (26 auctions, 92 rows, 11 enriched) cost $0.22; Santa Cruz de Tenerife (15 auctions, 19 rows, 12 enriched) cost $0.07. You are not charged for Apify platform usage.

### Quality and limits

- Every row is validated against a strict schema before it is saved; rows that fail validation are logged and not charged.
- Measured on real runs (October 2026, three provinces, 102 auctions, 194 rows): 0 parse issues, 0 failed requests, 3 Catastro lookups rejected because the BOE published an invalid reference (reported as `failed`, not charged), 1.9 to 3.4 s per row.
- Between 12 % and 63 % of rows carry a cadastral reference depending on the province (Las Palmas 12 %, Madrid 43 %, Tenerife 63 %); the rest get `catastroStatus: "no-reference"`. That is a property of the source, not of the Actor. When the reference is only mentioned inside the free-text description, the Actor still finds it (`cadastralReferenceSource: "text"`).
- Information behind the portal's login ("Información complementaria") is not read.
- The BOE portal publishes bids only when the managing authority makes them public; otherwise `bids.hasBids` is `false`.
- Catastro is queried through its free public web service for non-protected data; owner data is never requested.

### Attribution and reuse

Data reuse is allowed by the BOE's legal notice for commercial and non-commercial purposes with attribution. Every row carries it in `meta.source`:

> Basado en datos de la Agencia Estatal Boletín Oficial del Estado (https://subastas.boe.es) y de la Dirección General del Catastro

Keep this attribution when you redistribute the data.

### How to use it

**In the Apify Console**: pick provinces, keep the defaults and press Start. Download the dataset as JSON, CSV, Excel or HTML table from the Storage tab.

**From your code (Apify API)**:

```bash
curl -X POST "https://api.apify.com/v2/acts/islandata~boe-subastas-catastro/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"provinces": ["38"], "status": "EJ", "maxItems": 100}'
```

**In n8n, Make or Zapier**: use the Apify node or app, choose this Actor (`islandata/boe-subastas-catastro`), pass the same JSON input and map the dataset rows to Google Sheets, Airtable, Notion, Slack or email. With `status: "PU"` (announced auctions) on a daily schedule you get an alert for every new auction in your provinces.

**With an AI agent (MCP)**: connect your agent to `https://mcp.apify.com?tools=islandata/boe-subastas-catastro` and ask for "auctions in Tenerife with more than 30 % discount and a cadastral reference". The output is small, flat JSON designed for agents: filter on `derived.discountVsAuctionValue`, `derived.pricePerM2` and `derived.daysToEnd`.

### FAQ

**Is this the official BOE auctions API?** No. The BOE publishes no API for the Portal de Subastas; this Actor reads the public pages at one request per second and structures them. Reuse is allowed by the BOE legal notice with attribution.

**Does it include the cadastral reference and surface for every property?** Only when the auction publishes a cadastral reference (between 12 % and 63 % of rows depending on the province). The rest are returned with `catastroStatus: "no-reference"` and are not charged the enrichment fee.

**Can I get the whole of Spain?** Yes, with `provinces: ["all"]`. Around 1,500 to 2,500 active auctions are usually open nationwide; set `maxItems` accordingly.

**Does it bid or log in?** Never. It reads public information only; nothing behind the portal login is touched.

**What about debtors' personal data?** None is collected. Only the asset, the auction figures and, optionally, the institutional authority running the auction.

***

## Español: subastas del BOE con datos del Catastro, en JSON, CSV o Excel

**Una fila JSON por inmueble del Portal de Subastas del BOE, enriquecida con datos catastrales gratuitos y con cifras listas para filtrar: descuento sobre el valor de subasta, precio por m² y días hasta el cierre.** Exporta las subastas judiciales, notariales y de la Agencia Tributaria a Excel o Google Sheets, recibe avisos de subastas nuevas por provincia y conéctalas a n8n, Make o un agente de IA.

El Actor recorre subastas.boe.es (ejecuciones hipotecarias y judiciales, subastas notariales y de la Agencia Tributaria: viviendas, garajes, locales, solares y fincas rústicas), lee las pestañas de información general, bienes, pujas y, opcionalmente, autoridad gestora, separa los lotes y consulta el servicio web libre del Catastro para añadir superficie construida, año de construcción y uso. Sin iniciar sesión, sin datos personales de deudores, a una petición por segundo.

**Para quién**: inversores que buscan viviendas embargadas y locales por debajo del precio de mercado, agencias y asesores que quieren la lista diaria de subastas de su provincia, analistas y periodistas, y automatizaciones o agentes de IA que necesitan JSON plano en vez de pestañas HTML.

**Entrada**: provincias por código INE (`38` Santa Cruz de Tenerife, `35` Las Palmas, `28` Madrid, `08` Barcelona, `46` Valencia, `41` Sevilla, `29` Málaga…) o `all` para toda España; estado `EJ` (celebrándose), `PU` (anunciadas) o `all`; máximo de filas; enriquecimiento Catastro; puja máxima; autoridad gestora.

**Cómo usarlo**: desde la consola de Apify (descarga en JSON, CSV o Excel), desde la API de Apify (`islandata~boe-subastas-catastro/run-sync-get-dataset-items`), desde el nodo de Apify en n8n, Make o Zapier hacia Google Sheets, o desde un agente de IA mediante MCP (`https://mcp.apify.com?tools=islandata/boe-subastas-catastro`).

**Precio**: 0,002 $ por fila guardada y 0,003 $ adicionales por fila realmente enriquecida con Catastro. Medido en octubre de 2026: Madrid (61 subastas, 83 filas, 36 enriquecidas) costó 0,27 $; Las Palmas (26 subastas, 92 filas) 0,22 $; Tenerife (15 subastas, 19 filas) 0,07 $. El uso de la plataforma Apify no se cobra aparte.

**Calidad**: cada fila se valida contra un esquema estricto antes de guardarse; las que fallan no se cobran. Entre el 12 % y el 63 % de las subastas publican referencia catastral según la provincia; el resto llevan `catastroStatus: "no-reference"` y no pagan el enriquecimiento.

**Preguntas frecuentes**: no es la API oficial del BOE (no existe); no puja ni inicia sesión; no recoge datos personales de deudores; `provinces: ["all"]` cubre toda España.

**Atribución**: la reutilización está permitida por el aviso legal del BOE con cita de la fuente. Cada fila la incluye en `meta.source`: «Basado en datos de la Agencia Estatal Boletín Oficial del Estado y de la Dirección General del Catastro». Conserva esta atribución al redistribuir los datos.

# Actor input Schema

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

Two-digit INE province codes, e.g. \["38"] Santa Cruz de Tenerife, \["35"] Las Palmas, \["28"] Madrid, \["08"] Barcelona. Use \["all"] for the whole of Spain (bounded by Max items). One province of 15-60 auctions takes 1-5 minutes at the polite rate of one request per second.

## `status` (type: `string`):

EJ = in progress (bidding open). PU = announced, not yet open. all = no status filter.

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

I = real estate (default). Other BOE asset types (vehicles, others) are not validated in this version.

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

Stop after this many property rows. Each row is one paid 'result' event.

## `enrichCatastro` (type: `boolean`):

Query the free Catastro service for every cadastral reference found (built surface, year, use, map link). Adds one 'catastro-enrichment' event per enriched row.

## `includeBids` (type: `boolean`):

Reads the 'Pujas' tab (one extra request per auction).

## `includeAuthority` (type: `boolean`):

Court or agency running the auction: name, code, institutional address, phone and email (one extra request per auction).

## `boeRequestsPerSecond` (type: `integer`):

Politeness limit towards subastas.boe.es. 1 is the default and recommended value; maximum 2.

## Actor input object example

```json
{
  "provinces": [
    "38"
  ],
  "status": "EJ",
  "propertyType": "I",
  "maxItems": 200,
  "enrichCatastro": true,
  "includeBids": true,
  "includeAuthority": false,
  "boeRequestsPerSecond": 1
}
```

# Actor output Schema

## `rows` (type: `string`):

All property rows of the run as JSON: auction, property, catastro, derived, bids, authority, meta.

## `rowsCsv` (type: `string`):

The same rows as CSV, flattened.

## `runSummary` (type: `string`):

Counts of auctions, rows, enriched rows, failures and the economics of the run.

# 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": [
        "38"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("islandata/boe-subastas-catastro").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": ["38"] }

# Run the Actor and wait for it to finish
run = client.actor("islandata/boe-subastas-catastro").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": [
    "38"
  ]
}' |
apify call islandata/boe-subastas-catastro --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,islandata/boe-subastas-catastro"
        }
    }
}
```

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/b4dzT2U9yhlk6Cfzc/builds/oOs6SdpJTvwiSKKMI/openapi.json
