Saltar al contenido

DATOS ABIERTOS

Datos abiertos de legislación española.

Para desarrolladores e investigadores. Sin límites, sin registro.

PARA LLMs Y HERRAMIENTAS LEGALTECH

Integración con modelos de lenguaje

La legislación consolidada española está disponible en formato optimizado para LLMs siguiendo la convención llms.txt. Estos archivos permiten que ChatGPT, Claude, Perplexity y otras herramientas citen artículos concretos con sus identificadores oficiales.

Descripción concisa del proyecto, páginas principales y endpoints de la API. Ideal como contexto inicial para cualquier LLM. Se regenera en cada build.

llms-full.txtVer archivo →

Documentación extendida con referencia completa de la API, cobertura por jurisdicción y rangos normativos. Regenerado en cada build con datos reales.

EJEMPLO DE PROMPTPara que cualquier LLM cite leyes españolas con precisión:

Lee https://leyabierta.es/llms-full.txt y responde citando los identificadores BOE-A-...

Sustituye los puntos suspensivos por tu pregunta legal concreta. El modelo tendrá contexto sobre cobertura, rangos y formato de identificadores.

FORMATO DEL ARCHIVO

  • Estructura Markdown siguiendo la especificación llms.txt
  • Cobertura: más de 12.000 leyes consolidadas, 18 jurisdicciones
  • Actualización: se regenera en cada despliegue del sitio (normalmente a diario)
  • Codificación: UTF-8, sin BOM

REPOSITORIO GIT

Cada ley es un archivo Markdown. Cada reforma es un commit.

El repositorio leyes contiene toda la legislación española consolidada como archivos Markdown con historial Git. Cada reforma legislativa corresponde a un commit con fecha oficial del BOE comoGIT_AUTHOR_DATE. Clona el repositorio y trabaja localmente sin depender de ninguna API.

Clonar el repositorio

git clone https://github.com/leyabierta/leyes.git

Leer una ley

cat es/BOE-A-1978-31229.md

Ver el historial de reformas de una ley

git log --oneline es/BOE-A-1978-31229.md

Ver el texto de una ley en un commit concreto

git show <sha> es/BOE-A-1978-31229.md

Estructura de carpetas: es/ para legislación estatal, es-ct/, es-an/,es-pv/... para comunidades autónomas. Sigue la convención ELI (European Legislation Identifier).

Ver repositorio en GitHub →

API REST

Acceso programático a toda la legislación

API REST pública sobre toda la legislación española consolidada. Sin autenticación, sin clave de API. Endpoint base:https://api.leyabierta.es/v1 — especificación completa enopenapi.jsony documentación interactiva enSwagger.

Buscar y listar leyes

curl 'https://api.leyabierta.es/v1/laws?q=contrato+trabajo&limit=10'

Parámetros: q (texto),rank (ley, real_decreto…),jurisdiction (es, es-ct…),status (vigente, derogada),limit, offset.

Obtener una ley completa

curl 'https://api.leyabierta.es/v1/laws/BOE-A-1978-31229'

Devuelve metadatos completos, artículos y lista de reformas.

Comparar dos versiones de una ley

curl 'https://api.leyabierta.es/v1/laws/BOE-A-1978-31229/diff?from=2010-01-01&to=2024-01-01'

Diff unificado entre dos fechas. Útil para detectar qué artículos cambiaron en un período concreto.

Últimas reformas con resúmenes

curl 'https://api.leyabierta.es/v1/changelog?jurisdiccion=es&limit=20'

Reformas recientes con resúmenes generados por IA. Filtra por jurisdicción con jurisdiccion=es-ct y por período conweeks=N (hasta 12). Pagina conoffset mientrashas_more sea true.

Historial de reformas de una ley

curl 'https://api.leyabierta.es/v1/laws/BOE-A-1978-31229/history'

Línea temporal de reformas de una ley, con los títulos de los artículos afectados en cada una.

Texto de una ley en Markdown (negociación de contenido)

curl -H 'Accept: text/markdown' 'https://leyabierta.es/leyes/BOE-A-1978-31229/'

Cualquier ficha de ley (/leyes/:id/) responde con Markdown limpio si envías esa cabecera, en vez del HTML de la página — pensado para que un agente cite el resumen sin parsear el DOM.

Preguntar en lenguaje natural (RAG)

curl -X POST 'https://api.leyabierta.es/v1/ask' \
  -H 'Content-Type: application/json' \
  -d '{"question":"¿Cuántos días de vacaciones me corresponden?"}'

Respuesta en lenguaje llano fundamentada en la legislación vigente, con citas verificables a artículos concretos ([BOE-A-XXXX-XXXX, Artículo N]). Sujeto a la cuota de preguntas — ver abajo. También disponible en streaming (POST /v1/ask/stream, Server-Sent Events).

