En apertura por fases

Referencia

Referencia de la API

Cada endpoint, documentado entero: para qué sirve, sus parámetros, la forma exacta de la respuesta, los errores que puede dar y un ejemplo en curl, Python y JavaScript.

Autenticación

Todas las llamadas necesitan la clave de API en la cabecera Authorization, como bearer. No hay ningún otro método de autenticación, y nunca va en la URL ni en el cuerpo.

Authorization: Bearer iuris_sk_…

Dirección base

Mientras no exista un punto de conexión propio para la API (api.jurilia.com, todavía sin abrir), la plataforma vive en la misma dirección que el resto de la aplicación. Todas las rutas de este documento son relativas a ella:

https://app.jurilia.com/v1

Restricción por IP/CIDR

Cada clave puede llevar, desde Configuración › API, una lista blanca de IPs o redes (CIDR, IPv4 o IPv6). Vacía —lo normal— significa sin restricción. Con la lista puesta, una llamada desde fuera de ella da 403 aunque la clave sea válida: ver Errores y límites.

Límite de peticiones

120 llamadas por minuto, por clave. Toda respuesta lleva las cabeceras `X-RateLimit-Limit`, `X-RateLimit-Remaining` y `X-RateLimit-Reset`: ver Errores y límites para el detalle.

Antes de los ejemplos: un ayudante en tres líneas

Cada endpoint de abajo muestra su `curl` completo, y además una llamada a este mismo ayudante en Python y en JavaScript, para no repetir la cabecera y la URL en cada ejemplo.

import requests

def dev_api(ruta, **parametros):
    r = requests.get(
        f"https://app.jurilia.com/v1/dev{ruta}",
        headers={"Authorization": "Bearer TU_CLAVE"},
        params=parametros,
    )
    r.raise_for_status()  # lanza si es 4xx/5xx — ver Errores y límites
    return r.json()
async function devApi(ruta, parametros = {}) {
  const url = new URL(`https://app.jurilia.com/v1/dev${ruta}`);
  for (const [clave, valor] of Object.entries(parametros)) {
    url.searchParams.set(clave, valor);
  }
  const r = await fetch(url, { headers: { Authorization: "Bearer TU_CLAVE" } });
  if (!r.ok) throw new Error(`${r.status}: ${(await r.json()).mensaje}`);
  return r.json();
}

El contrato entero, en una línea

Todo lo de esta página sale de un único OpenAPI 3.1 que la propia API genera y expone en tiempo real. Pégalo en editor.swagger.io, o impórtalo en Postman o Insomnia, para una vista interactiva con la que probar llamadas sin escribir código:

https://app.jurilia.com/v1/openapi.json

Los endpoints

Diez, hoy: el eco de comprobación y los datos públicos del BORME (art. 13 LPI) que ya usa la aplicación. Nada que cuelgue de un despacho —ni cartera, ni correo de novedades, ni vincular una parte a un expediente—: eso es terreno de la sesión del abogado, no de una clave de un tercero.

GET/v1/dev/ping

Comprobar la clave

Confirma que la clave es válida y devuelve el despacho al que pertenece. No lee ni expone ningún dato de negocio: ni expedientes, ni documentos, ni nada del art. 9 o el art. 10 RGPD. El primer paso de cualquier integración, antes de construir nada encima.

Parámetros

Ninguno.

Respuesta

{
  "ok": true,
  "despachoId": "9f2c1e40-2b3a-4d11-9c8a-1234567890ab",
  "ambitos": [],
  "ahora": "2026-10-01T09:00:00.000Z"
}

Puede dar también

401 (Falta la clave, o no existe, o ha sido revocada.) · 403 (La clave no admite llamadas desde esta IP.) · 429 (Demasiadas llamadas seguidas con esta clave.)

curl

curl https://app.jurilia.com/v1/dev/ping \
  -H "Authorization: Bearer TU_CLAVE"

Python

dev_api("/ping")

JavaScript

