Datos abiertos
Descargas y datos en CSV y JSON
Cada búsqueda y cada ficha se descargan en CSV o JSON; los indicadores por órgano, los datos de los gráficos y los RSS también tienen su dirección. Aquí están todas, con ejemplos, sus límites y qué es cada columna.
- Datos
- Actualizados el 03/11/2026 (cada semana)
- Una búsqueda
- Hasta 1.000 filas, CSV o JSON
- Una ficha
- Hasta 10.000 contratos, CSV o JSON
- Todo
- Los Parquet de cada fuente, en GitHub
Descargas y datos
Qué es (y qué no)
No es una API estable
Son las descargas de la web y los ficheros que leen sus páginas. Pueden cambiar de nombre, de columnas o desaparecer con cualquier actualización, sin aviso. Sirven para bajar lo que se ve en una página; para un trabajo que tenga que durar o para bajar mucho, usa los datos completos de GitHub, que tienen versiones.
Las direcciones de abajo cuelgan de /api/ o de su página; ninguna pide registro. Cada descarga
lleva los contratos tal como los publica cada fuente, con su IVA y sus marcas de calidad, y sin datos de personas
físicas. Qué es cada columna, de qué fuente llega y con qué IVA, en el diccionario.
Una búsqueda
En el buscador, «Descargar» baja las primeras 1.000 filas de la
búsqueda en su orden. La dirección de la descarga es la búsqueda: los mismos parámetros que la página
(lo que va detrás de /buscar?), así que guardada la repite, con los datos de cada semana; el menú la da para
copiarla. El fichero lleva en su nombre la fecha de los datos, y las cabeceras X-Busqueda (la búsqueda en la
web) y X-Datos-Actualizados. Hace falta un texto o algún filtro.
| Dirección | Qué devuelve | Ejemplo |
|---|---|---|
/api/buscar/exportar/csv?… | La búsqueda en CSV (separador «;», decimales con coma, UTF-8 con BOM) | /api/buscar/exportar/csv?ccaa=MD&year_from=2024&year_to=2024&only_menor=1 |
/api/buscar/exportar/json?… | Lo mismo en JSON, con «meta» (la búsqueda, la fecha de los datos, la nota y qué es cada columna) y «contratos» | /api/buscar/exportar/json?q=limpieza&ccaa=MD |
curl -s -o madrid-menores-2024.csv \
'https://buscalicitaciones.com/api/buscar/exportar/csv?ccaa=MD&year_from=2024&year_to=2024&only_menor=1'
import pandas as pd
url = 'https://buscalicitaciones.com/api/buscar/exportar/csv?ccaa=MD&year_from=2024&year_to=2024&only_menor=1'
menores = pd.read_csv(url, sep=';', decimal=',', encoding='utf-8-sig')
print(len(menores), 'filas;', menores['imp_adj_eur_corregido'].sum(), '€ que cuentan')
Sin texto, las filas van en el orden de la página con desempate por fuente, año e identificador: la misma dirección da las mismas filas mientras no cambien los datos. Con texto, en el orden del buscador de texto. Con texto, el CSV trae los campos de la tarjeta del buscador; sin texto, todas las columnas de la descarga.
Una ficha
Cada ficha de empresa y de órgano baja sus contratos, los más recientes primero, hasta
10.000. clave es la de la ficha (el NIF o, sin NIF, el nombre normalizado);
cuenta=todas, cada publicación. Las fichas de personas físicas no se descargan.
| Dirección | Qué devuelve | Ejemplo |
|---|---|---|
/api/exportar/organo/{csv|json}?clave=… | Los contratos de un órgano | /api/exportar/organo/json?clave=P2807900B |
/api/exportar/empresa/{csv|json}?clave=… | Los contratos de una empresa (su NIF) | — |
/api/rss/organo?clave=… · /api/rss/empresa?clave=… | Sus 20 contratos más recientes, en RSS | /api/rss/organo?clave=P2807900B |
import json, urllib.request
url = 'https://buscalicitaciones.com/api/exportar/organo/json?clave=P2807900B'
with urllib.request.urlopen(url) as r:
d = json.load(r)
print(d['meta']['contratos_total'], 'contratos;', d['meta']['licencia'])
for c in d['contratos'][:5]:
print(c['fecha_adj'], c['imp_adj_eur'], c['imp_adj_iva'], c['objeto'][:60])
Indicadores por órgano
Las tablas de los indicadores de cumplimiento y descriptores de cada ficha de órgano, para todos los órganos y años, en CSV y Parquet, con su propio diccionario: en Descargas de indicadores.
| Dirección | Qué devuelve | Ejemplo |
|---|---|---|
/api/exportar/indicadores/{tabla}.{csv|parquet} | Una tabla de indicadores (las de /exportar) | /api/exportar/indicadores/diccionario.json |
/api/indicadores/hechos/{lista}.csv?clave=…&anio=… | Los contratos de una lista de hechos de una ficha y un año (dias-agrupados, series-mismo-objeto, sobre-el-umbral) | — |
import duckdb # pip install duckdb
duckdb.sql("SELECT * FROM 'https://buscalicitaciones.com/api/exportar/indicadores/descriptores_organo_anio.parquet' LIMIT 5").show()
Ofertas por licitador
Quién se presentó a cada licitación y con qué oferta, cuál ganó y su baja sobre el presupuesto: una fila por oferta, solo de empresas (nunca personas físicas, comunidades de bienes, sociedades civiles ni UTE con el nombre de una persona), de las fuentes que publican la relación de ofertas. Es la tabla del bloque «Quién se presentó» de cada ficha de contrato. Qué se publica y qué no, su cobertura y lo que no dice, en su metodología; cada columna, en el diccionario.
| Dirección | Qué devuelve | Ejemplo |
|---|---|---|
/api/exportar/licitadores/ofertas.csv | Todas las ofertas en CSV (separador «;», decimales con coma, UTF-8 con BOM): 61.768 filas, 39,3 MB | /api/exportar/licitadores/ofertas.csv |
/api/exportar/licitadores/ofertas.parquet | Lo mismo en Parquet: 2,4 MB | /api/exportar/licitadores/ofertas.parquet |
/api/exportar/licitadores/meta.json | Procedencia, licencia de cada fuente, fecha, regla, cobertura por fuente y año, lo que queda fuera por motivo, columnas y la huella (sha256) de cada fichero | /api/exportar/licitadores/meta.json |
/api/exportar/licitadores/vinculadas.{csv|parquet} | Los pares de empresas de una misma licitación vinculadas en el Registro Mercantil (administrador común, mismo domicilio o mismo grupo; sin personas): 626 pares | /api/exportar/licitadores/vinculadas.csv |
| Fuente | Ofertas | Licitaciones | Años | Licencia |
|---|---|---|---|---|
| Cantabria · Gobierno de Cantabria y su sector público | 22.646 | 7.821 | 2017-2026 | CC BY 3.0 ES |
| TED · Diario Oficial de la UE (avisos eForms) | 39.122 | 8.124 | 2020-2026 | Decisión 2011/833/UE (reutilización de los documentos de la Comisión) |
import duckdb # pip install duckdb
# Licitaciones y ofertas publicadas por fuente y año
duckdb.sql("""
SELECT fuente, anio, count(DISTINCT lote_clave) AS licitaciones, count(*) AS ofertas
FROM 'https://buscalicitaciones.com/api/exportar/licitadores/ofertas.parquet'
GROUP BY ALL ORDER BY ALL
""").show()
Cita cada fuente con su licencia (en meta.json: «atribucion»). Las filas con la misma
lote_clave son las ofertas de una misma licitación o lote.
Los datos de los gráficos
Cada gráfico de Cómo se contrata tiene en «Ver los datos» la tabla de lo que enseña, su CSV y el CSV completo. Son los ficheros que lee la página: cambian con ella.
| Dirección | Qué devuelve | Ejemplo |
|---|---|---|
/como-se-contrata/datos/{nombre}.csv | El CSV completo de un gráfico (rio, calendario, umbral, versiones, ley_series, ley_eventos, ley_normas) | /como-se-contrata/datos/rio.csv |
/como-se-contrata/datos/{nombre}.json | Lo que dibuja la página (rio, umbral, versiones, ley; calendario/{tipo}) | /como-se-contrata/datos/rio.json |
Precio frente a una referencia oficial
Pagado ÷ referencia oficial del mes en los contratos de carburantes y de papel A4 que dicen la cantidad en el objeto: por mercado, producto, provincia y año, y por órgano de contratación con 10 compras medibles o más. Ninguna fila es un contrato ni una empresa. Método y cobertura, en su metodología; las tablas, en Descargas.
| Dirección | Qué devuelve | Ejemplo |
|---|---|---|
/api/exportar/precios/{tabla}.{csv|parquet} | Una tabla (precios_mercado_anio o precios_organo) | /api/exportar/precios/precios_mercado_anio.csv |
/api/exportar/precios/meta.json | Procedencia, referencias oficiales con su sha256 y el diccionario de las dos tablas | /api/exportar/precios/meta.json |
/como-se-contrata/datos/precios.json | Lo que dibuja el gráfico 7 (referencia por mes y provincia, trimestres y años) | /como-se-contrata/datos/precios.json |
| Columna | Qué es |
|---|---|
mercado | carburantes o papel |
producto | gasoleo_a, gasoleo_b, gasoleo_c, gasolina95; en papel, lote1 (fibra virgen o sin indicar) o lote2 (reciclado) |
provincia_ine | código INE de la provincia del órgano; 00 = toda España (incluye las de provincia desconocida) |
provincia | nombre de la provincia |
anio | año del mes de referencia; «todos» = 2015-2026 (papel desde mayo de 2020) |
contratos | contratos medibles (cantidad en el objeto, referencia del mes, razón válida) |
mediana_razon | mediana de pagado ÷ referencia (1 = el precio oficial del mes) |
ic95_inf | límite inferior del intervalo del 95 % (remuestreo de contratos, 2.000 réplicas) |
ic95_sup | límite superior |
pct_por_encima | % de contratos que pagaron más de un 15 % por encima de la referencia |
| Columna | Qué es |
|---|---|
mercado | carburantes o papel |
producto | en carburantes, el producto; en papel, «todos» |
organo_clave | el órgano de contratación de la identidad (organo_clave) |
organo | su nombre |
tipo_organo | su tipo |
contratos | compras medibles del órgano (10 o más) |
por_encima | cuántas pagaron más de un 15 % por encima (K de N) |
pct_resto | % por encima en el resto de compradores del mismo mercado y producto |
p_valor | prueba binomial de cola superior frente al resto |
hecho | verdadero si se separa del resto tras la corrección de Holm (5 %) sobre los órganos comparados del mercado |
mediana_razon | mediana de pagado ÷ referencia del órgano |
ic95_inf | límite inferior del intervalo del 95 % (2.000 réplicas) |
ic95_sup | límite superior |
resto_contratos | compras medibles del resto |
resto_mediana | mediana del resto |
anio_desde | primer año con compras medibles |
anio_hasta | último año |
RSS
| Dirección | Qué devuelve | Ejemplo |
|---|---|---|
/api/rss/buscar?q=… | Los 30 contratos más recientes de una búsqueda con texto | /api/rss/buscar?q=ambulancias |
/en-plazo.xml · /en-plazo/{comunidad}.xml | Las licitaciones publicadas más recientemente que siguen en plazo | /en-plazo.xml |
Lo demás que hay bajo /api/ (las sugerencias de la caja de búsqueda, los trozos de las
fichas que llegan aparte) es de las páginas: no está pensado para reutilizarse.
Diccionario de columnas
Qué es cada columna de los contratos, su tipo, su IVA, sus valores posibles y de qué fuentes llega, en el diccionario. Se genera del esquema de la tabla única y del informe de cada actualización semanal, así que no se desfasa.
| Dirección | Qué devuelve | Ejemplo |
|---|---|---|
/api/exportar/diccionario.{json|csv} | El diccionario entero | /api/exportar/diccionario.json |
/api/exportar/presencia-columnas.csv | El % de filas con valor de cada columna en cada tabla de origen | /api/exportar/presencia-columnas.csv |
Privacidad y límites
- Un contrato adjudicado a una persona física va sin su nombre («[persona física]»), su NIF, su identificador ni su enlace; su ficha no se descarga. Un órgano que publica con el NIF de una persona física sale como «otros», sin NIF ni nombre (política de privacidad).
- Una búsqueda baja como mucho 1.000 filas y una ficha 10.000 contratos: lo que pasa de ahí, en los datos completos.
- Si lo automatizas, pide de una en una y deja al menos un segundo entre peticiones: la web es un proyecto
pequeño. Los rastreadores no recorren
/api/(robots.txt).
Licencia y cita
Datos de fuentes oficiales reutilizables (Ley 37/2007). Cita la fuente oficial y buscalicitaciones.com. Las licencias de cada fuente (la del sector público español, la del TED, la del BOE), en la metodología. Cita la página o la descarga con su dirección y la fecha de los datos.
Cómo citar
«Descargas y datos en CSV y JSON». buscalicitaciones.com, https://buscalicitaciones.com/datos. Datos actualizados el 03/11/2026.
Los datos completos
Los datos de cada fuente, tal como los descarga el repositorio público, en Parquet y con sus versiones, en el último release de GitHub; cómo leerlos con DuckDB o pandas, en la metodología.