# Spain Tender Analyzer: AI analysis of PLACSP pliegos (`licitadata/spain-tender-analyzer`) Actor

Open Spanish public tenders (PLACSP) with AI-extracted requirements from the tender documents: solvency, classification, weighted award criteria, guarantees and a fit score for your company. Licitaciones con análisis de pliegos por IA.

- **URL**: https://apify.com/licitadata/spain-tender-analyzer.md
- **Developed by:** [Licita Data](https://apify.com/licitadata) (community)
- **Categories:** Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $350.00 / 1,000 tender analyzed with ais

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

## Spain Tender Analyzer: AI analysis of PLACSP tender documents

**Find open Spanish public tenders and get what each tender document actually requires, already extracted: economic and technical solvency, required classification, award criteria with their weights, guarantees, subcontracting and special conditions. Optionally, a 0–100 fit score against your company profile.**

Other actors give you the tender metadata from the PLACSP feed. This one also **reads the tender documents** (pliego de cláusulas administrativas, pliego técnico and the *cuadro de características*), so you can decide in seconds whether a tender is worth your time.

> 🇪🇸 Resumen en español más abajo.

### What you get per tender

| Field | Example |
|---|---|
| Economic solvency | Minimum annual turnover 264,462.79 € (PCAP p.5) |
| Technical solvency | ≥ 2 similar contracts in the last 5 years |
| Classification | G-6-2 required |
| Award criteria | Price 76 · Extended warranty 9 · ISO 45001 5 · ISO 9001 5 · ISO 14001 5 |
| Guarantees | Provisional 0 % · Definitive 5 % |
| Subcontracting / price revision | Allowed / No |
| Duration | 3 months |
| Special conditions | Waste plan, EU publicity rules, penalties… |
| Fit score (optional) | 70/100 — "You meet the economic solvency", "Requires classification G-6-2 and you don't have it" |

Every extracted field carries its **source document and page** so you can check it in one click.

### Example output

Real tender, abridged. The fit score is for a sample company with 500,000 € turnover and no classification.

```json
{
  "tenderId": "17419/2025",
  "title": "Obras de acondicionamiento y mejora de zonas verdes…",
  "authority": "Alcaldía del Ayuntamiento de Azuqueca de Henares",
  "estimatedValueEur": 264462.8,
  "cpv": ["45112710", "45233293"],
  "region": "Guadalajara",
  "deadline": "2026-11-04T23:59:00",
  "analysisStatus": "ok",
  "analysis": {
    "economicSolvency": { "minAnnualTurnoverEur": 264462.79, "basis": "fixed", "source": { "doc": "PCAP", "page": 5 } },
    "classification": { "required": true, "codes": ["G-6-2"] },
    "awardCriteria": [
      { "name": "Precio (oferta económica)", "weight": 76, "type": "automatic" },
      { "name": "Ampliación del plazo de garantía", "weight": 9, "type": "automatic" },
      { "name": "Certificado ISO 45001 o equivalente", "weight": 5, "type": "automatic" }
    ],
    "guarantees": { "provisionalPct": 0, "definitivePct": 5 },
    "subcontracting": { "allowed": true, "limitPct": null },
    "contractDurationMonths": 3,
    "priceRevision": false
  },
  "fit": { "score": 70, "reasons": ["Cumples la solvencia económica (264.463 € exigidos)", "Exige clasificación G-6-2 y no la tienes"] },
  "meta": { "source": "Plataforma de Contratación del Sector Público (PLACSP)", "aiGenerated": true }
}
```

### Accuracy

Measured on 33 open tenders with readable documents (October 2026):

- Award criteria with weights adding up to 100: **28 of 30**
- Definitive guarantee: **25 of 25**
- Economic solvency figure found in the document: **16 of 16**
- Field-by-field manual review of 7 tenders: **7 of 7 correct**

Known limits: scanned documents without text and annexes not published on PLACSP cannot be read. Those tenders are returned with `analysisStatus: "partial_scanned"` or `"not_analyzable"`, and **you are not charged for the analysis**.

### Pricing (pay per event)

| Event | Price |
|---|---|
| Actor start | $0.01 |
| Tender listed (`discover` mode) | $0.002 |
| Tender analyzed (documents read + extraction + fit score) | $0.35 |

Example: a daily alert with 10 new analyzed tenders costs $3.51. A failed or non-readable analysis is never charged. On Apify's free plan, each run analyzes at most 3 tenders.

### How to use

1. Pick your filters: keywords, CPV prefixes, region (province, autonomous community or NUTS code), contract type and value range.
2. Choose the mode: `analyze` (reads the documents) or `discover` (metadata only, cheaper).
3. Optionally paste your company profile to get a fit score: `annualTurnoverEur`, `similarWorkAmountEur`, `classification`, `certificates`, `experienceCpv`.
4. For daily alerts, schedule the actor and turn on **Only new since last run**: you only get, and pay for, what's new.

Works from Make, Zapier, n8n, the Apify API and **AI agents through the Apify MCP server**.

### Disclaimer

Not an official PLACSP service and not affiliated with the Spanish Ministry of Finance. Data is reused from PLACSP open data (Ley 37/2007). Results are AI-generated: always check the official documents before bidding. No personal data is returned.

***

### 🇪🇸 En español

Licitaciones públicas abiertas de la PLACSP con **el análisis de sus pliegos por IA**: solvencia económica y técnica, clasificación exigida, criterios de adjudicación con su peso, garantías, subcontratación, revisión de precios, condiciones especiales y una **nota de encaje** con tu empresa. Cada dato lleva el documento y la página de donde sale.

- Modo `analyze`: lee PCAP, PPT y cuadro de características. 0,35 $ por licitación analizada.
- Modo `discover`: solo la ficha. 0,002 $ por licitación.
- Si un pliego no se puede leer (escaneado o no publicado), no se cobra el análisis.
- Programa una ejecución diaria con **Solo novedades** para recibir alertas sin repetir ni pagar dos veces.

No es un servicio oficial. Comprueba siempre el pliego oficial antes de presentar oferta.

# Actor input Schema

## `mode` (type: `string`):

analyze: lee los pliegos y extrae solvencia, criterios, garantías y encaje. discover: solo la ficha de cada licitación (más barato).

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

Busca en el objeto, el órgano y el expediente. Sin tildes ni mayúsculas.

## `cpvPrefixes` (type: `array`):

Por ejemplo 72 (servicios TI) o 4523 (construcción).

## `regions` (type: `array`):

Provincia, comunidad o prefijo NUTS (p. ej. Madrid o ES30).

## `contractTypes` (type: `array`):

Códigos CODICE: 1 suministros, 2 servicios, 3 obras.

## `minValueEur` (type: `integer`):

Valor estimado mínimo, sin IVA.

## `maxValueEur` (type: `integer`):

Valor estimado máximo, sin IVA.

## `openOnly` (type: `boolean`):

Descarta licitaciones adjudicadas o con plazo vencido.

## `onlyNew` (type: `boolean`):

Útil para alertas programadas: no repite ni cobra lo ya entregado.

## `maxTenders` (type: `integer`):

Máximo de licitaciones devueltas por ejecución.

## `maxAnalyses` (type: `integer`):

Cada análisis se cobra como evento tender-analyzed. En el plan gratuito de Apify el máximo es 3 por ejecución.

## `maxFeedPages` (type: `integer`):

Cada página trae las actualizaciones más recientes de la PLACSP (unas 100-400 licitaciones). Cada página puede tardar 1-2 minutos en descargarse.

## `companyProfile` (type: `object`):

Para calcular la nota de encaje: annualTurnoverEur, similarWorkAmountEur, employees, classification (p. ej. \["V-2-C"]), certificates (p. ej. \["ISO 9001"]), experienceCpv (prefijos).

## Actor input object example

```json
{
  "mode": "analyze",
  "cpvPrefixes": [
    "72"
  ],
  "openOnly": true,
  "onlyNew": false,
  "maxTenders": 50,
  "maxAnalyses": 3,
  "maxFeedPages": 3,
  "companyProfile": {
    "annualTurnoverEur": 500000,
    "similarWorkAmountEur": 200000,
    "certificates": [
      "ISO 9001"
    ],
    "experienceCpv": [
      "72"
    ]
  }
}
```

# Actor output Schema

## `tenders` (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 = {
    "cpvPrefixes": [
        "72"
    ],
    "companyProfile": {
        "annualTurnoverEur": 500000,
        "similarWorkAmountEur": 200000,
        "certificates": [
            "ISO 9001"
        ],
        "experienceCpv": [
            "72"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("licitadata/spain-tender-analyzer").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 = {
    "cpvPrefixes": ["72"],
    "companyProfile": {
        "annualTurnoverEur": 500000,
        "similarWorkAmountEur": 200000,
        "certificates": ["ISO 9001"],
        "experienceCpv": ["72"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("licitadata/spain-tender-analyzer").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 '{
  "cpvPrefixes": [
    "72"
  ],
  "companyProfile": {
    "annualTurnoverEur": 500000,
    "similarWorkAmountEur": 200000,
    "certificates": [
      "ISO 9001"
    ],
    "experienceCpv": [
      "72"
    ]
  }
}' |
apify call licitadata/spain-tender-analyzer --silent --output-dataset

```

## MCP server setup

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

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/dmQ5LCrrZDqHqWeMD/builds/vQVAURDcCKpcfR7dL/openapi.json