await devApi('/ping')
GET/v1/dev/empresas

Buscar empresas en el BORME

Entiende un CIF, una hoja registral («M 167931») o un nombre; menos de tres letras no busca. `provincia` y `cnae` filtran el resultado ya encontrado; `cnae` es la división (dos dígitos) del objeto social publicado, no el código completo del Registro.

Parámetros

  • qstringobligatorio— El CIF, la hoja o el nombre a buscar.
  • provinciastringopcional— Nombre exacto de la provincia.
  • cnaestringopcional— División CNAE, dos dígitos («62» = programación y consultoría informática).
  • limiteenteroopcional— Entre 1 y 100. Por defecto, 25.

Respuesta

{
  "tipo": "nombre",
  "sugerencia": null,
  "empresas": [
    {
      "id": "1234567",
      "denominacion": "ACME SOCIEDAD LIMITADA",
      "provincia": "Madrid",
      "hoja": "M 167931",
      "titular": "sociedad",
      "primeraPublicacion": "2010-03-15",
      "ultimaPublicacion": "2026-06-02",
      "concursalPublicadoEn": null,
      "disolucionPublicadaEn": null,
      "extincionPublicadaEn": null,
      "nombreQueCasa": null
    }
  ]
}

Puede dar también

401 (Falta la clave, o no existe, o ha sido revocada.) · 403 (La clave no admite llamadas desde esta IP.) · 429 (Demasiadas llamadas seguidas con esta clave.) · 400 (Un parámetro no tiene la forma pedida.)

curl

curl "https://app.jurilia.com/v1/dev/empresas?q=acme&provincia=Madrid" \
  -H "Authorization: Bearer TU_CLAVE"

Python

dev_api("/empresas", q="acme", provincia="Madrid")

JavaScript

await devApi('/empresas', { q: 'acme', provincia: 'Madrid' })
GET/v1/dev/empresas/{empresaId}

Ficha de una empresa

Lo compacto de la ficha: situación (activa, concurso, disuelta, extinguida, con su fecha), capital, cargos vigentes y la última inscripción. `empresaId` es el que devuelve el buscador.

Parámetros

  • empresaIdstringobligatorio— El identificador, en la ruta.
  • paginaenteroopcional— De la cronología de inscripciones.

Respuesta

{
  "id": "1234567",
  "denominacion": "ACME SOCIEDAD LIMITADA",
  "provincia": "Madrid",
  "hoja": "M 167931",
  "titular": "sociedad",
  "situacion": "activa",
  "situacionFecha": null,
  "constitucionFecha": "2010-03-15",
  "primeraPublicacion": "2010-03-15",
  "ultimaPublicacion": "2026-06-02",
  "capitalCentimos": 300000,
  "totalInscripciones": 14,
  "denominaciones": [],
  "cargosVigentes": [{ "cargo": "Administrador único", "nombre": "…" }],
  "ultimaInscripcion": {
    "fecha": "2026-06-02",
    "boletin": "BORME-A-2026-104-12",
    "urlPdf": "https://www.boe.es/borme/dias/2026/06/02/pdfs/…pdf",
    "actos": [{ "tipo": "cambio_de_administradores", "etiqueta": null }]
  }
}

Puede dar también

401 (Falta la clave, o no existe, o ha sido revocada.) · 403 (La clave no admite llamadas desde esta IP.) · 429 (Demasiadas llamadas seguidas con esta clave.) · 404 (No está en lo cargado del BORME.)

curl

curl https://app.jurilia.com/v1/dev/empresas/1234567 \
  -H "Authorization: Bearer TU_CLAVE"

Python

dev_api("/empresas/1234567")

JavaScript

await devApi('/empresas/1234567')
GET/v1/dev/personas

Buscar personas en el BORME por su nombre

Dato público del boletín. El BORME no publica el DNI: nombres iguales pueden ser personas distintas, y la respuesta lo dice (`homonimos: "posibles"`). Nunca una etiqueta sobre la persona: sólo el hecho publicado, con su cita.

