Spain Public Tenders - licitaciones y concursos publicos
Pricing
Pay per event
Spain Public Tenders - licitaciones y concursos publicos
Every public tender from Spain's Plataforma de Contratacion del Sector Publico (PCSP), normalized in English: filter by CPV, budget, region and deadline, with award winners. Licitaciones, concursos y contratos publicos de Espana como datos (perfil del contratante, BOE).
Pricing
Pay per event
Rating
0.0
(0)
Developer
c.d.s Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
🏛️ Spain Public Tenders — licitaciones públicas de España (PCSP)
Every public tender update from Spain's Plataforma de Contratación del Sector Público, normalized in English, filterable by CPV, budget, region and deadline — with award winners and cumulative history the official feed throws away. Todas las licitaciones públicas de España (publicaciones, modificaciones y adjudicaciones), normalizadas en inglés, filtrables por CPV, importe, comunidad y plazo — con adjudicatarios e histórico acumulado que la fuente oficial no conserva.
🇪🇸 Español
Qué hace
La Plataforma de Contratación del Sector Público (PCSP) sindica cada actualización de
licitación por ATOM (licitacionesPerfilesContratanteCompleto3): publicaciones,
modificaciones y adjudicaciones de toda España. El feed es gratis pero bruto:
| Problema de la fuente oficial | Qué hace este actor |
|---|---|
XML CODICE crudo con namespaces ubicuos (cac-place-ext, cbc, cac) | JSON limpio en inglés, camelCase, estable |
| El feed es una ventana deslizante: lo publicado se pierde | Histórico diario acumulado + diff de novedades contra la ejecución anterior |
| Sin filtros de ningún tipo: te baja todo España | Filtras por comunidad autónoma (Canarias de serie), CPV (prefijo), importe mín/máx, tipo, estado y plazo |
Códigos cripticos (EV, 79342200, typeCode 2) | Traducción oficial a inglés de estados, tipos y procedimientos (listas .gc de la propia plataforma) |
El plazo de presentación está enterrado (TenderSubmissionDeadlinePeriod) | submissionDeadline ISO + daysToDeadline (cuenta atrás) + alerta de cierre |
Las adjudicaciones hay que cazarlas en el summary | winnerName, winnerTaxId, importes neto/bruto por lote (awards) |
| La comunidad autónoma no existe como campo: hay que deducirla del NUTS | autonomousCommunity + autonomousCommunityCode (NUTS-2/3, con fallback a la jerarquía del órgano) |
Paginación manual (rel="next") de páginas de ~500 entradas y varios MB | Camina maxPages páginas solo, con reintentos |
| Sin resumen ni contadores | OUTPUT con desglose por tipo/estado/comunidad, presupuestos totales y noticias |
Para quién
- Pymes y proveedores — «todas las licitaciones de Canarias de mi sector (CPV), por encima de 50.000 €, que cierren en menos de 15 días».
- Consultoras de licitaciones y business development — pipeline diario de oportunidades por región/importe/CPV, sin construir el ETL del feed CODICE.
- Analistas de datos públicos y periodismo — la serie temporal de estados (publicada → evaluación → adjudicada) y de adjudicatarios que la fuente no guarda.
- ERPs y CRMs — enriquecer el pipeline comercial con licitaciones en JSON listo.
Ejemplos de entrada
Licitaciones de Canarias (por defecto) del sector construcción por encima de 200.000 €, avisándome de las que cierran en menos de 15 días:
{"communities": ["Canarias"],"cpvCodes": ["45"],"minBudget": 200000,"deadlineWithinDays": 15,"alertWebhookUrl": "https://hooks.tu-dominio.com/plazo"}
Todo España, servicios de IT (CPV 48), solo abiertas:
{ "communities": [], "cpvCodes": ["48"], "contractTypes": ["services"], "onlyOpen": true }
Las grandes adjudicadas de toda España, con adjudicatario e importes:
{ "communities": [], "statuses": ["ADJ", "RES"], "minBudget": 1000000 }
Los alias de comunidad funcionan: islas canarias, euskadi, comunitat valenciana,
illes balears, la rioja… o el nombre oficial. Vacío = toda España.
Salida (una fila por licitación, la más reciente primero)
{"id": "19950042","folderNumber": "04/2026","title": "Servicio integral de comunicación digital para SODECAN","status": "EV","statusLabel": "award_pending","type": "services","budgetNet": 80000,"budgetGross": 85600,"currency": "EUR","cpvCodes": ["79342200", "79341100"],"mainCpv": "79342200","region": "Gran Canaria","nutsCode": "ES705","autonomousCommunity": "Canarias","autonomousCommunityCode": "ES70","procedure": "simplified_open","submissionDeadline": "2026-07-13T22:59:00+02:00","daysToDeadline": -95,"authorityName": "Consejería Delegada de la Sociedad para el Desarrollo Económico de Canarias, SODECAN S.A.","authorityTaxId": "A28485548","buyerProfileUrl": "https://contrataciondelestado.es/wps/poc?uri=deeplink:perfilContratante&idBp=...","detailUrl": "https://contrataciondelestado.es/wps/poc?uri=deeplink:detalle_licitacion&idEvl=...","hasAward": true,"winnerName": "ORANGE ESPAGNE, S.A.U.","winnerTaxId": "A82009812","awardedAmountNet": 65404,"awards": [{ "winnerName": "ORANGE ESPAGNE, S.A.U.", "lotId": "1", "amountNet": 65404 }],"statusChange": "PUB>EV","updatedAt": "2026-10-15T20:07:31.720000+02:00","fetchedAt": "2026-10-16T01:11:28+00:00"}
Además:
OUTPUT(key-value store): resumen del run — entradas vistas, licitaciones que matchean, desglose por tipo/estado/comunidad, presupuesto total y medio, adjudicaciones, plazos al cierre y el diff de novedades (nuevas, cambios de estado, nuevas adjudicaciones).- Dataset
licitaciones-historico: una fila por licitación/día (dateISO). Con un Schedule diario construyes la serie temporal de estados y adjudicaciones que la plataforma no conserva.
Programarlo
Apify Console → Schedules → cada 6-12 h (el feed se actualiza de continuo; 2 páginas ≈ las últimas 24-48 h de toda España). Con una ejecución diaria ya no se te escapa nada; con dos al día pillas los mismos-day awards.
Honestidad sobre los datos
- El feed trae actualizaciones: una misma licitación aparece varias veces (publicación, modificación, adjudicación). El actor deduplica por licitación quedándose la versión más reciente de la ventana descargada; más páginas = ventana más amplia.
daysToDeadlinese calcula contra la fecha del run; los plazos ya vencidos dan días negativos (no se ocultan).- La comunidad autónoma se deduce del NUTS (nivel 2/3); si el registro solo trae NUTS-1 o
«España», cae a la jerarquía del órgano contratante. En la muestra real: 95,4 %
identificado; el resto queda sin
autonomousCommunityy no se inventa. - Presupuesto: se usa
EstimatedOverallContractAmount(neto) y, si no existe,TaxExclusiveAmounto el importe adjudicado neto. Los importes son los declarados por los órganos; puede haber lotes y acuerdos posteriores. - Los códigos de estado/tipo/procedimiento se traducen con las listas oficiales .gc de la plataforma (SyndicationContractFolderStatusCode-2.04, ContractCode-2.08, SyndicationTenderingProcessCode-2.07).
- Datos públicos sin información personal de terceros (los adjudicatarios son personas jurídicas publicadas por la propia plataforma).
🇬🇧 English
What it does
Spain's public procurement platform (PCSP) syndicates every tender update as raw CODICE Atom XML — new notices, amendments and award decisions for the whole country. This actor turns that firehose into production-ready JSON:
- Filters: autonomous community (Canarias by default), CPV prefix, min/max budget, contract type, folder status, open-only, deadline alert window.
- Clean typed output in English: budgets as floats, NUTS → autonomous community, official code lists translated (status, contract type, procedure).
- Submission deadline extracted with a day countdown and
closingSoonalerts (optional webhook POST). - Award winners: name, tax ID, net/gross amounts, per-lot detail.
- Daily history dataset + diff against the previous run: new tenders, status
changes (
PUB>EV), new awards — the memory the sliding-window feed lacks. - Run summary in
OUTPUT: counts by type/status/community, budget totals, deadlines.
Input
See the input schema. Everything is optional; defaults are communities: ["Canarias"]
and maxPages: 2 (≈ the last 1-2 days of all Spain; each page is up to ~500 updates).
Community aliases accepted: islas canarias, euskadi, comunitat valenciana…
Who buys this
SMEs and suppliers chasing regional tenders in their CPV sector, bid-consultancy pipelines, data journalists tracking who wins public money, and ERP/CRM vendors enriching their commercial pipeline.
💰 Pricing — pay per event
Este actor se monetiza por evento, con las mismas claves de evento que
spain-fuel-prices (catálogo uniforme: actor-start / station-result /
history-snapshot / price-alert). El reparto de Apify es 80 % para el
desarrollador.
| Evento | Cuándo se cobra | Precio |
|---|---|---|
actor-start | 1 por ejecución (descarga y parseo de las páginas del feed) | $0,02 |
station-result | 1 por licitación entregada, normalizada y filtrada | $0,0004 |
history-snapshot | 1 por ejecución que añade el día al histórico y difea novedades | $0,01 |
price-alert | 1 por licitación que cierra dentro de la ventana pedida | $0,001 |
Los valores exactos están en .actor/pay_per_event.json
(mismas claves que cobra src/main.py).
Por qué sale a 25–120 €/mes
Cifras medidas sobre la muestra real (629 actualizaciones en 2 páginas; 54 licitaciones canarias con 283 M € de presupuesto agregado; 220 adjudicaciones). Tipo de cambio aproximado 0,92 €/$. Estimaciones, no ingresos garantizados: dependen de que haya clientes.
| Perfil de cliente | Consumo mensual | Bruto/mes | Neto dev (80 %) |
|---|---|---|---|
| A — pymes canarias: 1 comunidad, 2 ejecuciones/día | 60 runs × (0,02 + ~60×0,0004 + 0,01) | $7,20 | $5,8 ≈ 5,3 € |
| B — consultora regional multi-CPV: 2 comunidades + alertas, 4 ejecuciones/día | 120 runs × ≈0,11 | $13,20 | $10,6 ≈ 9,7 € |
| C — consultora nacional: toda España, 4 ejecuciones/día | 120 runs × (0,02 + ~1250×0,0004 + 0,01) | $85,20 | $68,2 ≈ 63 € |
| D — C + 3×A + 2×B | suma | $117,60 | $94 ≈ 87 € |
El coste de infraestructura lo cubre el evento: una ejecución nacional (2 páginas, ~629 entradas) tarda ~15 s de descarga+parseo en local.
🛠️ Desarrollo y publicación
# 1. Tests del núcleo contra el feed real de la PCSP (18 tests)python -m pytest tests/test_licitaciones.py -v# 2. Ejecución local completa (crea ./storage con dataset y OUTPUT)python -m venv .venv && .venv/Scripts/pip install -r requirements.txt# deja tu entrada en storage/key_value_stores/default/INPUT.json.venv/Scripts/python -m src# 3. Publicación en Apify Store ← ÚNICO paso que requiere la cuentanpx -y apify-cli login # abre el navegador, pega el API tokennpx -y apify-cli push # construye la imagen y sube el actor# luego, en Apify Console:# Monetization -> Pay per event -> pegar los 4 eventos de .actor/pay_per_event.json# Publication -> Publish to Store (categoría: Business)
Estructura
.actor/actor.json # metadatos del actorinput_schema.json # formulario de entrada (12 campos)dataset_schema.json # vista de tabla «Newest first» en la Consolepay_per_event.json # pricing exacto a pegar en Monetizationsrc/licitaciones.py # núcleo puro: descarga, normaliza, filtra, difeamain.py # wrapper de plataforma: storages, cobro, webhook, OUTPUT__main__.pytests/test_licitaciones.py # 18 tests, 14 de ellos contra el feed real cacheadoDockerfile # apify/actor-python:3.12sample_feed/ # caché local de páginas reales del feed (gitignored)
Fuente: https://contrataciondelsectorpublico.gob.es/sindicacion/sindicacion_643/licitacionesPerfilesContratanteCompleto3.atom
(sindicación de contenido de la Plataforma de Contratación del Sector Público —
Ministerio de Hacienda; reutilizable bajo la Ley 37/2007).