Guías

Guías por caso de uso

Recetas completas, de la primera llamada al resultado, con curl, Python y JavaScript.

Diligencia debida de una empresa

Objetivo: a partir de un nombre, saber quién es la empresa, qué situación tiene y quién figura en ella según el BORME. Cada llamada de esta guía es una consulta de pago de 1 céntimo (o una de la prueba).

  1. 1. Busca la empresa

    GET /v1/dev/empresas?q=nombre devuelve las coincidencias; puedes acotar con provincia y cnae.

  2. 2. Abre su ficha

    GET /v1/dev/empresas/{empresaId} trae denominación, situación, fecha de constitución, capital en céntimos, cargos vigentes y última inscripción.

  3. 3. Sigue a las personas

    Del cargo, GET /v1/dev/personas/{slug} lista las empresas donde aparece esa persona (puede haber homónimos: la ficha lo avisa).

  4. 4. Mira lo publicado un día

    GET /v1/dev/boletines/{fecha} da las novedades de esa fecha.

Buscar y abrir la ficha

curl

curl "https://app.jurilia.com/v1/dev/empresas?q=acme&limite=5" -H "Authorization: Bearer TU_CLAVE"
curl "https://app.jurilia.com/v1/dev/empresas/EMPRESA_ID" -H "Authorization: Bearer TU_CLAVE"

Python

import requests

h = {"Authorization": "Bearer TU_CLAVE"}
r = requests.get("https://app.jurilia.com/v1/dev/empresas", headers=h, params={"q": "acme", "limite": 5})
empresas = r.json()["empresas"]
ficha = requests.get(f"https://app.jurilia.com/v1/dev/empresas/{empresas[0]['id']}", headers=h).json()

JavaScript

const h = { Authorization: "Bearer TU_CLAVE" };
const b = await (await fetch("https://app.jurilia.com/v1/dev/empresas?q=acme&limite=5", { headers: h })).json();
const ficha = await (await fetch(`https://app.jurilia.com/v1/dev/empresas/${b.empresas[0].id}`, { headers: h })).json();

Qué dice y qué no dice el BORME

Son datos públicos y oficiales del Registro Mercantil publicados en el BORME, con enlace al boletín. La API no etiqueta ni valora a nadie: da el hecho objetivo y su fuente.

Calcular un plazo procesal

Objetivo: obtener la fecha de vencimiento de un plazo, con su fundamento. Es gratis y no guarda nada.

  1. 1. Elige la regla

    GET /v1/dev/plazos/reglas?orden=civil lista las reglas declaradas de un orden (civil, penal, social o contencioso). Usa una marcada como verificada.

  2. 2. Calcula

    POST /v1/dev/plazos/vencimiento con orden, tipo (la regla) y diesAQuo (el día de partida, AAAA-MM-DD).

  3. 3. Lee el resultado

    Devuelve fechaLimite, la de gracia si procede, la traza del cómputo, el fundamento legal y el calendario usado.

  4. 4. Si da 409

    Falta un dato que decide el calendario, o la regla no está verificada contra el BOE: la API no rellena huecos con valores por defecto. Añade el dato que pide o elige otra regla.

curl

curl "https://app.jurilia.com/v1/dev/plazos/reglas?orden=civil" -H "Authorization: Bearer TU_CLAVE"

curl -X POST https://app.jurilia.com/v1/dev/plazos/vencimiento \
  -H "Authorization: Bearer TU_CLAVE" -H "Content-Type: application/json" \
  -d '{"orden":"civil","tipo":"TIPO_DE_LA_REGLA","diesAQuo":"2026-03-02"}'

Python

import requests

h = {"Authorization": "Bearer TU_CLAVE"}
reglas = requests.get("https://app.jurilia.com/v1/dev/plazos/reglas", headers=h, params={"orden": "civil"}).json()["reglas"]
regla = next(r for r in reglas if r["verificado"])
r = requests.post("https://app.jurilia.com/v1/dev/plazos/vencimiento", headers=h,
                  json={"orden": "civil", "tipo": regla["tipo"], "diesAQuo": "2026-03-02"})
print(r.status_code, r.json())

JavaScript

const h = { Authorization: "Bearer TU_CLAVE", "Content-Type": "application/json" };
const { reglas } = await (await fetch("https://app.jurilia.com/v1/dev/plazos/reglas?orden=civil", { headers: h })).json();
const regla = reglas.find((r) => r.verificado);
const r = await fetch("https://app.jurilia.com/v1/dev/plazos/vencimiento", {
  method: "POST", headers: h,
  body: JSON.stringify({ orden: "civil", tipo: regla.tipo, diesAQuo: "2026-03-02" }),
});
console.log(r.status, await r.json());

Consultar un artículo en una fecha