Parámetros

  • qstringobligatorio— El nombre a buscar.

Respuesta

{
  "personas": [
    {
      "slug": "juan-perez-garcia",
      "nombre": "JUAN PÉREZ GARCÍA",
      "empresas": 2,
      "ultimaAparicion": "2026-05-10",
      "homonimos": "posibles"
    }
  ]
}

Puede dar también

401 (Falta la clave, o no existe, o ha sido revocada.) · 403 (La clave no admite llamadas desde esta IP.) · 429 (Demasiadas llamadas seguidas con esta clave.) · 400 (Un parámetro no tiene la forma pedida.)

curl

curl "https://app.jurilia.com/v1/dev/personas?q=juan+perez" \
  -H "Authorization: Bearer TU_CLAVE"

Python

dev_api("/personas", q="juan perez")

JavaScript

await devApi('/personas', { q: 'juan perez' })
GET/v1/dev/personas/{slug}

Ficha de una persona del BORME

Sus sociedades y las variantes con que ha aparecido su nombre. `slug` es el que devuelve el buscador de personas.

Parámetros

  • slugstringobligatorio— En la ruta.

Respuesta

{
  "slug": "juan-perez-garcia",
  "nombre": "JUAN PÉREZ GARCÍA",
  "variantes": ["JUAN PÉREZ GARCÍA"],
  "recortada": false,
  "homonimos": "posibles",
  "empresas": [{ "empresaId": "1234567", "denominacion": "ACME SOCIEDAD LIMITADA", "provincia": "Madrid" }]
}

Puede dar también

401 (Falta la clave, o no existe, o ha sido revocada.) · 403 (La clave no admite llamadas desde esta IP.) · 429 (Demasiadas llamadas seguidas con esta clave.) · 404 (No está en lo cargado del BORME.)

curl

curl https://app.jurilia.com/v1/dev/personas/juan-perez-garcia \
  -H "Authorization: Bearer TU_CLAVE"

Python

dev_api("/personas/juan-perez-garcia")

JavaScript

await devApi('/personas/juan-perez-garcia')
GET/v1/dev/provincias

Provincias con algún boletín del BORME cargado

Para el filtro `provincia` de `GET /v1/dev/empresas`. Sin parámetros.

Parámetros

Ninguno.

Respuesta

{
  "provincias": ["Álava", "Albacete", "Alicante", "…"]
}

Puede dar también

401 (Falta la clave, o no existe, o ha sido revocada.) · 403 (La clave no admite llamadas desde esta IP.) · 429 (Demasiadas llamadas seguidas con esta clave.)

curl

curl https://app.jurilia.com/v1/dev/provincias \
  -H "Authorization: Bearer TU_CLAVE"

Python

dev_api("/provincias")

JavaScript

await devApi('/provincias')
GET/v1/dev/boletines

Los días con BORME cargado de un mes

Del más reciente al más antiguo.

Parámetros

  • mesAAAA-MMobligatorio— El mes a consultar.

Respuesta

{
  "dias": [
    { "fecha": "2026-09-30", "numero": 184, "documentos": 52, "inscripciones": 1402 }
  ]
}

Puede dar también

401 (Falta la clave, o no existe, o ha sido revocada.) · 403 (La clave no admite llamadas desde esta IP.) · 429 (Demasiadas llamadas seguidas con esta clave.) · 400 (Un parámetro no tiene la forma pedida.)

curl

curl "https://app.jurilia.com/v1/dev/boletines?mes=2026-09" \
  -H "Authorization: Bearer TU_CLAVE"

Python

dev_api("/boletines", mes="2026-09")

JavaScript

await devApi('/boletines', { mes: '2026-09' })
GET/v1/dev/boletines/{fecha}

Las novedades publicadas en una fecha

Un día de BORME: sus boletines provinciales, con el PDF oficial de cada uno y cuántas inscripciones trae. 404 si ese día no se ha cargado —todavía, o nunca hubo boletín: fin de semana o festivo—.