Todos los endpoints devuelven JSON (los feeds, application/xml). Sin autenticación. Límites de peticiones por IP y minuto:60 en general,30 en búsqueda (/v1/laws?q=),20 en /v1/ask y/v1/ask/stream. Cada respuesta incluye las cabecerasRateLimit / RateLimit-Policy(borrador IETF) y, por compatibilidad, X-RateLimit-Limit/Remaining/Reset. Al superarlos, 429 con Retry-After.

/v1/ask y /v1/ask/streamtienen además una cuota de preguntas por IP (cada pregunta consume crédito de IA): 2 por minuto y 10 por día, con un tope global de 200/día para todo el sitio. Al superarla, 429 con{error, reason, retryAfterSeconds, remainingToday, limitPerDay}.

Los errores siempre son JSON estructurado:{"error": "...", "code": "...", "hint": "..."}con el código HTTP correspondiente — nunca texto plano ni un cuerpo vacío.

VERSIONADO

Compatibilidad y política de deprecación

La API se versiona en la URL (/v1). Un cambio aditivo y compatible (nuevo endpoint, nuevo campo opcional) se publica sin aviso previo. Un cambio incompatible se serviría en paralelo como/v2, o la ruta afectada de/v1 se marcaría obsoleta primero.

Una ruta obsoleta se anuncia con al menos 90 días de antelación enGitHub Releasesy Discussions, y durante ese plazo sus respuestas llevan las cabecerasDeprecation: true (RFC 8594) ySunset: <fecha> (RFC 9745) con la fecha de retirada. Hoy no hay ninguna ruta obsoleta.

RSS FEEDS

Suscripción a reformas legislativas

Feeds RSS para integrar las últimas reformas en tu flujo de trabajo.

Reformas recientes/feed.xml

Todas las reformas procesadas, ordenadas por fecha. Compatible con cualquier lector RSS.

https://leyabierta.es/feed.xml
Leyes ómnibus/feed-omnibus.xml

Feed específico para leyes que modifican múltiples normas simultáneamente, con desglose por temas.

https://leyabierta.es/feed-omnibus.xml

DESCARGAS MASIVAS

Corpus completo

Para análisis a gran escala o para construir tu propio índice.

JSONLPróximamente

Corpus completo en formato JSONL (una ley por línea), con metadatos y artículos. Pensado para ingesta en pipelines de datos o entrenamiento.

SQLitePróximamente

Snapshot de la base de datos SQLite con índice FTS5. Permite búsqueda local sin depender de la API.

Git (disponible hoy)

El repositorio leyes en GitHub contiene todo el corpus en archivos Markdown con historial completo. Es la forma más directa de obtener los datos hoy.

github.com/leyabierta/leyes →

CASOS DE USO

Ejemplos prácticos

Alertador de reformas en 20 líneas con jq

Obtén las últimas reformas de una jurisdicción y quédate con las que mencionan un tema en su título o resumen:

#!/bin/sh
# Últimas reformas laborales en España
curl -s 'https://api.leyabierta.es/v1/changelog?jurisdiccion=es&limit=50' \
  | jq -r '
      .reforms[]
      | select("\(.title) \(.headline // "") \(.summary // "")"
          | test("trabaj|empleo|laboral"; "i"))
      | "\(.date) \(.title)"
    '

Indexa el corpus en tu propio RAG

Ley Abierta incluye 483.983 embeddings de artículos vigentes (Gemini embedding, 3072 dimensiones). Si prefieres construir tu propio índice vectorial, clona el repositorio leyes y extrae los artículos del frontmatter YAML:

# Extraer todos los identificadores y títulos
find leyes/es -name '*.md' | head -100 | while read -r f; do
  python3 -c "
import re, sys
with open(sys.argv[1]) as fh:
    content = fh.read()
match = re.search(r'---\n(.*?)---', content, re.DOTALL)
if match:
    for line in match.group(1).splitlines():
        if line.startswith('titulo:') or line.startswith('identificador:'):
            print(line.split(':', 1)[1].strip())
" "$f"
done

La arquitectura RAG completa de Ley Abierta (hybrid BM25 + vector search + Cohere reranking) está documentada en elcódigo fuente.

Compara dos versiones con git diff

El historial Git permite comparar cualquier par de versiones de una ley. Cada commit corresponde a una reforma oficial con fecha exacta:

cd leyes

# Ver todos los commits de la Constitución
git log --oneline es/BOE-A-1978-31229.md

# Comparar dos versiones concretas (sustituye los SHAs)
git diff abc1234 def5678 -- es/BOE-A-1978-31229.md

# Versión de una ley en una fecha concreta
git log --before="2011-01-01" --format="%H" -1 es/BOE-A-1978-31229.md \
  | xargs -I{} git show {}:es/BOE-A-1978-31229.md

LICENCIA Y ATRIBUCIÓN

Uso libre, atribución obligatoria

Código fuente

El motor, la API y el sitio web están publicados bajo la licenciaAGPL-3.0. Si distribuyes una versión modificada, debes publicar el código fuente.

Ver código en GitHub →

Contenido legislativo

La legislación española es de dominio público. Puedes usarla, redistribuirla y adaptarla sin restricciones de copyright.

Atribución requerida por la fuente oficial: