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. Busca la empresa
GET /v1/dev/empresas?q=nombredevuelve las coincidencias; puedes acotar conprovinciaycnae.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. 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. 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. Elige la regla
GET /v1/dev/plazos/reglas?orden=civillista las reglas declaradas de un orden (civil, penal, social o contencioso). Usa una marcada como verificada.2. Calcula
POST /v1/dev/plazos/vencimientoconorden,tipo(la regla) ydiesAQuo(el día de partida, AAAA-MM-DD).3. Lee el resultado
Devuelve
fechaLimite, la de gracia si procede, la traza del cómputo, el fundamento legal y el calendario usado.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. 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. 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. Mira todas las redacciones
GET /v1/dev/biblioteca/versiones?articulo=ET+59devuelve cada versión con su vigencia y su fuente.4. Compara con hoy
GET /v1/dev/biblioteca/ley-en-fechaconfechaHechosyfechaReferenciada 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. Comprueba tu saldo
GET /v1/dev/saldo. Con la prueba agotada necesitas saldo disponible para el peor caso.2. Pregunta
POST /v1/dev/asistenteconpregunta(3 a 2.000 caracteres), y opcionalmentefecha,ordenymaxCosteCentimos. Sólo responde en modo rápido.3. Lee las fuentes y la verificación
Cada afirmación va con su norma, artículo, versión y
urlOficial;verificacionmarca cada cita en verde, ámbar o rojo. Si hay rojas, no la uses sin revisarla.4. Respeta el estado
La respuesta nace
propuestoy lleva un aviso: muéstralo, y que la valide un abogado antes de usarla.5. Mira lo cobrado
facturaciony las cabecerasX-Jurilia-*dicen cuánto costó y cuánto saldo queda.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. Elige los archivos
Hasta 5 por pregunta: PDF, Word moderno (.docx), JPEG o PNG. Se comprueba el contenido real, no la extensión.
2. Súbelos en multipart
Campos
preguntayficheros[](repítelo por cada archivo); opcionalesfecha,orden,maxCosteCentimosyocultar(nombres que quieres tapar, uno por campo).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
ocultarcon el nombre completo.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. Mira lo cobrado
facturaciony las cabecerasX-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ímite | Valor |
|---|---|
| Tamaño de cada archivo | 10 MiB |
| Tamaño de toda la petición | 20 MiB |
| Archivos por pregunta | 5 |
| Páginas por PDF | 50 |
| Páginas por pregunta (todos los archivos) | 100 |
| Páginas con OCR (escaneadas o fotos) por pregunta | 20 |
| Tiempo máximo del OCR | 90 s |
| Texto que se envía al modelo | 120.000 caracteres (el resto se corta por el final y se avisa) |
| Error | Cuándo | Qué hacer |
|---|---|---|
413 adjunto_demasiado_grande | Pasas de algún límite de la tabla. | Manda menos archivos o divide el documento. |
415 adjunto_tipo_no_admitido | Un archivo no es PDF, .docx, JPEG ni PNG (un .doc antiguo, una hoja de cálculo…). | Conviértelo a .docx o PDF. |
422 adjunto_ilegible | Dañado, con contraseña o sin texto aprovechable. | Otra foto, o un PDF que lleve el texto dentro. |
| 402 | Sin saldo para el peor caso de esta pregunta, o por encima de tu maxCosteCentimos. | Compra saldo o sube el tope. No se lee nada. |
| 503 | Sin 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.