# Empresia Scraper — Spanish Business Registry & KYB Data (`studio-amba/empresia-es-scraper`) Actor

Search and extract Spanish company data from Empresia (empresia.es). Look up companies by name and get CIF, legal form, phone, email, website, address, employees, revenue band, company status, founding date, CNAE industry code, and key administrator/auditor info. No API key, no login required.

- **URL**: https://apify.com/studio-amba/empresia-es-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Business, Lead generation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 result scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Empresia Scraper — Spanish Business Registry & KYB Data

Search and extract Spanish company data from [Empresia](https://www.empresia.es), a Spanish business
information directory built on top of the same commercial-register data that feeds the BORME (Boletín
Oficial del Registro Mercantil). Look up a company by name and get its CIF, legal form, phone, email,
website, registered address, employee count, revenue band, founding date, CNAE industry code, corporate
purpose, share capital, key administrator/board member, and auditor — in one structured pass.

This is a **second Spanish company-data source** alongside our
[eInforma Scraper](https://apify.com/studio-amba/einforma-scraper), with a genuinely different field
set: Empresia exposes phone, email, website, employee count, revenue band, company status, and
administrator/auditor info that eInforma's free profile pages don't carry, while eInforma exposes a
postal code and BORME filing history that Empresia doesn't. Use whichever fields your workflow needs, or
run both for cross-verification.

### How to scrape Empresia data

This actor reads Empresia's own public search page and company profile pages. It returns one structured
record per matching company, with the same information you'd see by clicking through the website
yourself — just structured and bulk-exportable via the Apify API, CSV/Excel/JSON export, or scheduled
runs.

#### Search by company name

Enter a company name (e.g. `Mercadona`, `Iberdrola`, `Excavaciones Amat`) in **Company Name**. Empresia's
search matches company names, director/officer names, and registered trademarks in one result list — the
actor automatically filters to company-profile results only and skips person and trademark rows.

#### Result limit

**Max Results** caps how many company profiles the actor fetches and pushes per run (default 50, up to
200\). Empresia paginates its search results 30 per page; the actor walks as many pages as needed to
reach your limit. Like any name search, a very specific query (e.g. one exact legal name) can return
just a handful of matches — for broader coverage, run several queries covering the group/brand names you
care about rather than relying on one very generic term.

### What data does Empresia Scraper extract?

| Field | Type | Description |
|-------|------|--------------|
| **companyName** | String | Registered company name |
| **legalForm** | String | Legal form abbreviation derived from the company name (e.g. `SA`, `SL`, `SLU`) |
| **status** | String | Registry status (e.g. `ACTIVA`, `EXTINGUIDA`, `CIERRE HOJA REGISTRAL`) |
| **cif** | String | CIF / VAT identification number (e.g. `A46103834`) |
| **phone** | String | Contact phone number(s), where published |
| **email** | String | Contact email, where published (decoded from the site's obfuscated markup) |
| **website** | String | Company website(s), where published |
| **address** | String | Registered address as published (includes the municipality) |
| **city** | String | Municipality, parsed from the address |
| **registroMercantil** | String | Provincial companies-register office (Registro Mercantil) holding the file |
| **foundingDate** | String | Incorporation date (DD/MM/YYYY), where on file |
| **companyAge** | String | Company age in years, as shown on the profile |
| **shareCapital** | String | Registered share capital, where on file |
| **salesBracket** | String | Revenue band estimate (e.g. "Superior a 2.500.000 euros") |
| **cnaeCode** | String | CNAE code (Spain's national economic-activity classification) |
| **cnaeDescription** | String | CNAE activity description |
| **businessPurpose** | String | Free-text corporate purpose ("Objeto Social") |
| **numEmployees** | String | Employee count, where on file |
| **administrationBody** | String | Governance structure (e.g. "Administrador único", "Consejo de administración") |
| **keyPersonRole** | String | Role of the listed key person (Presidente, Administrador único, Propietario, etc.) |
| **keyPersonName** | String | Name of that key person or parent/holding company |
| **auditor** | String | Auditing firm, where disclosed |
| **lastAccountsYear** | String | Most recent fiscal year with deposited accounts on file |
| **url** | String | Link to the company's Empresia profile page |
| **scrapedAt** | String | ISO timestamp of extraction |

Full deposited financial statements (balance sheets) and the "Informe avanzado" advanced report are
behind Empresia's paid Axesor-powered product and are **not** included in this actor's output — only the
free public profile fields above are scraped.

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|--------------|
| **Company Name** | String | `Mercadona` | Search Spanish companies by name |
| **Max Results** | Integer | `50` | Maximum companies to return (1–200) |
| **Proxy Configuration** | Object | Spanish residential proxy | Proxy settings |

### Example output

```json
{
    "companyName": "IBERDROLA SA",
    "legalForm": "SA",
    "status": "ACTIVA",
    "cif": "A48010615",
    "phone": "944151411",
    "email": "informacion@iberdrola.com",
    "website": "",
    "address": "PLAZA EUSKADI 5 (BILBAO)",
    "city": "BILBAO",
    "registroMercantil": "Vizcaya-Bizkaia",
    "foundingDate": "",
    "companyAge": "",
    "shareCapital": "4.931.250.000,00 €",
    "salesBracket": "Superior a 2.500.000 euros",
    "cnaeCode": "3513",
    "cnaeDescription": "Distribución de energía eléctrica",
    "businessPurpose": "",
    "numEmployees": "959",
    "administrationBody": "Consejo de administración",
    "keyPersonRole": "Presidente",
    "keyPersonName": "Sanchez Galan Jose Ignacio",
    "auditor": "KPMG AUDITORES SL",
    "lastAccountsYear": "2024",
    "url": "https://www.empresia.es/empresa/iberdrola/",
    "scrapedAt": "2026-08-01T19:40:48.668Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Common use cases

- Build B2B prospecting lists enriched with CIF, phone, email, website, and employee count.
- Verify a supplier's, customer's, or partner's legal status, registered office, and revenue band before
  signing a contract.
- KYB / KYC pre-checks — pull CIF, legal form, administrator/auditor names, and registry status in one pass.
- Cross-check against eInforma results for a higher-confidence merged company profile.
- Feed structured Spanish company data into CRM enrichment or market-research pipelines.

### Cost estimate

Pricing is pay-per-result. Each run makes one lightweight HTML search request per results page plus one
HTML profile request per matched company — no browser rendering is used, so compute cost per run is low.
A run returning 50 companies typically makes around 52 total HTTP requests.

### Limitations

- Empresia's own search returns a limited set of name matches per query (similar to typing into the
  site's search box by hand) — it is not an exhaustive substring search across its full database. For
  broader coverage, run multiple queries covering the group/brand names you care about.
- Full financial statements and the paid "Informe avanzado" report are not available through this actor —
  only the free public profile fields are scraped.
- Contact fields (phone, email, website) and governance fields (employees, administrator, auditor) are
  genuinely sparse for smaller/older or dissolved companies on the source site itself — this mirrors what
  a human visitor sees on the page, not a scraping gap. Core identity fields (name, CIF, legal form,
  status, CNAE, revenue band) are populated for the large majority of results.
- Dissolved companies (status `EXTINGUIDA`) sometimes have no registered address left on file.

### Related scrapers

- **[eInforma Scraper](https://apify.com/studio-amba/einforma-scraper)** — the other Spanish company register source (CIF, postal code, BORME filing history).
- **[North Data Scraper](https://apify.com/studio-amba/northdata-scraper)** — European company data (Germany + 15 more countries) from North Data.
- **[Handelsregister Scraper](https://apify.com/studio-amba/handelsregister-scraper)** — German commercial register data.
- **[KVK Scraper](https://apify.com/studio-amba/kvk-scraper)** — Dutch Chamber of Commerce company data.
- **[Infogreffe Scraper](https://apify.com/studio-amba/infogreffe-scraper)** — French company register data (SIREN/SIRET).
- **[Companies House Scraper](https://apify.com/studio-amba/companies-house-scraper)** — UK company register data.

### Data source and legality

This actor reads publicly available company data that Empresia republishes from Spain's public
commercial-register sources. It does not access any login-protected or paid area, and it identifies
itself with a standard browser user agent. Use the data in line with Empresia's terms and applicable
data-protection rules (in particular, take care with personal data of named directors/administrators
returned in some results).

# Actor input Schema

## `searchQuery` (type: `string`):

Search for a Spanish company by name. Example: 'Mercadona', 'Iberdrola', 'Excavaciones'.

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

Maximum number of companies to return.

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

Select proxies to use. A Spanish residential proxy is used by default for geo-consistent, reliable results.

## Actor input object example

```json
{
  "searchQuery": "Mercadona",
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ES"
  }
}
```

# 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 = {
    "searchQuery": "Mercadona",
    "maxResults": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "ES"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/empresia-es-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 = {
    "searchQuery": "Mercadona",
    "maxResults": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "ES",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/empresia-es-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "Mercadona",
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ES"
  }
}' |
apify call studio-amba/empresia-es-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=studio-amba/empresia-es-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/bwTRS5WfyR16Qgj07/builds/Zwruv47JftZwduNvP/openapi.json
