Regional Junta de Andalucía

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

Contar y descargar el conjunto completo curl
# 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
Leer el CSV por trozos con pandas python
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)