# Spain Public Tenders Alerts (PLACSP) – Licitaciones (`cloudblondotter/placsp-alertas`) Actor

New Spanish public tenders and status changes from PLACSP (contrataciondelestado.es). Filter by CPV, region (NUTS), amount and keywords. Deduplicated across runs: you only get, and pay for, what's new. Licitaciones públicas España con alertas.

- **URL**: https://apify.com/cloudblondotter/placsp-alertas.md
- **Developed by:** [Odei Hijarrubia Bezares](https://apify.com/cloudblondotter) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 matching tenders

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?

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

## Alertas de licitaciones públicas España (PLACSP)

Recibe solo las licitaciones **nuevas o que cambian de estado** de la [Plataforma de Contratación del Sector Público](https://contrataciondelestado.es), filtradas por CPV, provincia (NUTS), importe, tipo de contrato y palabras clave. Programa el actor una vez (diario u horario) y conéctalo a email, Slack, Make, n8n o Zapier con las integraciones de Apify.

### Por qué este actor

- **Sin duplicados:** cada perfil recuerda qué te entregó. Solo pagas por lo nuevo o por los cambios de estado que sigues.
- **Sigue el ciclo de vida:** elige estados (en plazo, adjudicada, resuelta…) y recibe el cambio `PUB→ADJ` con el adjudicatario y el importe.
- **Datos listos para usar:** lotes, criterios de adjudicación con peso, solvencia, subcontratación, fondos UE (PRTR, FEDER…), enlaces a PCAP y PPT, oferta más baja/alta.
- **Filtra el ruido:** excluye contratos reservados y plazos vencidos.
- **RGPD:** los adjudicatarios que no son claramente una persona jurídica (CIF) se muestran como "persona física".

### Ejemplo de entrada

```json
{
  "perfil": "ti-madrid",
  "estados": ["PUB", "ADJ"],
  "cpv": ["72", "48"],
  "nuts": ["ES3"],
  "importeMin": 15000,
  "palabrasClave": ["software", "datos", "cloud"]
}
```

### Ejemplo de salida (resumido)

```json
{
  "tipo": "cambio",
  "cambio": "PUB→ADJ",
  "estado": "ADJ",
  "expediente": "2026/123",
  "titulo": "Servicio de soporte microinformático",
  "organo": "Junta de Contratación del Ministerio de Hacienda",
  "tipoContrato": "servicios",
  "cpv": ["72250000"],
  "nuts": "ES300",
  "importeSinIva": 119834.71,
  "plazoPresentacion": "2025-10-07T14:00:00",
  "lotesDetalle": [],
  "criteriosAdjudicacion": [{"descripcion": "Precio", "tipo": "objetivo", "peso": 51.0, "lote": null}],
  "adjudicaciones": [{"adjudicatario": "EMPRESA EJEMPLO, S.A.", "importeSinIva": 111395.81, "ofertasRecibidas": 2, "pyme": false}],
  "documentos": [{"tipo": "PCAP", "nombre": "PCAP.pdf", "url": "https://contrataciondelestado.es/..."}],
  "url": "https://contrataciondelestado.es/wps/poc?uri=deeplink:detalle_licitacion&idEvl=...",
  "fuente": "Plataforma de Contratación del Sector Público (contrataciondelestado.es)"
}
```

### Precio

- 0,05 $ por ejecución y 0,05 $ por licitación entregada.
- Ejemplo: alerta diaria con ~10 coincidencias al día ≈ 16,5 $/mes (15 $ de licitaciones + 1,5 $ de ejecuciones). Puedes fijar un límite de gasto por ejecución en Apify.
- La primera ejecución revisa `diasAtras` días (1 por defecto) y tarda más: cada día de histórico son ~10-15 páginas del feed oficial (~15-20 min). Las siguientes solo leen lo nuevo; programarla cada pocas horas mantiene cada ejecución corta.

### Consejos

- Un perfil por cada combinación de filtros (`perfil`).
- Para seguir adjudicaciones de la competencia: `"estados": ["ADJ", "RES"]` y `"soloConPlazoAbierto": false`.
- `reiniciarMemoria: true` vuelve a entregar todo desde `diasAtras`.
- Programa el actor al menos una vez al día. Si pasan varios días sin ejecutarse, la siguiente ejecución puede tardar más de una hora: sube el timeout de la ejecución (p. ej. 4 h).

### Plan mensual con histórico

¿Integras estos datos en tu producto o se los revendes a tus clientes? Estoy preparando un plan mensual con feed por webhook, histórico desde 2012 y uso comercial. [Resérvalo en licitadata](https://licitadata.pages.dev/?utm_source=apify\&utm_medium=readme\&utm_campaign=fase4) y te envío una muestra gratis de tu sector.

### Fuente y licencia de los datos

Datos de la Plataforma de Contratación del Sector Público (Ministerio de Hacienda), reutilizados según su aviso legal: "Se autoriza la reproducción total o parcial de los contenidos \[...] siempre que se cite expresamente su origen". Cada fila incluye el campo `fuente`.

***

## Spanish public tenders alerts (PLACSP) — English

Get only **new or status-changed** Spanish public tenders from the official PLACSP feed, filtered by CPV, NUTS region, amount, contract type and keywords. Schedule it once and plug it into email, Slack, Make, n8n or Zapier. Each profile remembers what it already delivered, so you never pay twice for the same tender. Pricing: $0.05 per run + $0.05 per delivered tender. Field names are in Spanish; see the output example above.

Need a monthly plan with webhook delivery, history since 2012 and commercial use? [Reserve it at licitadata](https://licitadata.pages.dev/?utm_source=apify\&utm_medium=readme\&utm_campaign=fase4).

# Actor input Schema

## `perfil` (type: `string`):

Nombre de esta alerta. Cada perfil recuerda por separado qué licitaciones ya te entregó. Usa uno distinto por cada combinación de filtros.

## `estados` (type: `array`):

PRE = anuncio previo, PUB = en plazo, EV = pendiente de adjudicación, ADJ = adjudicada, RES = resuelta, ANUL = anulada. Si una licitación ya entregada pasa a otro estado de la lista, se entrega de nuevo como cambio.

## `cpv` (type: `array`):

Prefijos CPV. Ej.: 72 (servicios TI), 4500 (obras), 15981 (agua mineral). Se comparan también los CPV de cada lote.

## `nuts` (type: `array`):

Ej.: ES3 (Comunidad de Madrid), ES61 (Andalucía), ES511 (Barcelona).

## `tiposContrato` (type: `array`):

Tipos de contrato a incluir. Vacío = todos.

## `importeMin` (type: `integer`):

Sobre el presupuesto base sin IVA (o el valor estimado si no hay presupuesto). Basta con que la licitación o uno de sus lotes esté en el rango.

## `importeMax` (type: `integer`):

Sobre el presupuesto base sin IVA (o el valor estimado si no hay presupuesto). Basta con que la licitación o uno de sus lotes esté en el rango.

## `palabrasClave` (type: `array`):

Busca en el título, el resumen y el objeto de los lotes, sin distinguir mayúsculas ni acentos.

## `excluirPalabras` (type: `array`):

Descarta la licitación si alguna de estas palabras aparece en el título, el resumen o el objeto de un lote (sin distinguir mayúsculas ni acentos).

## `soloConPlazoAbierto` (type: `boolean`):

Para PRE y PUB, descarta las licitaciones cuyo plazo de presentación ya venció.

## `excluirReservados` (type: `boolean`):

Descarta contratos reservados a centros especiales de empleo o empresas de inserción.

## `soloSubcontratacionPermitida` (type: `boolean`):

Solo licitaciones cuyos pliegos indican que se permite subcontratar.

## `diasAtras` (type: `integer`):

Solo se usa la primera vez (o tras reiniciar la memoria). Cada día añade ~10-15 páginas (~15-20 min) a esa primera ejecución.

## `reiniciarMemoria` (type: `boolean`):

Olvida lo ya entregado en este perfil y vuelve a empezar.

## Actor input object example

```json
{
  "perfil": "default",
  "estados": [
    "PUB"
  ],
  "soloConPlazoAbierto": true,
  "excluirReservados": true,
  "soloSubcontratacionPermitida": false,
  "diasAtras": 1,
  "reiniciarMemoria": false
}
```

# Actor output Schema

## `licitaciones` (type: `string`):

No description

## `adjudicaciones` (type: `string`):

No description

## `resumen` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("cloudblondotter/placsp-alertas").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("cloudblondotter/placsp-alertas").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 '{}' |
apify call cloudblondotter/placsp-alertas --silent --output-dataset

```

## MCP server setup

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

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/qIkwcTnqjf8TXAguB/builds/dDWdOfvJsXej6foNx/openapi.json