Objetivo: el texto exacto de un artículo tal como estaba el día de los hechos. Es gratis.

  1. 1. Pide el artículo

    GET /v1/dev/biblioteca/articulo?cita=ET+59&fecha=2026-01-01. La cita se escribe como se cita de verdad: «art. 59.3 ET», «ET 59», «1902 CC».

  2. 2. Lee el desenlace

    Hay cuatro: encontrado, abreviatura desconocida, artículo que no está y artículo que no regía esa fecha. Todos viajan con 200; sólo una cita que no se entiende da 400.

  3. 3. Mira todas las redacciones

    GET /v1/dev/biblioteca/versiones?articulo=ET+59 devuelve cada versión con su vigencia y su fuente.

  4. 4. Compara con hoy

    GET /v1/dev/biblioteca/ley-en-fecha con fechaHechos y fechaReferencia da la redacción vigente en la fecha de los hechos y todas las posteriores.

curl

curl "https://app.jurilia.com/v1/dev/biblioteca/articulo?cita=ET+59&fecha=2026-01-01" -H "Authorization: Bearer TU_CLAVE"
curl "https://app.jurilia.com/v1/dev/biblioteca/ley-en-fecha?articulo=ET+59&fechaHechos=2020-01-01&fechaReferencia=2026-01-01" \
  -H "Authorization: Bearer TU_CLAVE"

Python

import requests

h = {"Authorization": "Bearer TU_CLAVE"}
a = requests.get("https://app.jurilia.com/v1/dev/biblioteca/articulo", headers=h,
                 params={"cita": "ET 59", "fecha": "2026-01-01"}).json()
print(a["desenlace"], a.get("urlOficial"))

JavaScript

const h = { Authorization: "Bearer TU_CLAVE" };
const a = await (await fetch("https://app.jurilia.com/v1/dev/biblioteca/articulo?cita=ET+59&fecha=2026-01-01", { headers: h })).json();
console.log(a.desenlace, a.urlOficial);

Preguntar al asistente con fuentes

Objetivo: una respuesta en castellano, citada y verificada. Cuesta el coste real × 5 (o una consulta de la prueba de las 100).

  1. 1. Comprueba tu saldo

    GET /v1/dev/saldo. Con la prueba agotada necesitas saldo disponible para el peor caso.

  2. 2. Pregunta

    POST /v1/dev/asistente con pregunta (3 a 2.000 caracteres), y opcionalmente fecha, orden y maxCosteCentimos. Sólo responde en modo rápido.

  3. 3. Lee las fuentes y la verificación

    Cada afirmación va con su norma, artículo, versión y urlOficial; verificacion marca cada cita en verde, ámbar o rojo. Si hay rojas, no la uses sin revisarla.

  4. 4. Respeta el estado

    La respuesta nace propuesto y lleva un aviso: muéstralo, y que la valide un abogado antes de usarla.

  5. 5. Mira lo cobrado

    facturacion y las cabeceras X-Jurilia-* dicen cuánto costó y cuánto saldo queda.

  6. 6. Si el desenlace es `sin_fuentes`

    La biblioteca no tiene nada que responda: no se contesta de memoria. Se cobra el mínimo.

curl

curl -X POST https://app.jurilia.com/v1/dev/asistente \
  -H "Authorization: Bearer TU_CLAVE" -H "Content-Type: application/json" \
  -d '{"pregunta":"¿Cuánto tiempo hay para reclamar tras un despido?","orden":"social","maxCosteCentimos":50}'

Python

import requests

r = requests.post("https://app.jurilia.com/v1/dev/asistente",
    headers={"Authorization": "Bearer TU_CLAVE"},
    json={"pregunta": "¿Cuánto tiempo hay para reclamar tras un despido?", "orden": "social"})
if r.status_code == 402:
    print("Sin saldo para el peor caso:", r.json()["mensaje"])
else:
    r.raise_for_status()
    d = r.json()
    print(d["texto"], d["facturacion"])

JavaScript

const r = await fetch("https://app.jurilia.com/v1/dev/asistente", {
  method: "POST",
  headers: { Authorization: "Bearer TU_CLAVE", "Content-Type": "application/json" },
  body: JSON.stringify({ pregunta: "¿Cuánto tiempo hay para reclamar tras un despido?", orden: "social" }),
});
const d = await r.json();
console.log(r.status, d.texto ?? d.mensaje, d.facturacion);

Preguntar sobre un documento

Objetivo: preguntar al asistente sobre un PDF, un Word o la foto de un documento, y recibir una respuesta citada con la ley de la biblioteca. Es el mismo POST /v1/dev/asistente, pero con el cuerpo en multipart/form-data. Cuesta el coste real × 5 (el texto del documento cuenta como entrada) o una consulta de la prueba de las 100.

Nada se guarda

