# Spain BORME Scraper (`acquistion-automation/spain-borme-scraper`) Actor

Scrapes Spain BORME company announcements by publication date. Returns full text, company name, and registry metadata as flat rows for CSV, JSON, Excel, or XML export.

- **URL**: https://apify.com/acquistion-automation/spain-borme-scraper.md
- **Developed by:** [Acquisition Automation Co.](https://apify.com/acquistion-automation) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

![Acquisition Automation Co. Search less. Close more.](https://api.apify.com/v2/key-value-stores/AOdPHdOpeDpzEPS5f/records/banner.jpg)

## 📜 Spain BORME Scraper

> **Export the index of any BORME daily issue as flat rows, one per province section, with a direct PDF and XML link for each.** Each row carries the official section identifier, the section title, the section name, the province, both file URLs, the publication date and the issue page it came from. No API key, no registration, no login.

The Boletín Oficial del Registro Mercantil is Spain's official commercial registry gazette. Every incorporation, director change, capital movement and dissolution recorded by a provincial registry is published there, split into one file per province per day. The BOE website presents each day as a page of links, with no export and no way to collect a date range. This Actor reads a given day's issue and writes its index into a dataset, so you have the identifier and the direct file URL for every province section without opening the page.

| Who uses it | What they use BORME for |
|---|---|
| 💼 Buyers sourcing Spanish targets | Watching a province's registry filings for incorporations, sales and director changes |
| 🔍 Diligence analysts | Locating the exact issue and section that carries a target's filing, then pulling the file |
| 🏦 Credit and risk teams | Tracking dissolutions and insolvency filings by province |
| ⚖️ Corporate lawyers and gestorías | Building an archive of registry publications instead of downloading them one day at a time |

### 📋 What it does

> 💡 **Why it matters:** BORME is where a Spanish company's changes become public before they reach any commercial database. Getting the issue index as rows is what makes a daily pull possible.

- 📅 **Reads one publication day.** Pass a date as `YYYYMMDD`, or leave it empty and the Actor takes the most recent issue available.
- 🗺 **One row per province section.** The daily issue is split by provincial registry, and each of those sections becomes a row.
- 🆔 **Carries the official identifier**, for example `BORME-A-2026-177-03`, which is the citation the BOE itself uses.
- 📄 **Both file URLs on every row.** The PDF for reading and the XML for parsing, both direct links to boe.es.
- 🗂 **Names the section**, so section A filings by registered businesses are told apart from the other BORME sections.
- 💾 **Exports to CSV, Excel, JSON or XML**, from the run page or the API.

### 📊 Output

Every province section of the issue is one flat row. These rows are the issue index and the links to its files. The Actor does not open the PDF or the XML, so the text of the individual registry entries, and the company names inside them, are not in the dataset.

| Field | Type | Description |
|---|---|---|
| 🆔 `identificador` | string | Official BORME identifier for the section, for example `BORME-A-2026-177-03` |
| 🏷 `titulo` | string | Section title as the issue page prints it, which for section A is the province |
| 🗂 `seccion` | string | BORME section, for example section A, filings by registered businesses |
| 🗺 `provincia` | string | Provincial registry the section belongs to |
| 📄 `urlPdf` | string | Direct link to the section PDF on boe.es |
| 🧾 `urlXml` | string | Direct link to the section XML on boe.es |
| 📅 `fechaPublicacion` | string | Publication date as `YYYYMMDD` |
| 🔗 `sourceUrl` | string | The daily issue page the row came from |
| 🕒 `scrapedAt` | string | ISO timestamp of collection |
| ⚠️ `error` | string | `null` on a normal row |

#### Example rows

```json
{
  "identificador": "BORME-A-2026-177-03",
  "titulo": "ALICANTE/ALACANT",
  "seccion": "A \u2014 SECCIÓN PRIMERA. Empresarios. Actos inscritos",
  "provincia": "ALICANTE/ALACANT",
  "urlPdf": "https://www.boe.es/borme/dias/2026/09/14/pdfs/BORME-A-2026-177-03.pdf",
  "urlXml": "https://www.boe.es/diario_borme/xml.php?id=BORME-A-2026-177-03",
  "fechaPublicacion": "20260914",
  "sourceUrl": "https://www.boe.es/borme/dias/2026/09/14/",
  "scrapedAt": "2026-09-14T16:32:03.529Z",
  "error": null
}
```

```json
{
  "identificador": "BORME-A-2026-177-04",
  "titulo": "ALMERÍA",
  "seccion": "A \u2014 SECCIÓN PRIMERA. Empresarios. Actos inscritos",
  "provincia": "ALMERÍA",
  "urlPdf": "https://www.boe.es/borme/dias/2026/09/14/pdfs/BORME-A-2026-177-04.pdf",
  "urlXml": "https://www.boe.es/diario_borme/xml.php?id=BORME-A-2026-177-04",
  "fechaPublicacion": "20260914",
  "sourceUrl": "https://www.boe.es/borme/dias/2026/09/14/",
  "scrapedAt": "2026-09-14T16:32:03.608Z",
  "error": null
}
```

The dash inside `seccion` is written above as the JSON escape `\u2014`, which decodes to exactly the character the BOE publishes.

### ✨ Why choose this Actor

| | What you get |
|---|---|
| **The official gazette** | Data comes from boe.es, the state publisher, not from a commercial registry reseller. |
| **No credentials** | BORME is public. No API key, no account, no subscription to a registry service. |
| **A date range becomes a schedule** | The site publishes one day at a time. Run this per date and append the results. |
| **XML links, not just PDFs** | The machine-readable file is on every row, so downstream parsing has somewhere to start. |
| **You pay per row** | No subscription. A day with no issue costs nothing. |

### 🚀 How to use it

1. [Create a free Apify account](https://console.apify.com/sign-up). New accounts start with $5 of credit.
2. Open the Actor and select **Try for free**.
3. Leave `date` empty for the most recent issue, or set it to a day in `YYYYMMDD` form.
4. Set `maxItems` to cap the run.
5. Select **Start**, then export from the **Dataset** tab as CSV, Excel, JSON or XML.

A first run, the most recent issue:

```json
{
  "maxItems": 10
}
```

One specific publication day, in full:

```json
{
  "date": "20260914",
  "maxItems": 100
}
```

### ⚙️ Input

| Field | Required | Description |
|---|---|---|
| `date` | No | BORME publication date in `YYYYMMDD` form. Leave empty for the most recent issue available |
| `maxItems` | No | How many announcements to collect per run |

### 💰 Pricing

Pay per result. No subscription, and no Apify platform usage on top.

| Apify plan | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
| Per announcement row | $0.021 | $0.02033 | $0.01967 | $0.019 | $0.019 | $0.019 |

| Rows collected | Cost on the Free plan |
|---|---|
| 100 | $2.10 |
| 1,000 | $21.00 |
| 10,000 | $210.00 |

**Free plan runs** return a small preview. Any paid Apify plan lifts that cap.

### 🔌 Integrate with any app

The dataset is available through the Apify API as soon as the run finishes. Use `run-sync-get-dataset-items` for a one-shot call, webhooks to trigger what happens next, or the Make, Zapier, Airbyte and LangChain integrations listed on the Actor page.

### 🤖 Use with an AI agent

Give an agent live access to the gazette index over the Model Context Protocol:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=acquistion-automation/spain-borme-scraper"
```

Then ask it for a given day's sections and the file link for one province.

### ❓ Frequently asked questions

**Does a row contain the company names or the text of the filings?**
No. A row is an entry in the daily issue index: the section, its province, and the links to its PDF and XML. The individual registry entries live inside those files, which this Actor does not open.

**How do I get the filings themselves?**
Take `urlXml` from the row and fetch it. The XML is the machine-readable version of the same section and is where company names and act types are published.

**What date should I use?**
Any BORME publication day, written as `YYYYMMDD`, for example `20260914`. BORME publishes on working days, so weekends and Spanish public holidays have no issue.

**Why do `titulo` and `provincia` often match?**
In section A the issue page titles each block with the province of its registry, so both fields carry the same value. Other sections title their blocks differently.

**Does it cover every province?**
Yes, as far as the issue does. Each provincial registry that filed that day gets its own section and therefore its own row.

**What can I export?**
CSV, Excel, JSON and XML from the run page, or JSON straight from the API.

### 🔗 More from Acquisition Automation Co.

- [IRS Exempt Organizations Scraper](https://apify.com/acquistion-automation/irs-eo-master-file-scraper)
- [SAM.gov Contract Opportunities Scraper](https://apify.com/acquistion-automation/sam-gov-contracts-scraper)
- [OLX Polska Scraper](https://apify.com/acquistion-automation/olx-polska-scraper)
- [DANE Colombia Statistics Scraper](https://apify.com/acquistion-automation/dane-colombia-statistics-scraper)
- [BizBuySell Scraper](https://apify.com/acquistion-automation/bizbuysell-scraper)

### About Acquisition Automation Co.

We build automation for people buying businesses. The repetitive part of an acquisition search, checking listings, pulling public records, tracking owners and assets, is work a machine should do, so the buyer's time goes into judging deals instead of collecting them.

We add new Actors regularly. If there is a source you need and do not see here, tell us.

### 🆘 Support

Open an issue in the **Issues** tab of this Actor with your run ID, the input you used, and what you expected to get back.

### ⚠️ Disclaimer

This Actor is independent and is not affiliated with, endorsed by, or sponsored by the Agencia Estatal Boletín Oficial del Estado, the Colegio de Registradores, or any Spanish government body. It collects only publicly available data. You are responsible for using that data in compliance with the source's terms of service and applicable law.

# Actor input Schema

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

How many announcements to collect per run.

## `date` (type: `string`):

BORME publication date in YYYYMMDD format. Leave empty for most recent issue available.

## Actor input object example

```json
{
  "maxItems": 10
}
```

# 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 = {
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("acquistion-automation/spain-borme-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 = { "maxItems": 10 }

# Run the Actor and wait for it to finish
run = client.actor("acquistion-automation/spain-borme-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 '{
  "maxItems": 10
}' |
apify call acquistion-automation/spain-borme-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,acquistion-automation/spain-borme-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/hsppsP6bwmR26UrqU/builds/tJVQzkGNimZnh8fXf/openapi.json
