Andalucía — Subvenciones otorgadas
API REST oficial de la Junta de Andalucía con todas las subvenciones otorgadas por la administración andaluza desde 2016: unos 4,6 millones de concesiones. Endpoint propio con OpenAPI, descarga integral en JSON o CSV, actualización diaria y licencia CC BY 4.0.
Ficha técnica
- Formato
- API REST (JSON/CSV) + OpenAPI
- Registros
- ~4,57 millones (octubre de 2026)
- Cobertura
- Concesiones desde 2016
- Actualización
- Diaria
- Licencia
- CC BY 4.0
- Entidad
- Junta de Andalucía
Descripción
Dataset oficial de la Junta de Andalucía con todas las subvenciones otorgadas por la administración autonómica andaluza. Publicado por la Consejería de Economía, Hacienda, Fondos Europeos y Diálogo Social, con licencia CC BY 4.0. Los ficheros se regeneran cada noche: en octubre de 2026 tenían 4.572.785 concesiones, con fechas de concesión desde enero de 2016 hasta el día 1 de ese mes.
A diferencia de otras fuentes regionales que solo ofrecen descarga de CSV o copia de la BDNS, Andalucía expone una API REST propia con OpenAPI documentado (/api/v0/subventions/openapi.json). El endpoint /all devuelve el conjunto completo y redirige a ficheros generados en juntadeandalucia.es/ssdigitales/festa: con format=csv son unos 1,7 GB (separador «|») y con format=json unos 3,2 GB. Por ese tamaño, ni Excel ni pd.read_json sirven para abrirlo entero; lo práctico es leer el CSV por trozos. El endpoint /count da el número de registros sin descargar nada.
Los campos están en inglés: beneficiary, nif_cif_public, amount, grant_date (AAAA-MM-DD), award_year, finality, announcement, regulatory_base, organism, european_funds (marca si hay fondos europeos) y physical_person. Unos 4,16 millones de filas (el 91 %) son de personas físicas, y en ellas el NIF aparece enmascarado con asteriscos; en algunas entidades, además, nif_cif_public trae un código numérico en lugar del NIF. No hay ayuda equivalente. El importe puede llevar espacios al final, así que conviene limpiarlo antes de convertirlo a número.
Estructura de datos
- beneficiary — Nombre del beneficiario
- nif_cif_public — NIF/CIF (enmascarado con asteriscos en personas físicas)
- physical_person — «X» si el beneficiario es persona física
- amount — Importe concedido (EUR, punto decimal)
- grant_date — Fecha de concesión (AAAA-MM-DD)
- award_year — Año de concesión
- announcement / regulatory_base — Convocatoria y bases reguladoras
- finality — Finalidad
- organism / id_organism — Órgano concedente y su código
- program / name_program — Programa presupuestario
- budget_application — Aplicación presupuestaria
- european_funds — «X» si hay financiación europea
- type — Tipo de concesión: Reglada, Nominativa o Excepcional
Ejemplos de código
# Número de concesiones, sin descargar nada
curl -s "https://datos.juntadeandalucia.es/api/v0/subventions/count"
# CSV completo (~1,7 GB, separador «|»)
curl -sL -o subvenciones_andalucia.csv \
"https://datos.juntadeandalucia.es/api/v0/subventions/all?format=csv"
# O en JSON (~3,2 GB)
curl -sL -o subvenciones_andalucia.json \
"https://datos.juntadeandalucia.es/api/v0/subventions/all?format=json"
# Inspeccionar OpenAPI spec
curl -s "https://datos.juntadeandalucia.es/api/v0/subventions/openapi.json" | python3 -m json.tool | head -40 import pandas as pd
# El CSV completo pasa de 1,6 GB: se lee por trozos y solo con las columnas necesarias
URL = 'https://datos.juntadeandalucia.es/api/v0/subventions/all?format=csv'
cols = ['grant_date', 'beneficiary', 'nif_cif_public', 'amount', 'physical_person']
partes = []
for chunk in pd.read_csv(URL, sep='|', usecols=cols, dtype=str, chunksize=500_000):
chunk = chunk[chunk['physical_person'] != 'X'] # sin personas físicas (NIF enmascarado)
chunk = chunk[chunk['grant_date'] >= '2025-01-01'] # fechas en formato AAAA-MM-DD
partes.append(chunk)
df = pd.concat(partes, ignore_index=True)
df['amount'] = pd.to_numeric(df['amount'].str.strip())
print(f'Concesiones a personas jurídicas desde 2025: {len(df):,}')
top = df.groupby(['nif_cif_public', 'beneficiary'])['amount'].sum().sort_values(ascending=False).head(20)
print(top)