El archivo, su texto y la respuesta ligada al documento se procesan en memoria y se descartan al responder: no se escriben en ninguna tabla, almacén ni registro. Lo único que queda de la llamada es lo de cualquier otra: el contador de uso de la clave y, si cobró, el importe en tu libro de saldo, sin ningún contenido.

  1. 1. Elige los archivos

    Hasta 5 por pregunta: PDF, Word moderno (.docx), JPEG o PNG. Se comprueba el contenido real, no la extensión.

  2. 2. Súbelos en multipart

    Campos pregunta y ficheros[] (repítelo por cada archivo); opcionales fecha, orden, maxCosteCentimos y ocultar (nombres que quieres tapar, uno por campo).

  3. 3. Dile qué nombres tapar

    El texto se seudonimiza antes de llegar al modelo (NIF, IBAN, teléfonos, correos y nombres con «D.», «doña», «contra»…). Un nombre suelto no tiene forma y no se reconoce solo: pásalo en ocultar con el nombre completo.

  4. 4. Lee la respuesta

    Igual que sin archivos, más documentos: cuántos ficheros y páginas se leyeron, cuántas con OCR, cuántos caracteres se enviaron y si hubo que recortar (recortado: true = la respuesta no cubre lo cortado).

  5. 5. Mira lo cobrado

    facturacion y las cabeceras X-Jurilia-*, como siempre. Si un archivo no se puede leer o el OCR no está disponible, no se cobra nada.

Subir un documento

curl

curl -X POST https://app.jurilia.com/v1/dev/asistente \
  -H "Authorization: Bearer TU_CLAVE" \
  -F "pregunta=¿Qué plazo hay para recurrir esta resolución?" \
  -F "orden=contencioso" \
  -F "ocultar=Ana Ruiz Sanz" \
  -F "ficheros[][email protected];type=application/pdf"

Python

import requests

with open("resolucion.pdf", "rb") as f:
    r = requests.post("https://app.jurilia.com/v1/dev/asistente",
        headers={"Authorization": "Bearer TU_CLAVE"},
        data={"pregunta": "¿Qué plazo hay para recurrir esta resolución?",
              "orden": "contencioso", "ocultar": ["Ana Ruiz Sanz"]},
        files=[("ficheros[]", ("resolucion.pdf", f, "application/pdf"))])
d = r.json()
print(r.status_code, d.get("texto") or d["mensaje"], d.get("documentos"), d.get("facturacion"))

JavaScript

import { openAsBlob } from "node:fs";

const form = new FormData();
form.append("pregunta", "¿Qué plazo hay para recurrir esta resolución?");
form.append("orden", "contencioso");
form.append("ocultar", "Ana Ruiz Sanz");
form.append("ficheros[]", await openAsBlob("resolucion.pdf"), "resolucion.pdf");
const r = await fetch("https://app.jurilia.com/v1/dev/asistente", {
  method: "POST",
  headers: { Authorization: "Bearer TU_CLAVE" }, // sin Content-Type: fetch pone el boundary
  body: form,
});
const d = await r.json();
console.log(r.status, d.texto ?? d.mensaje, d.documentos, d.facturacion);
LímiteValor
Tamaño de cada archivo10 MiB
Tamaño de toda la petición20 MiB
Archivos por pregunta5
Páginas por PDF50
Páginas por pregunta (todos los archivos)100
Páginas con OCR (escaneadas o fotos) por pregunta20
Tiempo máximo del OCR90 s
Texto que se envía al modelo120.000 caracteres (el resto se corta por el final y se avisa)
ErrorCuándoQué hacer
413 adjunto_demasiado_grandePasas de algún límite de la tabla.Manda menos archivos o divide el documento.
415 adjunto_tipo_no_admitidoUn archivo no es PDF, .docx, JPEG ni PNG (un .doc antiguo, una hoja de cálculo…).Conviértelo a .docx o PDF.
422 adjunto_ilegibleDañado, con contraseña o sin texto aprovechable.Otra foto, o un PDF que lleve el texto dentro.
402Sin saldo para el peor caso de esta pregunta, o por encima de tu maxCosteCentimos.Compra saldo o sube el tope. No se lee nada.
503Sin OCR disponible o más lento de lo permitido, o sin proveedor de IA acreditado para documentos.Reintenta más tarde. No se cobra.

Qué hace falta saber antes de enviar datos de personas

Un documento suele llevar datos personales de terceros. Lo seudonimizamos antes del modelo, pero seudonimizar no es anonimizar: un texto con detalles identificativos sigue siendo dato personal. Tú decides qué envías y con qué base legal. El tratamiento ocurre en la UE, con un proveedor acreditado y sin que se guarde el documento. Cuando un PDF escaneado de más de cuatro páginas se lee repartido, cada trozo viaja a nuestro servicio de OCR en la UE (Madrid), que lo lee en memoria y no guarda nada. La respuesta nace «propuesto» y no es asesoramiento hasta que la valide un abogado.