# Andalusia BOJA Scraper — Junta Gazette Monitor & Alerts (`xamto1987/spain-boja-gazette`) Actor

Scrape the official gazette of Andalusia (BOJA) by keyword and section. Stateful delta mode: every run returns only what is new since the last one, ideal for daily alerts. Monitor incremental del Boletín Oficial de la Junta de Andalucía por palabra clave y sección.

- **URL**: https://apify.com/xamto1987/spain-boja-gazette.md
- **Developed by:** [Santi Belloso Lopez](https://apify.com/xamto1987) (community)
- **Categories:** News, Automation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

**BOJA scraper** and daily monitor: scrape the **BOJA (Boletín Oficial de la Junta de Andalucía)**,
the **Andalusia official gazette**, by keyword and section — and get **only what is new** since the
previous run. Not a bulk dump: an incremental, stateful monitor built for a daily Apify Schedule.

Vigila el **Boletín Oficial de la Junta de Andalucía (BOJA)** por **palabra clave** y **sección**, y
en cada ejecución entrega **solo lo publicado desde la ejecución anterior**. Ideal para **alertas
BOJA** diarias sobre subvenciones, licitaciones públicas, oposiciones o anuncios de tu ayuntamiento.

> Actor hermano con el **mismo esquema de salida**:
> [`spain-bocm-gazette`](https://apify.com/xamto1987/spain-bocm-gazette) (Comunidad de Madrid).
> Puedes volcar los dos al mismo dataset y tratarlos como una sola tabla. · Sister Actor with the
> **same output schema**: `spain-bocm-gazette`.

### Andalusia BOJA Scraper: why a monitor, not a dump / Por qué un monitor y no un volcado

Los boletines autonómicos españoles no tenían **ningún** actor en el Store, y los que existen sobre
boletines estatales son volcados: no recuerdan qué te enseñaron ayer. Este sí. Guarda en un Key-Value
Store **con nombre** (los que persisten entre ejecuciones en la plataforma) la fecha hasta la que ha
procesado y los identificadores ya entregados, así que puedes dejarlo en un Schedule diario y solo
verás **disposiciones que no habías visto**.

Spanish regional gazettes had **no** Actor on the Store at all, and the existing national-gazette
Actors are bulk dumps that don't remember what they showed you yesterday. This one does: it stores
the last fully processed date and the identifiers already delivered in a **named** Key-Value Store
(the only kind that survives between runs on the platform), so a daily Schedule shows you **only
entries you haven't seen**.

### BOJA gazette data extracted / Qué datos extrae: disposiciones del boletín

Un ítem por disposición del BOJA que coincide con tus filtros / one item per matching BOJA entry:

| Campo / Field | Qué es / What it is |
|---|---|
| `identificador` | Identificador construido `BOJA-<año>-<boletín>-<orden>` (p. ej. `BOJA-2026-160-3`; los complementarios llevan sufijo: `BOJA-2026-160c01-1`) |
| `boletin` / `boletinNombre` | `"BOJA"` / `"Boletín Oficial de la Junta de Andalucía"` |
| `comunidadAutonoma` | `"Andalucía"` |
| `fechaPublicacion` | Fecha de publicación, ISO `AAAA-MM-DD` |
| `numeroBoletin` | Número del boletín dentro del año (`160`, `160c01`…) |
| `seccion` / `seccionCodigo` | Sección (`2. Autoridades y personal` / `2.1`) |
| `subseccion` | Subsección, cuando la sección tiene dos niveles |
| `organo` | Consejería, diputación, ayuntamiento o juzgado que publica |
| `titulo` | Título oficial completo |
| `urlHtml` / `urlPdf` | Enlaces oficiales al texto |
| `urlXml` | Siempre `null`: el BOJA no publica XML por disposición (campo presente para que el esquema coincida con el del BOCM) |
| `cve` | Código de Verificación Electrónica de la disposición |
| `keywordsCoincidentes` | Qué palabras clave de tu input dispararon la coincidencia |
| `textoCompleto` | Texto íntegro — **solo si activas `incluirTextoCompleto`** |
| `fuente` / `atribucion` / `extraidoEn` | Procedencia y marca de tiempo |

### BOJA keyword monitor input / Parámetros de entrada y secciones

| Parámetro / Parameter | Tipo / Type | Por defecto / Default | Descripción / Notes |
|---|---|---|---|
| `keywords` | lista de textos / string list | `[]` | Términos a buscar en el título (sin distinguir mayúsculas ni acentos) |
| `secciones` | lista / list | `[]` | Ver la tabla de secciones. Vacío = todas |
| `diasHaciaAtras` | entero / integer | `1` | Solo importa en la **primera ejecución** o con `soloNuevos: false`. Máximo 30 |
| `soloNuevos` | booleano / boolean | `true` | Modo delta: no repite identificadores ya entregados |
| `incluirTextoCompleto` | booleano / boolean | `false` | Añade el texto íntegro (1 petición extra por disposición) |
| `maxItems` | entero / integer | `500` | Tope por ejecución; la siguiente continúa donde se quedó |

**Secciones del BOJA** (nombres oficiales, tomados de los propios feeds de distribución del boletín) /
BOJA sections:

| Código / Code | Sección / Section |
|---|---|
| `0` | Disposiciones estatales · State provisions |
| `1` | Disposiciones generales · General provisions |
| `2.1` | Nombramientos, situaciones e incidencias · Appointments |
| `2.2` | Oposiciones, concursos y otras convocatorias · Public-employment calls |
| `3` | Otras disposiciones · Other provisions |
| `4` | Administración de justicia · Courts |
| `5.1` | Licitaciones públicas y adjudicaciones · Public tenders and awards |
| `5.2` | Otros anuncios oficiales · Other official notices |

También se aceptan los grupos `2` (= `2.1` + `2.2`) y `5` (= `5.1` + `5.2`).

Si dejas `keywords` vacío, el actor entrega **todo** lo publicado en las secciones elegidas. Un
boletín ordinario trae entre **10 y 120 disposiciones**, y hay boletines de lunes a viernes más
**complementarios** el mismo día (el actor los recoge todos). · Leave `keywords` empty and you get
everything in the chosen sections; an ordinary issue carries 10-120 entries, Monday to Friday, plus
same-day supplementary issues, all of which the Actor collects.

Ejemplo: vigilar licitaciones y subvenciones andaluzas, a diario / example input:

```json
{
  "keywords": ["licitación", "subvención", "convenio", "adjudicación"],
  "secciones": ["3", "5.1", "5.2"],
  "diasHaciaAtras": 7,
  "soloNuevos": true,
  "maxItems": 500
}
```

### BOJA delta mode: only what is new / Cómo funciona el modo delta

1. **Primera ejecución**: la ventana es `[hoy − diasHaciaAtras + 1, hoy]`.
2. **Ejecuciones siguientes** con `soloNuevos: true`: arranca en el día siguiente al último
   **cerrado**, así que `diasHaciaAtras` deja de importar.
3. El día de **hoy nunca se da por cerrado** (el BOJA publica complementarios a lo largo de la
   jornada) y un corte por `maxItems` tampoco cierra el día: se releen y el registro de
   identificadores evita duplicados.
4. Con `soloNuevos: false` vuelve a volcar toda la ventana. Es lo que hace el input de ejemplo del
   actor.

El estado vive en el store **`boja-gazette-state-<hash>`**, donde el hash depende de tus filtros: dos
configuraciones distintas no se pisan.

**In English**: the first run scans `[today − diasHaciaAtras + 1, today]`. Later runs with
`soloNuevos: true` resume from the day after the last **closed** day — `diasHaciaAtras` stops
mattering. Today is never closed (BOJA publishes supplementary issues during the day), and a
`maxItems` cut-off leaves the day open; the identifier ledger prevents duplicates on re-read. Set
`soloNuevos: false` to re-dump the whole window. State lives in the named store
`boja-gazette-state-<hash>`, hashed from your filters, so two configurations never collide.

### BOJA output example / Ejemplo de output real

Dos ítems reales de una ejecución del actor con `diasHaciaAtras: 7`, `soloNuevos: false` y las
keywords `["resolución", "subvención", "convocatoria", "licitación", "ayuntamiento", "acuerdo"]`
(23-ago-2026), elegidos para mostrar dos secciones distintas: 2.1 (Nombramientos) y 5.2 (Otros
anuncios oficiales). · Two real items from a run with those keywords, showing two different sections.

```json
{
  "identificador": "BOJA-2026-158-2",
  "boletin": "BOJA",
  "boletinNombre": "Boletín Oficial de la Junta de Andalucía",
  "comunidadAutonoma": "Andalucía",
  "fechaPublicacion": "2026-08-17",
  "numeroBoletin": "158",
  "seccion": "2. Autoridades y personal",
  "seccionCodigo": "2.1",
  "subseccion": "2.1. Nombramientos, situaciones e incidencias",
  "organo": "Consejería de Presidencia, Sanidad y Emergencias",
  "titulo": "Resolución de 12 de agosto de 2026, de la Dirección General de Personal del Servicio Andaluz de Salud, por la que se hace pública la resolución definitiva del concurso de méritos para la cobertura de un puesto de cargo intermedio de Jefe de Equipo de Gestión y Servicios en el Hospital Universitario Virgen del Rocío de Sevilla.",
  "urlHtml": "https://www.juntadeandalucia.es/boja/2026/158/2",
  "urlPdf": "https://www.juntadeandalucia.es/boja/2026/158/BOJA26-158-00001-11087-01_00342317.pdf",
  "urlXml": null,
  "cve": "00342317",
  "keywordsCoincidentes": ["resolución"],
  "fuente": "Boletín Oficial de la Junta de Andalucía",
  "atribucion": "Basado en datos del Boletín Oficial de la Junta de Andalucía (https://www.juntadeandalucia.es/boja)",
  "extraidoEn": "2026-08-23T18:07:24.273Z"
}
```

```json
{
  "identificador": "BOJA-2026-158-35",
  "boletin": "BOJA",
  "boletinNombre": "Boletín Oficial de la Junta de Andalucía",
  "comunidadAutonoma": "Andalucía",
  "fechaPublicacion": "2026-08-17",
  "numeroBoletin": "158",
  "seccion": "5. Anuncios",
  "seccionCodigo": "5.2",
  "subseccion": "5.2. Otros anuncios oficiales",
  "organo": "Ayuntamientos",
  "titulo": "Anuncio de 24 de julio de 2026, del Ayuntamiento de Las Cabezas de San Juan, sobre las bases reguladoras del proceso selectivo para la provisión de cinco plazas de personal laboral fijo. (PP. 1542/2026).",
  "urlHtml": "https://www.juntadeandalucia.es/boja/2026/158/35",
  "urlPdf": "https://www.juntadeandalucia.es/boja/2026/158/BOJA26-158-00001-10167-01_00341398.pdf",
  "urlXml": null,
  "cve": "00341398",
  "keywordsCoincidentes": ["ayuntamiento"],
  "fuente": "Boletín Oficial de la Junta de Andalucía",
  "atribucion": "Basado en datos del Boletín Oficial de la Junta de Andalucía (https://www.juntadeandalucia.es/boja)",
  "extraidoEn": "2026-08-23T18:07:24.339Z"
}
```

### Andalusia gazette monitoring use cases / Casos de uso

#### Despachos y asesorías — vigilancia normativa de la Junta de Andalucía

Programa el actor a diario sobre las secciones `1` (Disposiciones generales) y `3` (Otras
disposiciones) con las palabras clave de tu materia: recibes solo las disposiciones nuevas, con
enlace al PDF oficial y su CVE. · Daily regulatory monitoring of the Andalusian regional government.

#### Empresas licitadoras — alertas de licitaciones públicas BOJA

La sección `5.1` (Licitaciones públicas y adjudicaciones) es un canal directo de oportunidades:
combínala con `keywords` de tu sector para no perder plazos. · Section `5.1` is a direct feed of
Andalusian public tenders and awards.

#### Consultoras de subvenciones — convocatorias de ayudas andaluzas

Las palabras clave `subvención`, `convocatoria` o `ayudas` sobre la sección `3` capturan las
convocatorias autonómicas en cuanto se publican. · Grant calls as soon as they are published.

#### Opositores y RR. HH. — oposiciones y procesos selectivos

La sección `2.2` (Oposiciones, concursos y otras convocatorias) y los anuncios municipales de la
`5.2` concentran el empleo público andaluz, como se ve en el ejemplo de output. · Public-employment
calls, regional and municipal.

### BOJA data source, coverage and limits / Fuente oficial, cobertura y comportamiento

- **Fuente oficial**: datos públicos del BOJA (`https://www.juntadeandalucia.es/boja`), reutilizables
  conforme a la **Ley 37/2007** de reutilización de la información del sector público. · Public BOJA
  data, reusable under Spanish **Act 37/2007**.
- **Cobertura y ritmo**: boletines de lunes a viernes más **complementarios** el mismo día, con
  **10-120 disposiciones** por boletín ordinario. `diasHaciaAtras` admite un máximo de **30** días.
- **Comportamiento del actor**: hace **1 petición por segundo** con un User-Agent identificado
  (`spain-boja-gazette/0.1 (Apify actor)`), reintentos con backoff exponencial y detección de páginas
  de error servidas con HTTP 200. Todas las rutas que usa están **permitidas** por el `robots.txt` de
  la Junta. Una ventana de 30 días cuesta **una petición de calendario** más una por sección de cada
  boletín. · One request per second, identified User-Agent, exponential backoff, detection of error
  pages served with HTTP 200; every path the Actor uses is **allowed** by the site's `robots.txt`. A
  30-day window costs one calendar request plus one request per section of each issue.
- **Qué NO trae**: `urlXml` es siempre `null` (el BOJA no publica XML por disposición) y el texto
  íntegro solo se descarga si activas `incluirTextoCompleto`, con una petición extra por disposición.

### Related Spanish public-data Actors / Actores relacionados

| Actor | Qué extrae / What it scrapes |
|---|---|
| [spain-bocm-gazette](https://apify.com/xamto1987/spain-bocm-gazette) | Boletín Oficial de la Comunidad de Madrid (BOCM) — **mismo esquema de salida** |
| [spain-boe-monitor](https://apify.com/xamto1987/spain-boe-monitor) | Boletín Oficial del Estado (BOE) por palabra clave, sección y NIF |
| [spain-borme-companies](https://apify.com/xamto1987/spain-borme-companies) | Actos societarios del BORME: constituciones, cargos, concursos |
| [spain-grants-bdns](https://apify.com/xamto1987/spain-grants-bdns) | Subvenciones y ayudas públicas de España (BDNS/SNPSAP) |
| [spain-de-minimis-aid](https://apify.com/xamto1987/spain-de-minimis-aid) | Ayudas de minimis y ayudas de Estado por NIF de beneficiario |
| [spain-grants-registries](https://apify.com/xamto1987/spain-grants-registries) | Grandes beneficiarios, sanciones por fraude y ayudas a partidos |
| [catalonia-tenders](https://apify.com/xamto1987/catalonia-tenders) | Licitaciones y adjudicaciones públicas de Cataluña (PSCP) |
| [euskadi-tenders](https://apify.com/xamto1987/euskadi-tenders) | Anuncios de contratación pública del País Vasco (Open Data Euskadi) |
| [aragon-tenders](https://apify.com/xamto1987/aragon-tenders) | Registro de contratos públicos de Aragón, mayores y menores (CKAN) |
| [spain-cadastre-bulk](https://apify.com/xamto1987/spain-cadastre-bulk) | Enriquecimiento catastral masivo (Catastro OVC) |

### Is it legal to scrape the BOJA? / Datos personales, derecho al olvido y aviso legal

- **Reutilización**: los datos del BOJA son información del sector público reutilizable conforme a la
  **Ley 37/2007**, citando la fuente. Cada ítem incluye ya el campo `atribucion`.
- Se respetan las **208 rutas de derecho al olvido** que la Junta de Andalucía publica en su
  `robots.txt`: esas disposiciones nunca entran en el dataset.
- El BOJA **sí publica DNI en claro** en algunos anuncios de notificación de la sección 5.2. Todo
  ítem pasa por un punto único de **redacción**: cualquier DNI/NIE se sustituye por
  `[NIF-PERSONA-FISICA-OMITIDO]` antes de llegar al dataset. Los CIF de persona jurídica se conservan
  (son dato mercantil).
- **No existe modo "por persona"**: no hay input de nombre ni de DNI, ni campo de identificador
  personal en el dataset. El pivote es siempre la disposición publicada.
- Este actor **solo lee datos públicos**, sin login y sin saltarse ninguna medida técnica.
  **No es un producto oficial** ni está afiliado, respaldado ni verificado por la Junta de Andalucía.
  · This Actor is **not an official product** and is not affiliated with or endorsed by the Junta de
  Andalucía.

**Personal data, in English**: the Actor honours the **208 right-to-be-forgotten paths** the regional
government publishes in its `robots.txt`. BOJA **does publish clear-text Spanish national IDs
(DNI/NIE)** in some section 5.2 notices; every item goes through a single redaction point that
replaces them with `[NIF-PERSONA-FISICA-OMITIDO]` before it reaches the dataset. Company tax IDs (CIF)
are kept — they are commercial data. There is **no person-centric mode**: no name or ID input, and no
personal identifier field in the dataset. Onward processing of the output remains your responsibility
under **GDPR** and the Spanish **LOPDGDD**.

### FAQ — BOJA monitoring / Preguntas frecuentes

#### ¿Cómo recibo alertas diarias del BOJA? / How do I get daily BOJA alerts?

Deja `soloNuevos: true` y programa el actor en un Schedule diario de Apify. Cada ejecución te
devolverá únicamente las disposiciones publicadas desde la anterior.

#### ¿Recoge los boletines complementarios? / Does it collect supplementary issues?

Sí. El BOJA publica complementarios el mismo día (`160c01`, `160c02`…) y el actor los recoge todos;
por eso el día en curso nunca se da por cerrado.

#### ¿Puedo vigilar solo las licitaciones públicas? / Can I watch only public tenders?

Sí: `secciones: ["5.1"]` limita la salida a Licitaciones públicas y adjudicaciones. Puedes añadir
`5.2` para el resto de anuncios oficiales.

#### ¿Trae el texto completo de la disposición? / Does it include the full text?

Solo si activas `incluirTextoCompleto`. Cuesta una petición extra por disposición; si te basta con el
título, el CVE y los enlaces oficiales, déjalo desactivado.

#### ¿Por qué `urlXml` está siempre a null? / Why is `urlXml` always null?

Porque el BOJA no publica XML por disposición. El campo se mantiene para que el esquema de salida
coincida exactamente con el de `spain-bocm-gazette`.

#### ¿Se puede combinar con el BOCM de Madrid? / Can I combine it with Madrid's BOCM?

Sí. [`spain-bocm-gazette`](https://apify.com/xamto1987/spain-bocm-gazette) produce **el mismo esquema
de salida**, así que los dos boletines pueden alimentar la misma tabla.

#### ¿Aparecen DNI de particulares en el dataset? / Are personal ID numbers exposed?

No. Aunque el BOJA los publique en claro en algunos anuncios de la sección 5.2, el actor los
sustituye por `[NIF-PERSONA-FISICA-OMITIDO]` antes de guardar el ítem, y respeta las 208 rutas de
derecho al olvido de la Junta.

#### ¿Necesito credenciales? / Do I need credentials?

No. Todo sale de las rutas públicas del BOJA permitidas por el `robots.txt` de la Junta, sin login ni
cookies.

### Support & feedback / Soporte

¿Falta una sección, quieres otro filtro o una versión a medida para tu flujo de vigilancia normativa?
Abre una incidencia desde la pestaña **Issues** de la ficha del actor en Apify: se leen todas. ·
Missing a section or need a custom version? Open an issue from the **Issues** tab of this Actor's
page.

**Palabras clave / Keywords**: BOJA scraper, Boletín Oficial de la Junta de Andalucía, Andalusia
official gazette API, alertas BOJA, monitor BOJA palabra clave, Junta de Andalucía boletín, Andalusia
regional gazette monitor, subvenciones BOJA, anuncios BOJA, regulatory monitoring Andalucía, Spain
regional gazette scraper, vigilancia normativa.

# Actor input Schema

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

Terminos a vigilar en el titulo de cada disposicion del BOJA (busqueda por substring, sin distinguir mayusculas ni acentos). Vacio = se entrega TODO lo publicado en las secciones seleccionadas. / Terms to watch for in each BOJA entry's title; empty = everything in the selected sections.

## `secciones` (type: `array`):

Ambito por seccion del BOJA. Vacio = todas. 0 = Disposiciones estatales; 1 = Disposiciones generales; 2.1 = Nombramientos, situaciones e incidencias; 2.2 = Oposiciones, concursos y otras convocatorias; 3 = Otras disposiciones; 4 = Administracion de justicia; 5.1 = Licitaciones publicas y adjudicaciones; 5.2 = Otros anuncios oficiales. / BOJA section scope; empty = all sections.

## `diasHaciaAtras` (type: `integer`):

Solo se usa en la PRIMERA ejecucion (define la ventana inicial) o cuando `soloNuevos` esta desactivado. Con `soloNuevos: true`, las ejecuciones posteriores continuan solas desde la ultima fecha procesada. Maximo 30. / Only used on the first run or when delta mode is off; later runs resume automatically.

## `soloNuevos` (type: `boolean`):

ACTIVADO POR DEFECTO. El actor recuerda en un key-value store CON NOMBRE que identificadores ya entrego y no los repite: cada ejecucion trae solo lo publicado desde la anterior. Desactivalo para volcar de nuevo toda la ventana de `diasHaciaAtras`. / ON by default: the actor remembers what it already delivered and only emits new entries each run.

## `incluirTextoCompleto` (type: `boolean`):

DESACTIVADO POR DEFECTO. Anade el texto integro de cada disposicion (version HTML oficial del BOJA). Cuesta 1 peticion adicional por disposicion entregada, a 1 peticion/segundo. / OFF by default: adds each entry's full text (one extra request per entry).

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

Tope de disposiciones a entregar en una ejecucion. Un boletin ordinario del BOJA trae entre 10 y 120 disposiciones. Si se alcanza el tope, la ejecucion siguiente continua donde se quedo. / Cap on entries per run; the next run resumes where this one stopped.

## Actor input object example

```json
{
  "keywords": [
    "resolución",
    "subvención",
    "convocatoria",
    "licitación",
    "ayuntamiento",
    "acuerdo"
  ],
  "secciones": [],
  "diasHaciaAtras": 7,
  "soloNuevos": true,
  "incluirTextoCompleto": false,
  "maxItems": 50
}
```

# Actor output Schema

## `results` (type: `string`):

Disposiciones del BOJA nuevas que coinciden con la vigilancia configurada. JSON, CSV o Excel.

# 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 = {
    "keywords": [
        "resolución",
        "subvención",
        "convocatoria",
        "licitación",
        "ayuntamiento",
        "acuerdo"
    ],
    "diasHaciaAtras": 7,
    "soloNuevos": false,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("xamto1987/spain-boja-gazette").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 = {
    "keywords": [
        "resolución",
        "subvención",
        "convocatoria",
        "licitación",
        "ayuntamiento",
        "acuerdo",
    ],
    "diasHaciaAtras": 7,
    "soloNuevos": False,
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("xamto1987/spain-boja-gazette").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 '{
  "keywords": [
    "resolución",
    "subvención",
    "convocatoria",
    "licitación",
    "ayuntamiento",
    "acuerdo"
  ],
  "diasHaciaAtras": 7,
  "soloNuevos": false,
  "maxItems": 50
}' |
apify call xamto1987/spain-boja-gazette --silent --output-dataset

```

## MCP server setup

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

```

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/aq4X8hFR7h4PmApUg/builds/JHzbDm8Yn0ILAaeRf/openapi.json
