PLACSP — Licitaciones por contratante
Feed principal de licitaciones publicadas por los perfiles de contratante en la Plataforma de Contratación del Sector Público. Incluye todas las administraciones con perfil propio.
Ficha técnica
- Formato
- Atom XML (CODICE 2.07)
- Registros
- ~4 millones
- Cobertura
- 2012–actualidad
- Actualización
- Diaria
- Licencia
- Datos abiertos
- Entidad
- Ministerio de Hacienda
Descripción
La Plataforma de Contratación del Sector Público (PLACSP) es el portal oficial del Gobierno de España para la publicidad de licitaciones y contratos públicos. Gestionado por el Ministerio de Hacienda, centraliza la información de todas las administraciones públicas que tienen perfil de contratante propio.
El feed de sindicación (sindicacion_643) proporciona los datos en formato Atom XML siguiendo la especificación CODICE (Componentes y Documentos Interoperables para la Contratación Electrónica). Cada entry del feed contiene un bloque ContractFolderStatus con toda la información estructurada del contrato.
Los archivos ZIP anuales contienen todos los ficheros .atom del año, con un máximo de 500 entries por fichero, encadenados mediante links de paginación. Se actualizan diariamente con los cambios del día anterior.
Estructura de datos
- ContractFolderID — Número de expediente
- ContractFolderStatusCode — Estado (PRE, PUB, EV, ADJ, RES, ANUL)
- LocatedContractingParty — Órgano contratante (NIF, DIR3, nombre)
- ProcurementProject/Name — Objeto del contrato
- ProcurementProject/TypeCode — Tipo (1=Suministros, 2=Servicios, 3=Obras)
- BudgetAmount/TaxExclusiveAmount — Importe licitación sin IVA
- BudgetAmount/TotalAmount — Importe licitación con IVA
- TenderingProcess/ProcedureCode — Procedimiento (1=Abierto, 2=Restringido...)
- RealizedLocation/CountrySubentityCode — Código NUTS del lugar de ejecución
- TenderResult/WinningParty — Adjudicatario (NIF, nombre)
- TenderResult/AwardedTenderedProject/PayableAmount — Importe adjudicación
- TenderResult/AwardDate — Fecha de adjudicación
- RequiredCommodityClassification/ItemClassificationCode — Código CPV
Ejemplos de código
# Descargar licitaciones de 2025
curl -sLk -o licitaciones_2025.zip \
"https://contrataciondelsectorpublico.gob.es/sindicacion/sindicacion_643/licitacionesPerfilesContratanteCompleto3_2025.zip"
# Descomprimir
unzip licitaciones_2025.zip -d licitaciones_2025/
# Ver primer fichero
head -100 licitaciones_2025/licitacionesPerfilesContratanteCompleto3.atom import zipfile
import xml.etree.ElementTree as ET
# Namespaces CODICE
NS = {
'atom': 'http://www.w3.org/2005/Atom',
'cbc': 'urn:dgpe:names:draft:codice:schema:xsd:CommonBasicComponents-2',
'cac': 'urn:dgpe:names:draft:codice:schema:xsd:CommonAggregateComponents-2',
'cac-ext': 'urn:dgpe:names:draft:codice-place-ext:schema:xsd:CommonAggregateComponents-2',
}
with zipfile.ZipFile('licitaciones_2025.zip') as zf:
for name in zf.namelist():
if not name.endswith('.atom'):
continue
tree = ET.parse(zf.open(name))
root = tree.getroot()
for entry in root.findall('atom:entry', NS):
title = entry.findtext('atom:title', '', NS)
updated = entry.findtext('atom:updated', '', NS)
link = entry.find('atom:link', NS)
url = link.get('href', '') if link is not None else ''
# Datos del contrato (ContractFolderStatus)
cfs = entry.find('.//{urn:dgpe:names:draft:codice-place-ext:schema:xsd:CommonAggregateComponents-2}ContractFolderStatus')
if cfs is None:
continue
expediente = cfs.findtext('{urn:dgpe:names:draft:codice:schema:xsd:CommonBasicComponents-2}ContractFolderID', '')
objeto = cfs.findtext('.//{urn:dgpe:names:draft:codice:schema:xsd:CommonBasicComponents-2}Name', '')
print(f'{expediente}: {objeto[:80]}') <?php
// Leer un fichero .atom del ZIP
$xml = simplexml_load_file('licitaciones_2025/licitacionesPerfilesContratanteCompleto3.atom');
// Registrar namespaces CODICE
$namespaces = [
'cbc' => 'urn:dgpe:names:draft:codice:schema:xsd:CommonBasicComponents-2',
'cac' => 'urn:dgpe:names:draft:codice:schema:xsd:CommonAggregateComponents-2',
'cac-ext' => 'urn:dgpe:names:draft:codice-place-ext:schema:xsd:CommonAggregateComponents-2',
];
foreach ($xml->entry as $entry) {
$title = (string) $entry->title;
$link = (string) ($entry->link['href'] ?? '');
$updated = (string) $entry->updated;
// Buscar ContractFolderStatus
$entry->registerXPathNamespace('cac-ext', $namespaces['cac-ext']);
$entry->registerXPathNamespace('cbc', $namespaces['cbc']);
$cfs = $entry->xpath('.//cac-ext:ContractFolderStatus');
if (empty($cfs)) continue;
$cfs[0]->registerXPathNamespace('cbc', $namespaces['cbc']);
$expediente = (string) ($cfs[0]->xpath('cbc:ContractFolderID')[0] ?? '');
echo "$expediente: $title\n";
}