Administración fuentes públicas
Spanish public data, ready to build products on: where each dataset lives, how to call it, what it returns and the traps that change the numbers, verified with real calls; plus code that fetches it already solved. Start at llms-min.txt or the MCP server.
Datos públicos de España listos para construir productos. Para cada fuente: dónde está, cómo pedirla, qué devuelve y qué falla, comprobado con llamadas reales, y código que ya trae el dato resuelto. Pensado para startups, desarrolladores y agentes de IA.
Empieza aquí
- Con un agente (MCP):
uvx --from git+https://github.com/BquantFinance/Administracion-fuentes-publicas mcp-catalogo,, o en Claude Code
/plugin marketplace add BquantFinance/Administracion-fuentes-publicasy/plugin install fuentes-publicas@fuentes-publicas.buscarencuentra la fuente,fichada endpoints y trampas, yperfil_municipio,coyuntura,empresa_nify el resto traen el dato (herramientas). - Con código:
pip install "fuentes-publicas-mcp @ git+https://github.com/BquantFinance/Administracion-fuentes-publicas". Clientes que ya resuelven certificados, codificaciones y paginación (scripts/clientes), un almacén local en Parquet para lo que las APIs no dejan consultar (guía) y ejemplos que funcionan. - Leyendo:
llms-min.txtpara orientarse y la ficha de cada fuente ensources/.
Qué puedes construir hoy
Cada producto con piezas que ya funcionan; frescura, volumen medido, licencia y la trampa que más cuesta en indices/productos.yaml. Antes de vender: licencias, cita y datos personales.
Lo que no dice la documentación oficial
Algunos ejemplos, comprobados con llamadas reales:
- La exportación de la BDNS devuelve 50 filas aunque haya miles si no pasas
pageSize, y no avisa. Y para sincronizarla no sirve la fecha de concesión: las del 15/01/2025 se siguieron dando de alta hasta agosto de 2026 (el filtro bueno,fechaRegInicio, no está documentado). - Para filtrar un municipio, el INE no quiere su código (
02001) sino un Id interno (6124). En SIGPAC y Catastro, Madrid es28:900, no28079, y otros 4.448 municipios cambian de número (tabla de equivalencias). - El IPC del último mes es un avance que se revisa, y el PIB que se publica es el corregido: 0,68 % trimestral en 2026T2 frente al 4,79 % de la serie sin corregir.
- En el CSV del paro registrado del SEPE, Oza-Cesuras sale con 0 parados y Cerdedo-Cotobade no aparece: sus datos van con los códigos de antes de la fusión.
- Muchos servidores
.gob.esenvían el certificado FNMT sin la intermedia: el navegador entra,curlyrequestsfallan (arreglo). - Los CSV de los portales PC-Axis llegan en UTF-8 aunque la cabecera diga ISO-8859-15, y el del SEPE en Windows-1252 aunque diga UTF-8.
- En GBIF la encina ibérica es sobre todo Quercus rotundifolia (1,3 millones de registros en España); preguntar por Quercus ilex, que es lo que devuelve el buscador de nombres, da 21.322 sin ningún aviso. Y 41,6 de sus 95,8 millones de registros en España son CC BY-NC.
Fuentes catalogadas: 102. Alcance actual: Administración General del Estado y, desde octubre de 2026, las cuatro comunidades más pobladas (Madrid, Cataluña, Andalucía y Comunitat Valenciana) y los ayuntamientos de Madrid y Barcelona. Después: resto de comunidades y entidades locales, Cortes y Poder Judicial, Unión Europea.
Principios
- Una ficha por fuente, en YAML, con campos fijos validados contra un esquema. Sin prosa de relleno: cada línea ahorra una búsqueda.
- Fuente única de verdad. Solo se editan
sources/**/*.yaml. Índices,catalog.jsonyllms*.txtse generan. - Lo que no dice la documentación oficial. El campo
gotchasrecoge los detalles que hacen perder horas: cabeceras obligatorias, codificaciones raras, límites no documentados, URLs que cambian. Las trampas silenciosas, las que dan una cifra incompleta o distinta sin ningún error, van aparte enalerts, y el servidor MCP las devuelve lo primero. - Verificación explícita.
verifiedlleva la fecha de la última prueba real del endpoint, onull. Un job semanal comprueba que las URLs siguen respondiendo. - Top-down. Se cubren primero las fuentes de mayor uso e impacto, sector a sector, hasta cubrirlo todo.
Sectores
Estructura
sources/<sector>/<id>.yaml fichas (fuente de verdad)
sources/<sector>/README.md índice del sector (generado)
schema/source.schema.json esquema de ficha
schema/vocab.yaml vocabulario controlado: sectores, acceso, auth, formatos
catalog.json todo el catálogo (generado)
llms-min.txt, llms.txt, llms-full.txt entrada para agentes, de menos a más (generado)
indices/*.yaml productos, recetas por intención, necesidades, identificadores, códigos que son parámetros, rutas muertas (fuente de verdad)
indices/README.md los seis índices en texto (generado)
ejemplos/ proyectos pequeños que funcionan (carburante, BOE, licitaciones, municipio, subvenciones)
plugins/, .claude-plugin/ plugin de Claude Code con la skill y el servidor MCP
datos/municipios.csv los 8.132 municipios con su código INE, Id del INE Tempus, SIGPAC y Catastro, DIR3, NIF, NUTS3 y coordenadas (scripts/municipios.py)
scripts/ validate.py, build.py, check_links.py, check_recetas.py, check_ejemplos.py, fnmt_bundle.py, mcp_catalogo.py (servidor MCP local)
scripts/clientes/ sesión HTTP, clientes CKAN, Socrata, PC-Axis, ArcGIS y OGC, cargadores (BOE y BORME, BDNS, AEMET, INE, PLACSP, DataComex, Saiku) y almacén local en Parquet
scripts/clientes/muestras/ respuestas reales recortadas para probar los parsers sin red (python scripts/test_clientes.py)
evals/ 24 tareas con respuesta esperada para medir lo que aporta el repo a un agente
templates/source.yaml plantilla de ficha
guides/ guías transversales (cliente HTTP, identificadores, servidor MCP, reutilización y datos personales, almacén)
Uso rápido
# Todo el catálogo
curl -s https://raw.githubusercontent.com/BquantFinance/Administracion-fuentes-publicas/main/catalog.json
# Fuentes de un sector con API REST y sin autenticación
curl -s .../catalog.json | jq '.sources[] | select(.sector=="economia-finanzas" and (.access|index("api-rest")) and .auth=="none") | .id'
# pip install "fuentes-publicas-mcp @ git+https://github.com/BquantFinance/Administracion-fuentes-publicas"
from fuentes_publicas.clientes import ckan, socrata, pcaxis, arcgis, ogc
from fuentes_publicas.clientes.sesion import sesion # requests.Session con FNMT, User-Agent, reintentos y bloqueos
pcaxis.tabla(24077)[:3] # IPC del INE en CSV: UTF-8 real, coma decimal y periodo sin dato como None
list(socrata.filas("gn9e-3qhr")) # 87.930 filas de la Generalitat, no las 1.000 que da Socrata sin $limit
list(ckan.filas("cnmc", rid)) # todas las filas del datastore aunque el portal recorte limit a 32.000
ckan.comparar("comunidad-madrid", rec) # el datastore del padrón tiene 5.000 filas; el CSV, 18.718
Índices para agentes
Además de las fichas, indices/ responde a las preguntas que se hacen antes de elegir una fuente:
- Productos: qué se puede construir hoy, para quién y con qué piezas.
- Recetas por intención: procedimientos verificados que encadenan fichas (de un NIF a sus subvenciones y contratos, de unas coordenadas a la referencia catastral, del sumario del BOE al texto consolidado). Cada receta lleva comprobaciones que
python scripts/check_recetas.pyejecuta contra los servidores reales. - Dónde está cada cosa: necesidades habituales con la ficha que las resuelve y la nota que evita el desvío típico.
- Identificadores: los códigos que cruzan datasets, con regex, ejemplo, emisor y vías verificadas de conversión.
- Códigos que son parámetros: valores que las APIs exigen y no se adivinan (Id del INE para
tv, países de DataComex, estación de AEMET por capital, productos de carburantes, rangos del BOE), obtenidos con llamadas reales. - Rutas muertas: URLs de documentación antigua que ya no sirven y su sustituta.
Medido (evals/): en diez tareas resueltas por el mismo agente con y sin catálogo (dos modelos), el acierto fue el mismo; con catálogo, en las tareas difíciles las llamadas HTTP y los pasos del agente bajan a la mitad y las fallidas casi a cero. En tareas con trampas silenciosas y un modelo pequeño (Haiku, tres repeticiones, tokens medidos turno a turno), el acierto pasa de 3 de 21 sin catálogo a 13 de 21 con el servidor MCP, con un 43 % menos de tokens; con las alertas, las trampas que aún fallaban pasan de 5 a 18 de 18.
Todo en indices/README.md y, para consumo programático, bajo la clave indices de catalog.json. Cada endpoint principal de una ficha lleva example (llamada copiable) y returns (forma de la respuesta vista en esa llamada). python scripts/mcp_catalogo.py expone el catálogo por MCP en local para cargar solo lo necesario (guía).
Contribuir
Lee CONTRIBUTING.md. Resumen: copia templates/source.yaml, rellena, ejecuta python scripts/validate.py && python scripts/build.py, abre un PR.
Licencia
Catálogo y documentación: CC0 1.0. Los datos a los que apuntan las fichas tienen cada uno su propia licencia, indicada en el campo license.