GitHub Pages
https://jalonsomerchan.github.io/congreso-opendata/
Recomendado para una web pública con esta documentación y los JSON estáticos.
Este repositorio transforma el Open Data del Congreso de los Diputados en JSON versionado: votaciones, iniciativas, intervenciones, diputados, legislaturas disponibles e índices por legislatura y año.
Este panel intenta leer automáticamente los índices generados en data/congreso. Si todavía no se ha ejecutado el Action, algunas tarjetas aparecerán como pendientes.
No hay backend propio. Es una API estática: GitHub Actions ejecuta crawlers, descarga o normaliza los recursos públicos del Congreso y guarda JSON dentro de data/congreso. Después puedes consumirlos desde GitHub Pages o desde raw.githubusercontent.com.
data y añade metadatos propios dentro de metadata.index.json y latest.json.legislaturas y por anios.latest.json, se genera lastest.json como alias compatible con la errata frecuente.https://jalonsomerchan.github.io/congreso-opendata/
Recomendado para una web pública con esta documentación y los JSON estáticos.
https://raw.githubusercontent.com/jalonsomerchan/congreso-opendata/main/
Útil para consumir directamente los JSON desde scripts o backends.
Votaciones del Pleno detectadas en la página oficial de OpenData, con legislatura, sesión, fecha y número de votación.
Datasets oficiales de iniciativas legislativas: aprobadas, proyectos de ley, proposiciones y reformas de estatuto.
Recursos OpenData detectados desde el buscador de intervenciones. Puede quedar vacío si el Congreso no publica enlaces directos sin interacción.
Datasets de diputados activos, diputados por legislatura, diputadas históricas y declaraciones de intereses.
votacionesiniciativasintervencionesdiputados
| Endpoint | Qué devuelve |
|---|---|
data/congreso/legislaturas.json | JSON global con las legislaturas disponibles detectadas en todos los bloques y un resumen por sección. |
data/congreso/{bloque}/index.json | Índice principal del bloque. Contiene todos los registros conocidos por ese crawler. |
data/congreso/{bloque}/latest.json | Resumen de lo último capturado por ese crawler en la última ejecución con cambios. |
data/congreso/{bloque}/legislaturas/index.json | Lista de legislaturas detectadas dentro de ese bloque. |
data/congreso/{bloque}/legislaturas/{legislatura}/index.json | Todos los registros de un bloque para una legislatura. Ejemplo: data/congreso/votaciones/legislaturas/leg15/index.json. |
data/congreso/{bloque}/legislaturas/{legislatura}/latest.json | Últimos registros disponibles de esa legislatura, limitado por GROUP_LATEST_LIMIT. |
data/congreso/{bloque}/anios/index.json | Lista de años detectados dentro de ese bloque. |
data/congreso/{bloque}/anios/{anio}/index.json | Todos los registros de un bloque para un año. Ejemplo: data/congreso/iniciativas/anios/2026/index.json. |
data/congreso/{bloque}/anios/{anio}/latest.json | Últimos registros disponibles de ese año, limitado por GROUP_LATEST_LIMIT. |
data/congreso/{bloque}/.../lastest.json | Alias de compatibilidad de latest.json. La ruta canónica recomendada sigue siendo latest.json. |
El endpoint global data/congreso/legislaturas.json agrega todas las legislaturas encontradas en los bloques disponibles. Cada legislatura incluye su id, slug, total de registros y, dentro de sections, las rutas de índice y últimos registros por bloque.
{
"generated_at": "2026-06-16T10:00:00+00:00",
"generated_by": "scripts/build_congreso_indexes.py",
"total_legislatures": 1,
"legislatures": [
{
"id": "Leg15",
"slug": "leg15",
"total_records": 123,
"sections": {
"votaciones": {
"total_records": 100,
"index_path": "data/congreso/votaciones/legislaturas/leg15/index.json",
"latest_path": "data/congreso/votaciones/legislaturas/leg15/latest.json",
"lastest_path": "data/congreso/votaciones/legislaturas/leg15/lastest.json"
}
}
}
]
}
| Bloque | Ruta de detalle | Información disponible |
|---|---|---|
| Votaciones | data/congreso/votaciones/{legislatura}/{sesion}/{fecha}/{votacion}.json | Legislatura, sesión, fecha, número de votación, URL oficial, fecha de captura y JSON oficial de la votación. |
| Iniciativas | data/congreso/iniciativas/{dataset}/{timestamp}.json | Nombre del dataset, timestamp/exportación, URL oficial y contenido oficial del Congreso. |
| Intervenciones | data/congreso/intervenciones/{recurso}/{timestamp-o-hash}.json | Recursos JSON, CSV o XML detectados desde el buscador de intervenciones y normalizados como JSON. |
| Diputados | data/congreso/diputados/{dataset}/{timestamp}.json | Diputados activos, diputados de baja, diputados por legislatura, diputadas en todas las legislaturas y declaraciones de intereses. |
El bloque diputados funciona igual que el resto: tiene índice principal, últimos cambios, agrupaciones por legislatura y agrupaciones por año.
data/congreso/diputados/index.json · todos los datasets de diputados detectados.data/congreso/diputados/latest.json · últimos datasets descargados o actualizados.data/congreso/diputados/legislaturas/index.json · legislaturas disponibles en datasets de diputados.data/congreso/diputados/anios/index.json · años disponibles en datasets de diputados.{
"updated_at": "2026-06-16T10:00:00+00:00",
"source": "https://www.congreso.es/...",
"total_datasets": 4,
"datasets": {
"diputados-activos-20260616050022": {
"id": "diputados-activos-20260616050022",
"path": "data/congreso/diputados/diputados-activos/20260616050022.json",
"source_url": "https://www.congreso.es/...json",
"first_seen_at": "2026-06-16T10:00:00+00:00"
}
}
}
{
"generated_at": "2026-06-16T10:00:00+00:00",
"generated_by": "scripts/build_congreso_indexes.py",
"section": "votaciones",
"group": { "id": "Leg15", "slug": "leg15", "type": "legislature" },
"total_records": 123,
"votes": {
"leg15-sesion185-20260611-votacion001": {
"id": "leg15-sesion185-20260611-votacion001",
"path": "data/congreso/votaciones/leg15/sesion185/20260611/votacion001.json",
"grouping": { "legislatures": ["Leg15"], "years": ["2026"] }
}
}
}
{
"metadata": {
"id": "...",
"source_url": "...",
"captured_at": "2026-06-16T10:00:00+00:00"
},
"data": {
"...": "Respuesta oficial del Congreso"
}
}
Los nombres exactos de las claves de registros cambian por bloque: votes en votaciones, datasets en iniciativas y diputados, y resources en intervenciones.
const base = 'https://raw.githubusercontent.com/jalonsomerchan/congreso-opendata/main/';
const legislaturas = await fetch(base + 'data/congreso/legislaturas.json').then(r => r.json());
console.log(legislaturas.legislatures);
const latest = await fetch(base + 'data/congreso/votaciones/legislaturas/leg15/latest.json').then(r => r.json());
const first = latest.latest_records[0];
const detail = await fetch(base + first.path).then(r => r.json());
console.log(detail.metadata, detail.data);
const iniciativas2026 = await fetch(base + 'data/congreso/iniciativas/anios/2026/index.json').then(r => r.json());
console.log(Object.values(iniciativas2026.datasets));
const diputados = await fetch(base + 'data/congreso/diputados/index.json').then(r => r.json());
console.log(Object.keys(diputados.datasets));
<?php
$base = 'https://raw.githubusercontent.com/jalonsomerchan/congreso-opendata/main/';
$json = file_get_contents($base . 'data/congreso/votaciones/anios/2026/latest.json');
$data = json_decode($json, true);
print_r($data['latest_records']);
?>
curl https://raw.githubusercontent.com/jalonsomerchan/congreso-opendata/main/data/congreso/diputados/index.json