# BOE Subastas Scraper – Spanish Public Auctions, Scored (`nebulosa/boe-auction-triage`) Actor

Daily ranked feed of Spanish public auctions (subastas) announced in the BOE: Hacienda, Seguridad Social, AEAT, Defensa, ports. Filter by province, asset type and price; each lot scored 0-100 for discount, charges and legal risk, with reasons. Official BOE open data API.

- **URL**: https://apify.com/nebulosa/boe-auction-triage.md
- **Developed by:** [Nebulosa Data](https://apify.com/nebulosa) (community)
- **Categories:** Real estate, Business, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.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

## BOE Subastas Scraper – Spanish Public Auctions, Scored

This actor builds a daily ranked list of Spanish public auctions (subastas) announced in the BOE, from Hacienda, Seguridad Social, AEAT, Defensa and ports, filtered by province, asset type and price. Each lot gets a 0–100 score for discount, charges and legal risk with the reasons, so you only open the auctions worth checking.

A daily, ranked feed of **Spanish public auctions (subastas públicas)** announced in the **BOE (Boletín Oficial del Estado)**. It covers sales of property and land by the Ministerio de Hacienda (Delegaciones de Economía y Hacienda), the Tesorería General de la Seguridad Social, AEAT (Agencia Tributaria) recaudación, Defensa/INVIED, port authorities and other public bodies.

Filter by **province**, **asset type** (vivienda, local, nave, solar, finca rústica, garaje…) and **starting bid**. Each lot gets a **0–100 score** with reasons: auction round and discount, *libre de cargas* or charges, occupancy and lease flags, partial-ownership shares, and time to the auction date.

Ideal for investors, real-estate agents, asset hunters and anyone tracking *subastas de inmuebles del Estado* without reading the BOE every morning.

### What you get per lot

| Field | Example |
|---|---|
| `score`, `reasons` | 41 · "Second auction round", "Stated free of charges", "Auction on 2026-11-12 (23 days)" |
| `province`, `assetType` | Cádiz · commercial |
| `minBid`, `valuation`, `discountPct` | 784,591 € (tipo de licitación) |
| `round`, `auctionDate`, `deposit` | 2 · 2026-11-12 · 39,229.55 € |
| `flags` | free of charges, occupied, leased, partial ownership share, bare ownership… |
| `aiAttractiveness`, `aiLegalRisk` | TypeSafe Jev AI judgement (optional) |
| `lotNo`, `description`, `publisher` | Lote 15 – Terreno rústico en Chulilla, 5.000 m²… |
| `boeUrl`, `portalUrl`, `auctionRef` | link to the official announcement |

Announcements with many lots (for example a Delegación de Hacienda selling 40 rural plots) are split into **one row per lot**.

**AEAT notices:** many Agencia Tributaria notices in the BOE contain only an auction reference and a link to the electronic auction portal. These come out as `kind: "portal-pointer"` alerts, with province, reference and link but no price data. Turn them off with `includePortalPointers: false`.

### Example input

```json
{ "daysBack": 1, "provinces": ["Valencia", "Madrid"], "assetTypes": ["residential", "commercial", "land (urban)"], "maxValue": 300000, "minScore": 30 }
```

Schedule it daily with `daysBack: 1` and connect email, Telegram, Slack, Google Sheets or a webhook to get new opportunities every morning.

### Use cases

- **Real-estate investors** watching subastas públicas by province.
- **Car and equipment buyers** filtering vehicle and movable-asset auctions.
- **Advisers** preparing a daily shortlist for clients.

### Pricing

**$20 per 1,000 lots** saved (pay-per-event, from 4 Nov 2026), plus a tiny per-run start fee. Lots below `minScore` are not saved and not charged.

### Data source and legal

All data comes from the **official BOE open data API** (`boe.es/datosabiertos`, sumario) and the public HTML version of each announcement. Reuse is allowed under the BOE reuse conditions. *Fuente de los datos: Agencia Estatal Boletín Oficial del Estado* ([boe.es](https://www.boe.es)). The actor does **not** crawl subastas.boe.es, whose robots.txt disallows automated access, so judicial auction lots and AEAT lot details are linked, not scraped. Requests are throttled.

The scores are automated triage, not investment or legal advice. Always read the pliego de condiciones.

### More questions

**Where is the data from?**
The BOE open-data API (announcements section). The subastas.boe.es portal itself is not scraped (its robots.txt disallows it); each row links to it.

**Is the score investment advice?**
No. It is a triage aid: discount, round, charges and AI legal-risk flags. Always read the official announcement.

**Can I filter by province?**
Yes, plus asset type and minimum score.

### Pairs with

- [ted-eu-tenders](https://apify.com/nebulosa/ted-eu-tenders)
- [tender-relevance-scorer](https://apify.com/nebulosa/tender-relevance-scorer)

### Reports from Revunda

Need the results as a ready dataset or a one-off report instead of running the actor? See [Revunda Data](https://revunda.xyz/data/) ([ES](https://revunda.xyz/data/es/), [RU](https://revunda.xyz/data/ru/)) for prices and sample outputs.

### More questions (FAQ)

#### ¿Cómo recibir alertas de nuevas subastas del BOE?

Programa el actor a diario en Apify con tu provincia, tipo de bien y precio máximo, y envía el resultado a email, Slack o Google Sheets con las integraciones de Apify.

#### Where does the data come from?

From the official BOE open data API (anuncios de subastas). No login and no scraping of private pages.

#### Is the score investment advice?

No. It is a triage heuristic. Always check the edicto, cargas and possession status before bidding.

#### Can I filter by province and asset type?

Yes: provinces, asset types, a starting-bid range and keywords.

# Actor input Schema

## `daysBack` (type: `integer`):

How many BOE issues to scan (1 = today only, ideal for a daily schedule).

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

Spanish provinces, e.g. Madrid, Valencia, Cádiz, Lugo. Empty = all Spain.

## `assetTypes` (type: `array`):

Empty = all.

## `includePortalPointers` (type: `boolean`):

Many AEAT notices in the BOE only give an auction reference and a link to subastas.boe.es. Keep them as alerts (no price data).

## `minValue` (type: `integer`):

Min starting bid (EUR).

## `maxValue` (type: `integer`):

Max starting bid (EUR).

## `keywords` (type: `array`):

Bonus points when the lot text contains these (e.g. vivienda, Sagunto, olivar).

## `onlyUpcoming` (type: `boolean`):

Only upcoming auctions.

## `minScore` (type: `integer`):

You only pay for lots at or above this score.

## `maxResults` (type: `integer`):

Max results.

## `useAi` (type: `boolean`):

Adds AI attractiveness and legal-risk judgements to lots with full text.

## `typesafeApiKey` (type: `string`):

With your own key there is no AI fee.

## `maxAiCalls` (type: `integer`):

Max AI-scored lots per run.

## Actor input object example

```json
{
  "daysBack": 7,
  "provinces": [],
  "includePortalPointers": true,
  "onlyUpcoming": true,
  "minScore": 0,
  "maxResults": 200,
  "useAi": true,
  "maxAiCalls": 100
}
```

# Actor output Schema

## `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 = {
    "provinces": []
};

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

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

```

## MCP server setup

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

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/cOh4gkdaL2iplVFLp/builds/JDOk13ShWMV8M5jVh/openapi.json
