Empezar en 30 segundos
Copia cualquiera de estos comandos. No necesitas clave de API.
1. Buscar una empresa
curl "https://openborme.es/api/v1/search?q=mercadona&limit=5"
Copiar
2. Obtener ficha completa de empresa
curl "https://openborme.es/api/v1/company/mercadona-sa-a46103834"
Copiar
3. Estado del sistema
curl "https://openborme.es/api/v1/health"
Copiar
Rate limiting
El servidor permite 60 peticiones por minuto por IP y rafagas de hasta 10 req/s. Las respuestas incluyen las siguientes cabeceras:
Cabecera Descripcion
X-RateLimit-LimitLimite maximo de peticiones por ventana (60).
X-RateLimit-RemainingPeticiones restantes en la ventana actual.
X-RateLimit-ResetTimestamp Unix en que se reinicia el contador.
Retry-AfterSegundos a esperar (solo en respuestas 429).
Para cargas masivas usa los datasets descargables en lugar de recorrer la API en bucle.
Errores
Codigo Significado Causa habitual
200 OKExito Peticion correcta con resultados.
400 Bad RequestParametro invalido Falta q, formato de fecha incorrecto, etc.
404 Not FoundRecurso inexistente Slug de empresa o persona desconocido.
429 Too Many RequestsRate limit superado Mas de 60 req/min desde la misma IP.
500 Internal Server ErrorError interno Artefacto corrupto o fallo de proceso.
Ejemplo de respuesta de error:
{
"error" : "not_found" ,
"message" : "Company slug not found" ,
"status" : 404
}
Copiar
Bulk downloads
Si necesitas miles de registros, descarga los datasets completos desde /descargas en lugar de llamar la API en bucle. Estan disponibles:
Indice de empresas en JSON (comprimido .gz)
Indice de personas en JSON
Dataset completo de eventos en CSV por ano
Snapshots mensuales de cargos vigentes
Usa la API para consultas puntuales y los datasets para analisis masivo, ETL o entrenamiento de modelos.
GET
Busqueda de empresas /api/v1/search
Busca empresas (y opcionalmente personas) por nombre o CIF usando un indice por prefijos. Devuelve resultados ordenados por relevancia.
Parametros Nombre Tipo Requerido Default Descripcion qstringsi — Texto de busqueda. Minimo 2 caracteres. limitintno 20Resultados por pagina (1-100). offsetintno 0Desplazamiento para paginacion. include_persons0|1no 0Si es 1, incluye personas en la respuesta.
Respuesta Campo Tipo Descripcion querystringTexto de busqueda utilizado. countintTotal de empresas encontradas. itemsarrayLista de empresas: {name, cif, slug, status}. personsarrayLista de personas (solo si include_persons=1). persons_countintTotal de personas encontradas (solo si include_persons=1).
curl Python JavaScript
curl "https://openborme.es/api/v1/search?q=inditex&limit=5"Copiar import requests
r = requests.get("https://openborme.es/api/v1/search", params={"q":"inditex","limit":5})
print(r.json())Copiar const res = await fetch("https://openborme.es/api/v1/search?q=inditex&limit=5");
const data = await res.json();
console.log(data.items);Copiar
GET
Ficha completa de empresa /api/v1/company/{slug}
Devuelve el informe completo de una empresa: datos registrales, KPIs, timeline de actividad, cargos y lista de actos.
Parametros Nombre Tipo Requerido Default Descripcion slugstringsi — Identificador slug de la empresa (nombre-cif). Ej: inditex-sa-a15075062.
Respuesta Campo Tipo Descripcion company.namestringNombre oficial. company.cifstringCIF/NIF registral. company.statusstringEstado actual: ACTIVA, EXTINGUIDA, DISOLUCION, etc. company.company_typestringTipo societario (SA, SL, etc.). company.aliasesarrayNombres anteriores o variaciones. company.addressstringDomicilio social. company.capitalstringCapital social declarado. company.websitestringSitio web si consta en BORME. company.workersintNum. de trabajadores si consta. company.date_creationstringFecha de constitucion. kpis.acts_countintTotal de actos registrados. kpis.first_seenstringPrimera fecha en el sistema. kpis.last_seenstringUltima fecha en el sistema. timelinearrayArray {period, count} mensual. top_event_typesarrayTipos de acto mas frecuentes. top_provincesarrayProvincias de actividad. eventsarrayActos recientes (max 50 por defecto). officers.currentarrayCargos vigentes. officers.historicalarrayCargos anteriores. summary_textstringResumen en lenguaje natural.
curl Python JavaScript
curl "https://openborme.es/api/v1/company/inditex-sa-a15075062"Copiar import requests
slug = "inditex-sa-a15075062"
r = requests.get(f"https://openborme.es/api/v1/company/{slug}")
data = r.json()
print(data["kpis"]["acts_count"])Copiar const slug = "inditex-sa-a15075062";
const res = await fetch(`https://openborme.es/api/v1/company/${slug}`);
const { company, kpis } = await res.json();
console.log(company.name, kpis.last_seen);Copiar
GET
Eventos paginados de empresa /api/v1/company/{slug}/events
Devuelve los actos registrales de una empresa para un ano concreto, paginados para respuestas ligeras.
Parametros Nombre Tipo Requerido Default Descripcion slugstringsi — Slug de la empresa. yearintno — Ano a filtrar (YYYY). Sin valor, devuelve todos. pageintno 1Numero de pagina (base 1). page_sizeintno 50Resultados por pagina.
Respuesta Campo Tipo Descripcion slugstringSlug de la empresa. yearintAno filtrado. pageintPagina actual. page_sizeintResultados por pagina. totalintTotal de eventos para el ano/filtro. eventsarrayArray de actos: {id, date, type, province, description}.
curl Python JavaScript
curl "https://openborme.es/api/v1/company/inditex-sa-a15075062/events?year=2025&page=1&page_size=20"Copiar import requests
r = requests.get("https://openborme.es/api/v1/company/inditex-sa-a15075062/events",
params={"year":2025,"page":1,"page_size":20})
print(r.json()["total"])Copiar const res = await fetch(
"https://openborme.es/api/v1/company/inditex-sa-a15075062/events?year=2025&page=1"
);
const { events, total } = await res.json();Copiar
GET
Cargos de empresa /api/v1/company/{slug}/officers
Devuelve administradores, apoderados y otros cargos, separados en vigentes e historicos.
Parametros Nombre Tipo Requerido Default Descripcion slugstringsi — Slug de la empresa.
Respuesta Campo Tipo Descripcion slugstringSlug de la empresa. officers.currentarrayCargos vigentes: {name, role, person_slug, date_from}. officers.historicalarrayCargos anteriores: {name, role, person_slug, date_from, date_to}.
curl Python JavaScript
curl "https://openborme.es/api/v1/company/inditex-sa-a15075062/officers"Copiar import requests
r = requests.get("https://openborme.es/api/v1/company/inditex-sa-a15075062/officers")
for c in r.json()["officers"]["current"]:
print(c["name"], c["role"])Copiar const res = await fetch("https://openborme.es/api/v1/company/inditex-sa-a15075062/officers");
const { officers } = await res.json();
officers.current.forEach(c => console.log(c.name, c.role));Copiar
GET
Exportar empresa (JSON adjunto) /api/v1/company/{slug}/export
Devuelve el informe completo como fichero descargable con Content-Disposition: attachment.
Parametros Nombre Tipo Requerido Default Descripcion slugstringsi — Slug de la empresa. formatstringno jsonFormato de exportacion (actualmente solo json).
Respuesta Campo Tipo Descripcion —application/jsonMismo esquema que /company/{slug} pero con cabecera de descarga.
curl Python JavaScript
curl -O -J "https://openborme.es/api/v1/company/inditex-sa-a15075062/export?format=json"Copiar import requests
r = requests.get("https://openborme.es/api/v1/company/inditex-sa-a15075062/export?format=json")
with open("informe.json","wb") as f:
f.write(r.content)Copiar const res = await fetch("https://openborme.es/api/v1/company/inditex-sa-a15075062/export?format=json");
const blob = await res.blob();
const url = URL.createObjectURL(blob);
// asignar a un <a download="informe.json">Copiar
GET
Busqueda de personas /api/v1/person/search
Busca personas fisicas por nombre en el indice de cargos del BORME.
Parametros Nombre Tipo Requerido Default Descripcion qstringsi — Nombre (o fragmento) a buscar. Minimo 3 caracteres. limitintno 20Resultados maximos (1-100).
Respuesta Campo Tipo Descripcion querystringTexto buscado. countintTotal de coincidencias. itemsarrayLista: {name, slug, companies_count, active_positions_count}.
curl Python JavaScript
curl "https://openborme.es/api/v1/person/search?q=amancio+ortega&limit=5"Copiar import requests
r = requests.get("https://openborme.es/api/v1/person/search", params={"q":"amancio ortega"})
print(r.json()["items"])Copiar const res = await fetch("https://openborme.es/api/v1/person/search?q=amancio%20ortega");
const { items } = await res.json();Copiar
GET
Ficha de persona /api/v1/person/{slug}
Devuelve el perfil completo de una persona: cargos activos, historicos y empresas vinculadas.
Parametros Nombre Tipo Requerido Default Descripcion slugstringsi — Slug normalizado de la persona.
Respuesta Campo Tipo Descripcion slugstringSlug de la persona. namestringNombre completo. first_seenstringPrimera aparicion en BORME. last_seenstringUltima aparicion en BORME. companies_countintTotal de empresas en las que ha tenido cargo. active_positionsarrayCargos vigentes: {company_name, slug, role, date_from}. inactive_positionsarrayCargos anteriores: {company_name, slug, role, date_from, date_to}.
curl Python JavaScript
curl "https://openborme.es/api/v1/person/amancio-ortega-gaona"Copiar import requests
r = requests.get("https://openborme.es/api/v1/person/amancio-ortega-gaona")
p = r.json()
print(p["name"], "—", p["companies_count"], "empresas")Copiar const res = await fetch("https://openborme.es/api/v1/person/amancio-ortega-gaona");
const person = await res.json();
console.log(person.active_positions);Copiar
GET
Sumario diario BORME /api/v1/daily/{YYYY-MM-DD}
Devuelve todos los actos publicados en el BORME para una fecha, agrupados por seccion y provincia. Alias: /api/v1/summary/date/{YYYY-MM-DD}.
Parametros Nombre Tipo Requerido Default Descripcion YYYY-MM-DDstringsi — Fecha en formato ISO 8601. Ej: 2026-04-17.
Respuesta Campo Tipo Descripcion datestringFecha consultada. sectionsobjectObjeto con secciones BORME (1=SA/SL, 2=otros, 3=concursal). Cada seccion es un objeto provincia → [{id, company, type, slug}].
curl Python JavaScript
curl "https://openborme.es/api/v1/daily/2026-04-17"Copiar import requests
r = requests.get("https://openborme.es/api/v1/daily/2026-04-17")
data = r.json()
for prov, actos in data["sections"]["1"].items():
print(prov, len(actos), "actos")Copiar const res = await fetch("https://openborme.es/api/v1/daily/2026-04-17");
const { date, sections } = await res.json();
const seccion1 = sections["1"];
console.log(Object.keys(seccion1)); // provinciasCopiar
GET
Health check /api/v1/health
Devuelve el estado operativo del sistema, la edad de los artefactos y metricas de volumen.
Parametros Nombre Tipo Requerido Default Descripcion
Respuesta Campo Tipo Descripcion statusstringok o degraded. servicestringNombre del servicio. versionstringVersion de la API. artifacts_age_hoursfloatHoras desde la ultima actualizacion de artefactos. artifacts_last_modifiedstringFecha ISO del ultimo artefacto. latest_borme_processedstringUltima fecha de BORME procesada. companies_indexed_approxintEmpresas indexadas aproximadas. total_persons_approxintPersonas indexadas aproximadas. total_events_approxintEventos totales aproximados. csv_size_mbfloatTamano del CSV principal en MB. timestampstringFecha/hora de la respuesta en ISO 8601.
curl Python JavaScript
curl "https://openborme.es/api/v1/health"Copiar import requests
r = requests.get("https://openborme.es/api/v1/health")
h = r.json()
print(h["status"], "—", h["companies_indexed_approx"], "empresas")Copiar const res = await fetch("https://openborme.es/api/v1/health");
const health = await res.json();
console.log(health.status, health.latest_borme_processed);Copiar
GET
Export de eventos en CSV /api/v1/export/events
Streaming CSV de todos los eventos, opcionalmente filtrado por ano. Util para analisis de datos y ETL.
Parametros Nombre Tipo Requerido Default Descripcion yearintno — Ano a filtrar (YYYY). Sin valor, devuelve todos. formatstringno csvSolo csv por ahora.
Respuesta Campo Tipo Descripcion —text/csvFichero CSV con cabecera: id, date, company_slug, company_name, type, province, description.
curl Python JavaScript
curl -O "https://openborme.es/api/v1/export/events?year=2025&format=csv"Copiar import requests
r = requests.get("https://openborme.es/api/v1/export/events", params={"year":2025,"format":"csv"}, stream=True)
with open("eventos_2025.csv","wb") as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)Copiar const res = await fetch("https://openborme.es/api/v1/export/events?year=2025&format=csv");
const text = await res.text();
// parsear con PapaParse u otro parser CSVCopiar
GET
Export CSV directo /export
Endpoint legado de exportacion CSV. Acepta empresa, persona o busqueda libre.
Parametros Nombre Tipo Requerido Default Descripcion formatstringsi csvDebe ser csv. empresastringno — Slug de empresa. personastringno — Slug de persona. qstringno — Texto de busqueda para exportar resultados.
Respuesta Campo Tipo Descripcion —text/csvCSV de los actos de la empresa/persona o resultados de busqueda.
curl Python JavaScript
# Por empresa
curl -O "https://openborme.es/export?format=csv&empresa=inditex-sa-a15075062"
# Por persona
curl -O "https://openborme.es/export?format=csv&persona=amancio-ortega-gaona"
# Por busqueda
curl -O "https://openborme.es/export?format=csv&q=mercadona"Copiar import requests
r = requests.get("https://openborme.es/export",
params={"format":"csv","empresa":"inditex-sa-a15075062"})
with open("empresa.csv","wb") as f:
f.write(r.content)Copiar const res = await fetch("https://openborme.es/export?format=csv&empresa=inditex-sa-a15075062");
const blob = await res.blob();
const url = URL.createObjectURL(blob);Copiar
Changelog
Version Fecha Cambios
v1.0
2026-04-17
Release inicial. Endpoints de busqueda, ficha empresa/persona, sumario diario, exportacion CSV, health check y documentacion publica.