Spain Property & Judicial Auctions Scraper | BOE
Pricing
from $1.20 / 1,000 auction records
Spain Property & Judicial Auctions Scraper | BOE
Scrape Spain's official BOE auction portal: judicial and public auction listings with expediente, dates, claim amounts, valuations, minimum bids, deposits, authority contact, property lots and documents. Monitoring (NEW, UPDATED, EXPIRED), incremental runs, resume, MCP export.
Pricing
from $1.20 / 1,000 auction records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
9 hours ago
Last modified
Categories
Share
Spain BOE Auction Scraper
Scrape Spain's BOE auction portal (subastas.boe.es) - judicial and administrative auctions with money fields, property lots, bid status, and documents, ready for search or pasted links and monitoring over time.
Why This Scraper?
- Every auction status. Search across all five portal statuses (upcoming, judicial enforcement, subsequent, cancelled, finished) or read specific auction links you paste in.
- Money fields and lots. Each record carries claim amount, appraised value, valuation, minimum bid, deposit, bid tranches, lot count, and the full lot details with documents.
- Dates and authority. Conclusion, start, and publication dates plus the enforcing authority, province, locality, street address, and postal code - everything needed to filter and route a deal.
- Bid status without an account. Each enriched record says whether the auction received bids and where its bidding period stands. Bid amounts are the one thing the portal answers only to registered users, so the actor reports the public status instead of inventing a number.
- Documents linked. Bases, inventory, and appraisal attachments are collected as URLs on every record.
- Monitoring ready. Incremental mode with resume and change fields flags what moved between runs, so you can schedule recurring checks cheaply.
Use Cases
- Who: Real estate investors tracking foreclosure and enforcement auctions nationwide.
- Who: Legal and compliance researchers monitoring auction activity by court or authority.
- Who: Data teams enriching property pipelines with BOE auction records and valuation history.
Data You Get
Sample shape: one auction record as published on the portal.
| Field | Example |
|---|---|
idSub | SUB-JA-2025-251191 |
estado | EJ |
tipoSubasta | JUDICIAL EN VÍA DE APREMIO |
cuentaExpediente | 3527 0000 05 1106 24 |
fechaInicio | 18-09-2026 18:00:00 CET (ISO: 2026-09-18T18:00:00+02:00) |
fechaConclusion | 08-10-2026 18:00:24 CET (ISO: 2026-10-08T18:00:24+02:00) |
fechaPublicacion | 26-09-2026 |
cantidadReclamada | 278.898,39 € |
valorSubasta | 230.518,81 € |
tasacion | 384.198,00 € |
pujaMinima | Sin puja mínima |
tramos | 4.610,37 € |
deposito | 11.525,94 € |
lotes | 1 |
pujasEstado | con pujas |
hasBids | true |
autoridadCodigo | 28079 |
autoridadDescripcion | JUZGADO DE PRIMERA INSTANCIA N. 7 DE MADRID |
provincia | MADRID |
localidad | MADRID |
direccion | CALLE FALSA 123 |
codigoPostal | 28013 |
detailUrl | https://subastas.boe.es/detalleSubasta.php?idSub=SUB-JA-2025-251191 |
changeType | NEW |
lastSeenAt | 2026-10-01T09:14:03.000Z |
Property lots ride the record in bienes (description, address, postal code, town, province, possession status, visitable flag, registry entry).
The dataset carries four Output tabs:
- Auctions - the default flat view of every auction.
- Auctions (all fields) - the full record including the nested
bienesanddocumentosobjects. - Property lots - one row per property lot, unwound next to its auction.
- Changes (incremental mode) - just the monitoring fields, for schedule runs.
How to Use
- Pick Status and date search mode and choose one or more statuses plus a conclusion-date window.
- Or switch to Links mode and paste auction detail URLs you already know.
- Toggle detail enrichment to pull lots, documents, bid status, and the full money fields from each auction page.
- Download the dataset as CSV/JSON, or connect Notion to push each auction as a rich page.
Search auctions in a date window:
{"mode": "search","estados": ["EJ"],"fechaFinDesde": "2026-10-01","fechaFinHasta": "2026-10-08","fetchDetails": true,"maxItems": 20}
Follow specific auction links:
{"mode": "url","startUrls": ["https://subastas.boe.es/detalleSubasta.php?idSub=SUB-JA-2025-251191","https://subastas.boe.es/detalleSubasta.php?idSub=SUB-AT-2026-26R4686001266"],"fetchDetails": true,"maxItems": 20}
Monitor for changes on a schedule:
{"mode": "search","estados": ["EJ"],"fechaFinDesde": "2026-10-01","fetchDetails": true,"maxItems": 50,"incrementalMode": true,"stateKey": "boe-es-auctions"}
Every link shape the portal emits is read through its auction id:
| Shape | Example |
|---|---|
| Judicial detail (canonical) | https://subastas.boe.es/detalleSubasta.php?idSub=SUB-JA-2025-251191 |
| Administrative/tax detail (alphanumeric id) | https://subastas.boe.es/detalleSubasta.php?idSub=SUB-AT-2026-26R4686001266 |
| Detail with search context | the same links with &idBus=... or &idLote=... parameters appended |
| Bare auction id | SUB-JA-2025-251191 on its own |
Links that carry none of these shapes are skipped with a warning in the run log - never silently dropped. With the field untouched in URL mode, the two example links above are read so the run always has a concrete shape to show; replace them with your own links.
Status search exposes the portal's own narrowing options plus a value range:
- Asset type (
tipoBien): real estate only (the default, matching the actor's original behaviour), vehicles only, or all asset types. - Sort (
sortField+sortOrder): conclusion date (default), auction id, status, or minimum bid, ascending or descending - applied by the portal itself. - Value range (
valorMinimo/valorMaximo): keep only auctions whose auction value falls inside the range, evaluated in euros after each auction is read. Detail reads must be on for the filter to see every auction's valuation; with details off the filter applies only where a value was read and a run-log warning says so. - Province (
provincia): one province by NAME (accents optional) or INE code; an unmatched name fails the run with the list of valid provinces. - Auction id (
idSubasta): fetch one auction by identifier.
Turn incremental mode on for scheduled runs. The first run returns every matching auction as NEW; later runs compare the full auction snapshot (amounts, dates, status, lots, authority) against the stored baseline and return only what moved. Fields that change without the auction changing - the document list and the authority phone/fax/email - never count as updates, and ignoreFieldsForChanges adds more. State is keyed per status, date-window and link setup, or name it with stateKey. Expired tombstones are produced only when a run has fully scanned the tracked search, never after a cap or an interrupted page.
Run it from your code
Sample shape: minimal client calls returning the same records as the dataset.
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("abotapi/boe-es-auction-scraper").call(run_input={"mode": "search","estados": ["EJ"],"fechaFinDesde": "2026-10-01","maxItems": 20,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["idSub"], item["valorSubasta"])
import { ApifyClient } from "apify-client";const client = new ApifyClient({ token: "YOUR_APIFY_TOKEN" });const run = await client.actor("abotapi/boe-es-auction-scraper").call({runInput: {mode: "search",estados: ["EJ"],fechaFinDesde: "2026-10-01",maxItems: 20,},});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0].idSub, items[0].valorSubasta);
Send results into your apps (MCP connectors)
Point the run at an MCP connector you have authorized under Apify, Settings, API & Integrations, and each collected auction is pushed to it after the run - Notion as a rich page per auction, other connectors as a best-effort write. Leave the field empty to skip the export entirely; it never changes the dataset output.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | Search walks auction listings by status and date windows. URL mode reads the specific auctions you paste. |
estados | array | ["EJ"] | Statuses to include: PU upcoming, EJ judicial enforcement, SU subsequent, CA cancelled, FS finished. CA and FS return very large sets - combine them with a narrow date window. |
fechaFinDesde | string | `` | Only auctions concluding on or after this date (ISO YYYY-MM-DD). Leave empty for no lower bound. |
fechaFinHasta | string | `` | Only auctions concluding on or before this date (ISO YYYY-MM-DD). Leave empty for no upper bound. |
fechaInicioDesde | string | `` | Only auctions starting on or after this date (ISO YYYY-MM-DD). Leave empty for no lower bound. |
fechaInicioHasta | string | `` | Only auctions starting on or before this date (ISO YYYY-MM-DD). Leave empty for no upper bound. |
tipoBien | string | I | Asset type: I real estate (the original behaviour), V vehicles, empty for all. URL mode is unaffected. |
sortField | string | SUBASTA.FECHA_FIN | Portal-side sort: conclusion date, auction id, status, or minimum bid. |
sortOrder | string | asc | asc or desc. |
valorMinimo | string | `` | Keep only auctions valued at or above this many euros. |
valorMaximo | string | `` | Keep only auctions valued at or below this many euros. |
provincia | string | `` | Restrict to one province - type its NAME (e.g. Madrid; accents optional) or its INE code (01-52). |
idSubasta | string | `` | Read one auction by its id (e.g. SUB-JA-2025-251191). The status filter is skipped for this lookup; date windows still apply. |
startUrls | array | two example links | Auction detail links for URL mode (see the link-shape table above). |
urls | array | `` | Alias of startUrls kept for backwards compatibility. |
fetchDetails | boolean | true | Read each auction page for lots, documents, bid status, and the full money fields. Off returns listing-row data only. Each enriched auction is billed once as detail enrichment. |
maxItems | integer | 20 | Stop after this many auction records. This is THE cap: the run stops when it is reached or when listings run out. |
maxPages | integer | 0 | Cap listing pages read per status. Zero means no page cap; Max items still stops the run. |
proxyConfiguration | object | Apify Proxy Residential | Apify proxy settings used for portal requests. |
resumeFromRunId | string | `` | Paste a previous run ID or dataset ID to continue a large pull without returning items already collected there. |
incrementalMode | boolean | false | Suppress records unchanged since the last run and emit changeType on the rest. |
stateKey | string | `` | Named key for the incremental baseline. Use one key per scope so scopes stay independent. |
emitUnchanged | boolean | false | With incremental mode on, also emit unchanged records with changeType: "UNCHANGED". |
emitExpired | boolean | false | With incremental mode on, emit tombstones for records no longer present in the current scan. |
ignoreFieldsForChanges | array | `` | Fields excluded from change detection in incremental mode, so volatile fields never count as updates. |
mcpConnectors | array | `` | MCP connector export (Notion rich page-per-item). Leave empty to skip; never changes the dataset output. |
notionParentPageUrl | string | `` | URL or id of the Notion page that receives exported records. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Does not affect the dataset. |
Output Example
Sample shape: one enriched auction record exactly as the dataset stores it.
{"idSub": "SUB-JA-2025-251191","estado": "EJ","tipoSubasta": "JUDICIAL EN VÍA DE APREMIO","cuentaExpediente": "3527 0000 05 1106 24","fechaInicio": "18-09-2026 18:00:00 CET (ISO: 2026-09-18T18:00:00+02:00)","fechaConclusion": "08-10-2026 18:00:24 CET (ISO: 2026-10-08T18:00:24+02:00)","fechaPublicacion": "26-09-2026","cantidadReclamada": "278.898,39 €","valorSubasta": "230.518,81 €","tasacion": "0,00 €","pujaMinima": "Sin puja mínima","deposito": "11.525,94 €","pujasEstado": "concluido periodo de pujas","hasBids": true,"provincia": "MADRID","localidad": "MADRID","detailUrl": "https://subastas.boe.es/detalleSubasta.php?idSub=SUB-JA-2025-251191","changeType": "NEW"}
Plan Requirement
The portal is public and open, so no premium proxy tier is required to read it; the actor ships with residential proxy exits as its default connection and rotates exits automatically when a connection is refused, falling back to backup connections where the run's plan allows. Apify free plans do not include residential proxies - on a free plan the run warns once and continues on its backup connection, and a run that cannot read any page fails with a clear message instead of returning an empty success. Pay-per-event charges apply to auction records, detail enrichment, and the run start - see the actor's pricing page for current rates.
FAQ
What data comes back from each auction?
Every record carries the auction id, status, type, file number, conclusion/start/publication dates, claim amount, appraised value, valuation, minimum bid, deposit, bid tranches, lot count, bid status, enforcing authority, province, locality, address, postal code, and the detail link. With detail enrichment on you also get every lot with its description, address, possession status, and linked documents.
How much does it cost to run?
You pay for Apify compute time, the proxy traffic your plan includes, and three pay-per-event charges: one per auction record, one per enriched auction page, and one per run start. Narrow date windows keep runs small and cheap.
Is it legal to scrape the BOE auction portal?
The portal publishes auction notices as official public information. Scraping public data is generally lawful, but you are responsible for complying with the portal's terms of use and applicable data-protection rules for any personal data in the records.
Why does the bid amount say the auction has bids but show no price?
The portal answers the current bid amount only to registered users. The actor reports the public bidding-period status (pujasEstado, hasBids) instead of inventing an amount.
Why did my run return no results?
Check the status filter and date window first - narrow windows combined with a single status usually mean genuinely no auctions conclude in that range. Upcoming (PU) and subsequent (SU) auctions are announced before their dates are set, so their date fields are legitimately empty. Link mode only accepts auction-detail URLs carrying an auction id. Runs that cannot reach the portal fail loudly instead of returning an empty success.
Can I schedule recurring runs to monitor new auctions?
Yes. Turn on incremental mode with a state key, and each run only emits new or changed auctions with changeType, changedFields, and first/last-seen timestamps. Schedule it in Apify and pair it with the Notion connector to receive only what moved.
🔗 More scrapers you might like
Pair this actor with these related scrapers from the same team:
| 🥦 Carrefour Spain Scraper Scrape Carrefour Spain (carrefour.es) products. Search by keyword, browse a category, or... | 🛒 Decathlon.es Scrape Decathlon Spain (decathlon.es) sporting goods: current price plus strike-through... |
| 🛒 druni.es Scrape Druni beauty, cosmetics and perfume products. Search by keyword, category, Ofertas... | 🥦 El Corte Inglés Scraper Scrape El Corte Inglés elcorteingles.es products across fashion, electronics, home... |
| 🏠 Fotocasa.es From $1/1K. Scrape Spain property listings from fotocasa.es. Get price, surface, rooms... | 🔌 LeroyMerlin.es Scraper Scrape Leroy Merlin Spain (leroymerlin.es) DIY and home-improvement products: price... |
💬 Support & custom scrapers
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.