Parámetros

  • fechaAAAA-MM-DDobligatorio— En la ruta.

Respuesta

{
  "fecha": "2026-09-30",
  "numero": 184,
  "documentos": 52,
  "inscripciones": 1402,
  "provincias": [
    {
      "identificador": "BORME-A-2026-184-28",
      "provincia": "Madrid",
      "urlPdf": "https://www.boe.es/borme/dias/2026/09/30/pdfs/…pdf",
      "anuncios": 311
    }
  ]
}

Puede dar también

401 (Falta la clave, o no existe, o ha sido revocada.) · 403 (La clave no admite llamadas desde esta IP.) · 429 (Demasiadas llamadas seguidas con esta clave.) · 404 (No está en lo cargado del BORME.)

curl

curl https://app.jurilia.com/v1/dev/boletines/2026-09-30 \
  -H "Authorization: Bearer TU_CLAVE"

Python

dev_api("/boletines/2026-09-30")

JavaScript

await devApi('/boletines/2026-09-30')
GET/v1/dev/estadisticas

Cuántos actos por tipo y cuántas inscripciones por provincia

El intervalo se acota en el servidor a 31 días; si se recorta, la respuesta lo dice (`recortado: true`) y cuenta desde `hasta` hacia atrás.

Parámetros

  • desdeAAAA-MM-DDobligatorio
  • hastaAAAA-MM-DDobligatorio
  • provinciastringopcional— Acota el recuento a una provincia.

Respuesta

{
  "desde": "2026-09-01",
  "hasta": "2026-09-30",
  "recortado": false,
  "provincia": null,
  "dias": 22,
  "inscripciones": 38420,
  "actos": 41106,
  "porTipo": [{ "tipo": "cambio_de_administradores", "actos": 9122 }],
  "porProvincia": [{ "provincia": "Madrid", "inscripciones": 7310 }]
}

Puede dar también

401 (Falta la clave, o no existe, o ha sido revocada.) · 403 (La clave no admite llamadas desde esta IP.) · 429 (Demasiadas llamadas seguidas con esta clave.) · 400 (Un parámetro no tiene la forma pedida.)

curl

curl "https://app.jurilia.com/v1/dev/estadisticas?desde=2026-09-01&hasta=2026-09-30" \
  -H "Authorization: Bearer TU_CLAVE"

Python

dev_api("/estadisticas", desde="2026-09-01", hasta="2026-09-30")

JavaScript

await devApi('/estadisticas', { desde: '2026-09-01', hasta: '2026-09-30' })
GET/v1/dev/estado

Hasta dónde está cargado el BORME

El último día con BORME cargado y cuántos días e inscripciones hay en total. Útil para saber si «no hay resultados» significa eso, o que el BORME lleva días sin actualizarse.

Parámetros

Ninguno.

Respuesta

{
  "ultimoDia": "2026-09-30",
  "diasCargados": 4215,
  "inscripciones": 9834201
}

Puede dar también

401 (Falta la clave, o no existe, o ha sido revocada.) · 403 (La clave no admite llamadas desde esta IP.) · 429 (Demasiadas llamadas seguidas con esta clave.)

curl

curl https://app.jurilia.com/v1/dev/estado \
  -H "Authorization: Bearer TU_CLAVE"

Python

dev_api("/estado")

JavaScript

await devApi('/estado')

Todavía no disponible

Construido por dentro de la aplicación, sin ruta pública todavía. Se abre por fases; esta página se actualiza cuando lo haga. Nada de un despacho (expedientes, escritos, clientes) entra nunca en esta API: es un catálogo sobre fuentes públicas y sobre el asistente que las lee.

API del asistente jurídico

Preguntas en castellano sobre los cuatro órdenes —civil, penal, social y contencioso-administrativo— con respuesta y cita verificada, o «no encontrado» si no hay fuente. Se abre después que el directorio BORME: esta página se actualiza en cuanto lo haga.