La API de Horvell. Tus expedientes, en tu sistema.
La API de Horvell permite consultar los expedientes y documentos de un despacho desde cualquier programa, y subir documentos a sus expedientes. Es una API REST en JSON con dos tipos de clave: la del despacho, con permisos por recurso, y la de cada cliente del despacho, de solo lectura y limitada a sus propios expedientes.
Dos tipos de acceso
Horvell emite dos tipos de clave. Las dos usan la misma API y las mismas llamadas, pero ven y pueden hacer cosas distintas. El prefijo de la clave te dice cuál tienes.
hv_tk_…hv_ck_…hv_tk_…hv_ck_…documentos:write: subir documentos.expedientes:read, documentos:read, documentos:write.expedientes:read y documentos:read.Con una clave de cliente, lo que no es de tu cliente no existe: pedir un expediente de otro devuelve el mismo 404 que uno inexistente, y los listados nunca lo incluyen.
Introducción
La API de Horvell da acceso a los expedientes y documentos de un despacho desde otro sistema: un ERP, un cuadro de mando, el programa de siniestros de una aseguradora o una automatización propia. Con una clave de despacho también se pueden subir documentos a un expediente.
- Es una API REST sobre HTTPS. Todo, peticiones y respuestas, va en JSON y en UTF-8.
- Las fechas van en UTC con formato RFC 3339:
2026-10-22T09:30:00.000Z. - Cada objeto lleva un
idcon prefijo de su tipo (exp_…,doc_…) que no cambia nunca. Úsalo para identificarlo en tu sistema. - Los nombres de campos y valores están en español, como en Horvell.
- Los errores siguen el estándar RFC 9457 y llevan un
codeestable para tu programa.
openapi.jsonPara asistentes de IAToda esta documentación en Markdown, para dársela a tu asistente.api.mdEn PostmanImport › Link y pega la URL del contrato. Crea la colección entera.Import › Link¿Buscas otra forma de conectar Horvell (Outlook, Holded, remesas SEPA, Kmaleon, Excel…)? Están todas en integraciones.
https://api.horvell.com/v1{
"type": "https://api.horvell.com/v1/docs#errores-no_encontrado",
"title": "No encontrado",
"status": 404,
"code": "no_encontrado",
"request_id": "req_q3Zl8vY1cN0kT5bW"
}Inicio rápido
- 01Consigue una clave
La crea un administrador del despacho. Para el propio despacho: Configuración › Integraciones › Claves de la API del despacho. Para un cliente: ficha del cliente › Acceso API. Se muestra una sola vez: guárdala al momento en un lugar seguro.
- 02Guárdala como variable de entorno
Nunca la escribas en el código ni la subas a un repositorio. En los ejemplos de esta página se lee de
HORVELL_API_KEY. - 03Haz tu primera llamada
Pide los dos primeros expedientes. Si recibes un objeto
list, ya estás dentro. Si recibes401, revisa la clave.
export HORVELL_API_KEY="hv_tk_TU_CLAVE"
curl "https://api.horvell.com/v1/expedientes?limit=2" \
-H "Authorization: Bearer $HORVELL_API_KEY"{
"object": "list",
"data": [
{ "object": "expediente", "id": "exp_6537a1b2c3d4e5f607182930", "numero": "EXP-2026-0142", … },
{ "object": "expediente", "id": "exp_6537a1b2c3d4e5f607182935", "numero": "EXP-2026-0143", … }
],
"has_more": true,
"next_cursor": "eyJmIjoiMjAyNi0xMC0yMlQwOTozMDowMC4wMDBaIiwiaSI6IjY1MzdhMWIyIn0.k4vQ2s"
}Autenticación
Cada petición lleva la clave en la cabecera Authorization, con el esquema Bearer:
- Sin clave, o con una clave revocada, caducada o mal copiada, la respuesta es
401 no_autenticado. - Una clave sin el permiso que pide la llamada recibe
403 permiso_insuficiente. - La clave solo sirve en la API. No da acceso a la aplicación de Horvell, y una sesión de la aplicación no sirve en la API.
- Si una clave se expone, pide al despacho que la revoque o la rote desde Horvell: deja de funcionar al instante.
- La clave nunca va en la URL. Solo en la cabecera.
Authorization: Bearer hv_tk_TU_CLAVESincronizar con tu sistema
La forma recomendada de tener una copia al día es una sincronización periódica (cada 15 minutos, cada hora, cada noche) en dos fases: primero lo que se ha borrado y después lo que ha cambiado.
GET /v1/expedientestodas las páginas · apunta la horaGET /v1/eliminadosborra lo que devuelva?updated_since=…guarda por idinicio − 1 minpara la próxima vez- 01Primera carga
Recorre
GET /v1/expedientessiguiendonext_cursorhasta quehas_moreseafalse, y los documentos de cada expediente. Antes de empezar, apunta la hora. - 02Eliminados
En cada sincronización siguiente, pide
GET /v1/eliminadosconupdated_since= la hora que apuntaste, y borra de tu sistema lo que te devuelva. Borrar un expediente implica sus documentos. - 03Cambios
Después pide
GET /v1/expedientes?updated_since=…y guarda lo que te devuelva, identificando cada objeto por suid. Apunta la nueva hora para la próxima vez.
Los eliminados se guardan 180 días. Si tu sistema pasa más tiempo sin sincronizar, recibirás 410 sincronizacion_caducada: vuelve a la primera carga y borra lo que ya no aparezca.
const API = "https://api.horvell.com/v1";
const cabeceras = { Authorization: `Bearer ${process.env.HORVELL_API_KEY}` };
const esperar = (s) => new Promise((ok) => setTimeout(ok, s * 1000));
// Recorre todas las páginas de un listado.
async function* recorrer(ruta, filtros = {}) {
let cursor = null;
do {
const url = new URL(API + ruta);
for (const [k, v] of Object.entries({ ...filtros, limit: 100 })) url.searchParams.set(k, v);
if (cursor) url.searchParams.set("cursor", cursor);
const r = await fetch(url, { headers: cabeceras });
if (r.status === 429) {
await esperar(Number(r.headers.get("Retry-After") ?? 1));
continue; // repite la misma página
}
if (!r.ok) throw new Error((await r.json()).code);
const pagina = await r.json();
yield* pagina.data;
cursor = pagina.next_cursor;
} while (cursor);
}
// desde: inicio de la sincronización anterior (ISO) o null la primera vez.
export async function sincronizar(desde) {
const inicio = new Date(Date.now() - 60_000).toISOString(); // margen de 1 min
const filtros = desde ? { updated_since: desde } : {};
if (desde) {
for await (const e of recorrer("/eliminados", filtros)) {
if (e.tipo === "expediente") await miSistema.borrarExpediente(e.recurso);
else await miSistema.borrarDocumento(e.recurso);
}
}
for await (const expediente of recorrer("/expedientes", filtros)) {
await miSistema.guardarExpediente(expediente);
}
// Los documentos se piden por expediente (ver «Documentos nuevos»).
for (const id of await miSistema.expedientesAbiertos()) {
for await (const documento of recorrer(`/expedientes/${id}/documentos`, filtros)) {
await miSistema.guardarDocumento(documento);
}
}
return inicio; // guárdalo para la próxima vez
}Subir un documento
Solo claves de despacho
Tu clave de cliente es de solo lectura: no puede subir documentos. Esta guía es para la informática del despacho.
El archivo no pasa por la API: va directo al almacenamiento con un enlace firmado. Así se suben archivos grandes sin cortes. Solo claves de despacho con el permiso documentos:write.
- 01
POST /v1/expedientes/{id}/subidas← url_subida firmada - 02
PUT url_subidael archivo, sin Authorization - 03
POST /v1/subidas/{id}/completar← el Documento creado
- 01Iniciar
POST /v1/expedientes/{id}/subidascon el nombre, tipo, tamaño y categoría del archivo, y unaIdempotency-Keyúnica. Te devolvemosurl_subiday lascabecerasque debe llevar el envío. - 02Enviar el archivo
PUTdel archivo aurl_subida, con esas cabeceras y sinAuthorization. El enlace dura 15 minutos. - 03Completar
POST /v1/subidas/{id}/completar. Comprobamos que el archivo ha llegado y creamos el documento, que aparece al momento en Horvell.
Hasta 50 MB por archivo. Tienes 30 minutos desde el paso 1 para completar la subida. Formatos admitidos: application/pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.oasis.opendocument.text, application/vnd.oasis.opendocument.spreadsheet, application/rtf, application/vnd.ms-outlook, image/png, image/jpeg, image/heic, image/webp, message/rfc822, text/plain, text/csv, text/rtf, application/zip, image/tiff, application/vnd.ms-powerpoint, application/vnd.openxmlformats-officedocument.presentationml.presentation, application/vnd.oasis.opendocument.presentation, text/xml, application/pkcs7-signature, application/pkcs7-mime, application/xades+xml, audio/mpeg, audio/mp4, audio/wav, audio/ogg, audio/aac, video/mp4, video/quicktime, video/webm, video/x-msvideo.
import { readFile } from "node:fs/promises";
import { randomUUID } from "node:crypto";
const API = "https://api.horvell.com/v1";
const cabeceras = { Authorization: `Bearer ${process.env.HORVELL_API_KEY}` };
export async function subirDocumento(idExpediente, ruta, { categoria, nombre }) {
const archivo = await readFile(ruta);
// Guárdala junto al documento: si algo falla, reintenta con la misma.
const idempotencia = randomUUID();
// 1. Iniciar
const r1 = await fetch(`${API}/expedientes/${idExpediente}/subidas`, {
method: "POST",
headers: { ...cabeceras, "Content-Type": "application/json", "Idempotency-Key": idempotencia },
body: JSON.stringify({
nombre_archivo: ruta.split("/").pop(),
tipo_contenido: "application/pdf",
tamano: archivo.length,
categoria,
nombre,
}),
});
if (!r1.ok) throw new Error((await r1.json()).code);
const subida = await r1.json();
// 2. Enviar el archivo directo al almacenamiento (sin Authorization)
const r2 = await fetch(subida.url_subida, {
method: subida.metodo,
headers: subida.cabeceras,
body: archivo,
});
if (!r2.ok) throw new Error(`PUT ${r2.status}`);
// 3. Completar: crea el documento
const r3 = await fetch(`${API}/subidas/${subida.id}/completar`, {
method: "POST",
headers: cabeceras,
});
if (!r3.ok) throw new Error((await r3.json()).code);
return r3.json(); // el Documento
}Paginación
Los listados devuelven un objeto list con una página de resultados. Para la siguiente, repite la misma petición añadiendo cursor con el next_cursor que recibiste. Cuando has_more es false, has terminado.
limitva de 1 a 100 (25 por defecto). Para sincronizar, usa 100.- Pide todas las páginas con los mismos filtros. Si cambias un filtro a mitad, el cursor deja de valer (
400 cursor_invalido). - El cursor es opaco: no lo interpretes ni lo construyas, solo devuélvelo.
- El orden es estable (
actualizado_eny despuésid), así que no te saltarás elementos aunque cambien datos mientras recorres.
curl "https://api.horvell.com/v1/expedientes?limit=100&cursor=eyJmIjoiMjAyNi0xMC0yMlQwOTozMDowMC4wMDBaIiwiaSI6IjY1MzdhMWIyIn0.k4vQ2s" \
-H "Authorization: Bearer $HORVELL_API_KEY"Caché con ETag
El detalle de un expediente y el de un documento llevan una cabecera ETag. Guárdala con el objeto y envíala en If-None-Match la próxima vez que lo pidas: si no ha cambiado, la respuesta es 304 Not Modified, sin cuerpo.
Es más rápido, no gasta datos y sigue contando para el límite de peticiones.
curl -i "https://api.horvell.com/v1/expedientes/exp_6537a1b2c3d4e5f607182930" \
-H "Authorization: Bearer $HORVELL_API_KEY" \
-H 'If-None-Match: W/"1792661400000-3-1792574000000-1"'
# HTTP/2 304Límites de uso
| Límite | Valor |
|---|---|
| Clave de despacho | 600 peticiones por minuto |
| Clave de cliente | 120 peticiones por minuto |
| Por dirección IP | 1.200 peticiones por minuto |
| Subidas por despacho | 30 por minuto |
| Tamaño de archivo | 50 MB |
| Elementos por página | 100 |
Cada respuesta lleva RateLimit-Limit, RateLimit-Remaining y RateLimit-Reset (segundos hasta que se recupera el cupo). Si lo superas, recibirás 429 demasiadas_peticiones con Retry-After: espera esos segundos y repite.
HTTP/2 200
RateLimit-Limit: 600
RateLimit-Remaining: 557
RateLimit-Reset: 41Versiones y cambios
Esta es la v1 y va en la URL (/v1/…). Dentro de ella solo añadimos: campos nuevos, llamadas nuevas y valores nuevos en las enumeraciones. Nunca quitamos ni renombramos un campo, ni cambiamos su tipo, ni hacemos obligatorio algo que no lo era. Un cambio así sería una v2, y la v1 seguiría funcionando.
Expedientes
Los asuntos del despacho, con sus procedimientos, señalamientos e intervinientes.
Listar expedientes
expedientes:readDevuelve los expedientes a los que tiene acceso tu clave, de 25 en 25 por defecto. Es la llamada con la que empieza cualquier sincronización.
- Orden:
actualizado_enascendente, del más antiguo al más reciente. Así, si una sincronización se corta, puedes continuar desde el último que guardaste. - Una clave de cliente solo ve los expedientes de su cliente. No hace falta (ni se permite) filtrar por
cliente. - Los filtros de texto (
numero,referencia,referencia_externa,numero_procedimiento,nig) buscan el valor exacto, no por aproximación.referenciabusca en las tres referencias del cliente a la vez. - Un cambio en los señalamientos de un expediente también lo hace salir con
updated_since, aunque suactualizado_enno cambie.
Parámetros de consulta
limitenteroopcionalElementos por página, de 1 a 100.
mín. 1 · máx. 100 · por defecto 25
cursortextoopcionalnext_cursorde la página anterior.máx. 500 caracteres
updated_sincefechaopcionalRFC 3339. Inclusivo: devuelve lo modificado en o después de esta fecha.
numerotextoopcionalNúmero exacto del expediente.
máx. 80 caracteres
referencia_externatextoopcionalCódigo exacto del expediente en el sistema del que se importó.
máx. 200 caracteres
referenciatextoopcionalValor exacto de cualquiera de las tres referencias del cliente (
referencias).máx. 200 caracteres
numero_procedimientotextoopcionalNúmero de autos exacto de alguno de sus procedimientos, p. ej.
1234/2026.máx. 80 caracteres
nigtextoopcionalNIG exacto de alguno de sus procedimientos.
máx. 50 caracteres
estadolista de enumopcionalUno o varios estados separados por coma, p. ej.
en_curso,pendiente_cliente.nuevoNuevoRecién abierto; todavía no se ha empezado a trabajar.en_estudioEn estudioEl despacho está analizando el asunto antes de actuar.en_cursoEn cursoEn tramitación activa.pendiente_clientePendiente clienteEsperando algo del cliente: documentación, una decisión, una firma…pendiente_terceroPendiente terceroEsperando a un tercero: juzgado, notaría, registro, contraparte…en_pausaEn pausaParado de forma temporal por decisión del despacho o del cliente.cerradoCerradoTerminado. Se puede reabrir.archivadoArchivadoCerrado y archivado de forma definitiva.
clientetextoopcionalsolo despachoSolo claves de despacho: expedientes de ese cliente. Con una clave de cliente devuelve
400 parametro_no_permitido.formato cli_…
Respuestas
- 200Página de expedientes · lista de Expedientes
/v1/expedientesexport HORVELL_API_KEY="hv_tk_TU_CLAVE"
curl "https://api.horvell.com/v1/expedientes?updated_since=2026-10-22T00:00:00Z&estado=en_curso,pendiente_cliente&limit=100" \
-H "Authorization: Bearer $HORVELL_API_KEY"Página de expedientes
{
"object": "list",
"data": [
{
"object": "expediente",
"id": "exp_6537a1b2c3d4e5f607182930",
"numero": "EXP-2026-0142",
"titulo": "Reclamación de cantidad · Transportes del Turia",
"referencia_externa": "457906",
"referencias": {
"referencia_1": "PRE-2019-004512",
"referencia_2": "CART-2026-118",
"referencia_3": null
},
"tipo": "procesal_litigacion",
"estado": "en_curso",
"situacion_procesal": "Contestación a la demanda presentada",
"cuantia": {
"tipo": "determinada",
"importe": 18450.75
},
"etiquetas": [
"recobro",
"prioritario"
],
"cliente": {
"id": "cli_6537a1b2c3d4e5f607182933",
"nombre": "Aseguradora Ejemplo, S.A."
},
"responsable": {
"nombre": "Laura Martín"
},
"procedimientos": [
{
"organismo": "Juzgado de Primera Instancia",
"num_organismo": "4",
"poblacion": "Valencia",
"tipo_procedimiento": "Juicio verbal",
"numero_procedimiento": "1234/2026",
"nig": "4625042120260012345",
"fecha_alta": "2026-03-02T00:00:00.000Z"
}
],
"senalamientos": [
{
"tipo": "vista",
"estado": "senalado",
"titulo": "Vista del juicio verbal",
"fecha_inicio": "2026-11-18T09:30:00.000Z",
"fecha_fin": "2026-11-18T10:30:00.000Z",
"zona_horaria": "Europe/Madrid",
"ubicacion": "Ciudad de la Justicia, sala 12"
}
],
"intervinientes": [
{
"nombre": "Transportes Ficticios del Turia, S.L.",
"rol": "Demandado"
},
{
"nombre": "Ana Pérez Gil",
"rol": "Procuradora"
}
],
"creado_en": "2026-02-27T08:15:00.000Z",
"actualizado_en": "2026-10-22T09:30:00.000Z"
}
],
"has_more": true,
"next_cursor": "eyJmIjoiMjAyNi0xMC0yMlQwOTozMDowMC4wMDBaIiwiaSI6IjY1MzdhMWIyIn0.k4vQ2s"
}Detalle de un expediente
expedientes:readDevuelve un expediente con sus procedimientos, señalamientos e intervinientes.
- La respuesta lleva una cabecera
ETag. Si la envías enIf-None-Matchen la siguiente consulta y el expediente no ha cambiado, recibirás un304sin cuerpo: más rápido y no gasta datos. - Un expediente que no existe y uno que tu clave no puede ver devuelven el mismo
404.
Parámetros de ruta
idtextoobligatorioId del expediente (
exp_…).formato exp_…
Respuestas
- 200Expediente · Expediente
- 304Sin cambios desde el
ETagenviado enIf-None-Match
/v1/expedientes/{id}export HORVELL_API_KEY="hv_tk_TU_CLAVE"
curl "https://api.horvell.com/v1/expedientes/exp_6537a1b2c3d4e5f607182930" \
-H "Authorization: Bearer $HORVELL_API_KEY"Expediente
{
"object": "expediente",
"id": "exp_6537a1b2c3d4e5f607182930",
"numero": "EXP-2026-0142",
"titulo": "Reclamación de cantidad · Transportes del Turia",
"referencia_externa": "457906",
"referencias": {
"referencia_1": "PRE-2019-004512",
"referencia_2": "CART-2026-118",
"referencia_3": null
},
"tipo": "procesal_litigacion",
"estado": "en_curso",
"situacion_procesal": "Contestación a la demanda presentada",
"cuantia": {
"tipo": "determinada",
"importe": 18450.75
},
"etiquetas": [
"recobro",
"prioritario"
],
"cliente": {
"id": "cli_6537a1b2c3d4e5f607182933",
"nombre": "Aseguradora Ejemplo, S.A."
},
"responsable": {
"nombre": "Laura Martín"
},
"procedimientos": [
{
"organismo": "Juzgado de Primera Instancia",
"num_organismo": "4",
"poblacion": "Valencia",
"tipo_procedimiento": "Juicio verbal",
"numero_procedimiento": "1234/2026",
"nig": "4625042120260012345",
"fecha_alta": "2026-03-02T00:00:00.000Z"
}
],
"senalamientos": [
{
"tipo": "vista",
"estado": "senalado",
"titulo": "Vista del juicio verbal",
"fecha_inicio": "2026-11-18T09:30:00.000Z",
"fecha_fin": "2026-11-18T10:30:00.000Z",
"zona_horaria": "Europe/Madrid",
"ubicacion": "Ciudad de la Justicia, sala 12"
}
],
"intervinientes": [
{
"nombre": "Transportes Ficticios del Turia, S.L.",
"rol": "Demandado"
},
{
"nombre": "Ana Pérez Gil",
"rol": "Procuradora"
}
],
"creado_en": "2026-02-27T08:15:00.000Z",
"actualizado_en": "2026-10-22T09:30:00.000Z"
}Documentos
Los archivos de cada expediente: sus datos y su descarga.
Listar los documentos de un expediente
documentos:readDevuelve los documentos de un expediente: nombre, tipo, tamaño, categoría y fechas. El archivo se descarga aparte.
- Orden:
actualizado_enascendente. - Los PDF de las facturas del despacho no se incluyen.
Parámetros de ruta
idtextoobligatorioId del expediente (
exp_…).formato exp_…
Parámetros de consulta
limitenteroopcionalElementos por página, de 1 a 100.
mín. 1 · máx. 100 · por defecto 25
cursortextoopcionalnext_cursorde la página anterior.máx. 500 caracteres
updated_sincefechaopcionalRFC 3339. Inclusivo: devuelve lo modificado en o después de esta fecha.
categoriaenumopcionalSolo documentos de esta categoría.
identificacionIdentificaciónDNI, NIE, pasaporte, escrituras de poder…documentacion_clienteDocumentación clienteLo que aporta el cliente para el asunto.contratos_escriturasContratos / EscriturasContratos, escrituras y documentos notariales.escritos_comunicacionesEscritos / ComunicacionesEscritos presentados, correos y comunicaciones.procesal_administrativoProcesal / AdministrativoResoluciones, notificaciones y actos del juzgado o la Administración.pruebaPruebaPruebas e informes periciales.facturacion_economicoFacturación / EconómicoJustificantes de pago, provisiones y documentos económicos.otroOtroCualquier otro documento.
Respuestas
- 200Página de documentos · lista de Documentos
/v1/expedientes/{id}/documentosexport HORVELL_API_KEY="hv_tk_TU_CLAVE"
curl "https://api.horvell.com/v1/expedientes/exp_6537a1b2c3d4e5f607182930/documentos?categoria=escritos_comunicaciones" \
-H "Authorization: Bearer $HORVELL_API_KEY"Página de documentos
{
"object": "list",
"data": [
{
"object": "documento",
"id": "doc_6537a1b2c3d4e5f607182931",
"expediente": "exp_6537a1b2c3d4e5f607182930",
"nombre": "Contestación a la demanda",
"nombre_archivo": "contestacion-demanda.pdf",
"tipo_contenido": "application/pdf",
"tamano": 254331,
"categoria": "escritos_comunicaciones",
"etiquetas": [
"presentado"
],
"origen": null,
"creado_en": "2026-10-20T16:42:00.000Z",
"actualizado_en": "2026-10-20T16:42:00.000Z"
},
{
"object": "documento",
"id": "doc_6537a1b2c3d4e5f607182936",
"expediente": "exp_6537a1b2c3d4e5f607182930",
"nombre": "Informe pericial",
"nombre_archivo": "informe-pericial.pdf",
"tipo_contenido": "application/pdf",
"tamano": 1048576,
"categoria": "prueba",
"etiquetas": [
"perito"
],
"origen": "api",
"creado_en": "2026-10-22T10:05:12.000Z",
"actualizado_en": "2026-10-22T10:05:12.000Z"
}
],
"has_more": false,
"next_cursor": null
}Metadatos de un documento
documentos:readDevuelve los datos de un documento, sin el archivo.
- Admite
ETageIf-None-Matchigual que el detalle de un expediente.
Parámetros de ruta
idtextoobligatorioId del documento (
doc_…).formato doc_…
Respuestas
- 200Documento · Documento
- 304Sin cambios desde el
ETagenviado enIf-None-Match
/v1/documentos/{id}export HORVELL_API_KEY="hv_tk_TU_CLAVE"
curl "https://api.horvell.com/v1/documentos/doc_6537a1b2c3d4e5f607182931" \
-H "Authorization: Bearer $HORVELL_API_KEY"Documento
{
"object": "documento",
"id": "doc_6537a1b2c3d4e5f607182931",
"expediente": "exp_6537a1b2c3d4e5f607182930",
"nombre": "Contestación a la demanda",
"nombre_archivo": "contestacion-demanda.pdf",
"tipo_contenido": "application/pdf",
"tamano": 254331,
"categoria": "escritos_comunicaciones",
"etiquetas": [
"presentado"
],
"origen": null,
"creado_en": "2026-10-20T16:42:00.000Z",
"actualizado_en": "2026-10-20T16:42:00.000Z"
}Descargar un documento
documentos:readResponde con una redirección 302 a un enlace temporal y firmado del archivo. Tu cliente HTTP solo tiene que seguirla.
- El enlace caduca a los 5 minutos. No lo guardes: pide uno nuevo cada vez que necesites el archivo.
- Al seguir la redirección no reenvíes la cabecera
Authorization: el enlace ya va firmado. La mayoría de clientes HTTP lo hacen solos al cambiar de dominio. - El archivo llega con su
Content-Typeoriginal y exactamentetamanobytes.
Parámetros de ruta
idtextoobligatorioId del documento (
doc_…).formato doc_…
Respuestas
- 302Redirección a la URL firmada del archivo
/v1/documentos/{id}/contenidoexport HORVELL_API_KEY="hv_tk_TU_CLAVE"
curl -L -o documento.pdf "https://api.horvell.com/v1/documentos/doc_6537a1b2c3d4e5f607182931/contenido" \
-H "Authorization: Bearer $HORVELL_API_KEY"Redirección a la URL firmada del archivo
- Location
- https://almacenamiento.horvell.com/documentos/contestacion-demanda.pdf?firma=…&caduca=…
- Cache-Control
- no-store
Sigue la redirección para descargar el archivo.
Subidas
Añadir documentos a un expediente en tres pasos. Solo claves de despacho.
Iniciar la subida de un documento (paso 1 de 3)
documentos:writeCon una clave de cliente esta llamada devuelve 403 permiso_insuficiente: las claves de cliente son de solo lectura.
Paso 1 de 3 para subir un documento a un expediente. Registra la subida y te devuelve un enlace firmado al que enviar el archivo.
- Paso 2: haz un
PUTdel archivo aurl_subidacon lascabecerasque te devolvemos. El archivo va directo al almacenamiento, hasta 50 MB. - Paso 3: completa la subida para crear el documento.
Idempotency-Keyes obligatoria. Si algo falla, repite con la misma clave y el mismo cuerpo: recibirás la misma subida (200) con un enlace nuevo, nunca una segunda.- Tienes 30 minutos desde este paso para completar la subida. El enlace de
url_subidadura 15. - Solo claves de despacho con el permiso
documentos:write. Con el periodo de prueba del despacho caducado, devuelve402.
Parámetros de ruta
idtextoobligatorioId del expediente (
exp_…).formato exp_…
Cabeceras
idempotency-keytextoobligatorioValor único por documento (p. ej. un UUID). Repetir con el mismo cuerpo devuelve la misma subida, nunca una nueva.
mín. 1 caracteres · máx. 255 caracteres
Cuerpo (JSON)
nombre_archivotextoobligatorioNombre del archivo con su extensión.
mín. 1 caracteres · máx. 255 caracteres
tipo_contenidotextoobligatorioTipo MIME del archivo. Debe ser uno de los admitidos.
mín. 1 caracteres · máx. 150 caracteres
tamanoenteroobligatorioTamaño exacto del archivo en bytes, hasta 50000000.
mín. 1 · máx. 50.000.000
categoriaenumobligatorioCategoría con la que se guardará el documento.
identificacionIdentificaciónDNI, NIE, pasaporte, escrituras de poder…documentacion_clienteDocumentación clienteLo que aporta el cliente para el asunto.contratos_escriturasContratos / EscriturasContratos, escrituras y documentos notariales.escritos_comunicacionesEscritos / ComunicacionesEscritos presentados, correos y comunicaciones.procesal_administrativoProcesal / AdministrativoResoluciones, notificaciones y actos del juzgado o la Administración.pruebaPruebaPruebas e informes periciales.facturacion_economicoFacturación / EconómicoJustificantes de pago, provisiones y documentos económicos.otroOtroCualquier otro documento.
nombretextoopcionalNombre visible en Horvell. Si no lo envías, se usa
nombre_archivo.máx. 255 caracteres
etiquetaslista de textoopcionalHasta 20 etiquetas de 60 caracteres como máximo.
máx. 20 elementos · cada uno mín. 1 caracteres · cada uno máx. 60 caracteres
Errores posibles
- 400
parametro_invalido - 400
tipo_no_permitido - 400
idempotency_key_requerida - 402
suscripcion_requerida - 403
permiso_insuficiente - 404
no_encontrado - 410
subida_caducada - 415
tipo_contenido_no_soportado - 422
idempotencia_conflicto - 401
no_autenticado - 403
tenant_suspendido - 410
tenant_eliminado - 429
demasiadas_peticiones - 500
error_interno - 503
mantenimiento
/v1/expedientes/{id}/subidasexport HORVELL_API_KEY="hv_tk_TU_CLAVE"
curl -X POST "https://api.horvell.com/v1/expedientes/exp_6537a1b2c3d4e5f607182930/subidas" \
-H "Authorization: Bearer $HORVELL_API_KEY" \
-H "Idempotency-Key: 9b2f1c4e-3d5a-4e8b-a1f0-6c7d8e9f0a1b" \
-H "Content-Type: application/json" \
-d '{
"nombre_archivo": "informe-pericial.pdf",
"tipo_contenido": "application/pdf",
"tamano": 1048576,
"categoria": "prueba",
"nombre": "Informe pericial",
"etiquetas": [
"perito"
]
}'Misma Idempotency-Key: la subida ya existía
{
"object": "subida",
"id": "sub_6537a1b2c3d4e5f607182932",
"estado": "pendiente",
"expediente": "exp_6537a1b2c3d4e5f607182930",
"url_subida": "https://almacenamiento.horvell.com/subidas/sub_6537a1b2c3d4e5f607182932?firma=…",
"metodo": "PUT",
"cabeceras": {
"content-type": "application/pdf"
},
"url_caduca_en": "2026-10-22T10:20:00.000Z",
"caduca_en": "2026-10-22T10:35:00.000Z",
"documento": null
}Completar la subida y crear el documento (paso 3 de 3)
documentos:writeCon una clave de cliente esta llamada devuelve 403 permiso_insuficiente: las claves de cliente son de solo lectura.
Paso 3 de 3. Comprueba que el archivo ha llegado y crea el documento en el expediente.
- Es idempotente: repetirlo devuelve el mismo documento (
200) y nunca crea otro. - Si respondemos
409 archivo_no_subido, elPUTdel paso 2 no llegó a completarse. Repítelo y vuelve aquí. - El documento aparece al momento en Horvell, con origen
api.
Parámetros de ruta
idtextoobligatorioId de la subida (
sub_…) que devolvió el paso 1.formato sub_…
/v1/subidas/{id}/completarexport HORVELL_API_KEY="hv_tk_TU_CLAVE"
curl -X POST "https://api.horvell.com/v1/subidas/sub_6537a1b2c3d4e5f607182932/completar" \
-H "Authorization: Bearer $HORVELL_API_KEY"Ya estaba completada
{
"object": "documento",
"id": "doc_6537a1b2c3d4e5f607182931",
"expediente": "exp_6537a1b2c3d4e5f607182930",
"nombre": "Contestación a la demanda",
"nombre_archivo": "contestacion-demanda.pdf",
"tipo_contenido": "application/pdf",
"tamano": 254331,
"categoria": "escritos_comunicaciones",
"etiquetas": [
"presentado"
],
"origen": null,
"creado_en": "2026-10-20T16:42:00.000Z",
"actualizado_en": "2026-10-20T16:42:00.000Z"
}Eliminados
Lo que ha dejado de existir, para que tu sistema lo borre también.
Listar lo que ha dejado de existir
Devuelve lo que ha dejado de existir para tu clave: expedientes y documentos borrados, o que pasaron a otro cliente. Es la otra mitad de cualquier sincronización.
- Aplica primero los eliminados y después los cambios de los listados.
- Borrar un expediente implica borrar todos sus documentos: no recibirás un eliminado por cada uno.
- Se guardan 180 días. Si pides un
updated_sincemás antiguo, recibirás410 sincronizacion_caducaday tendrás que reconciliar con un listado completo. - No pide un permiso propio: cualquier clave válida puede consultarlo.
Parámetros de consulta
limitenteroopcionalElementos por página, de 1 a 100.
mín. 1 · máx. 100 · por defecto 25
cursortextoopcionalnext_cursorde la página anterior.máx. 500 caracteres
updated_sincefechaopcionalRFC 3339. Inclusivo: devuelve lo modificado en o después de esta fecha.
tipoenumopcionalSolo expedientes o solo documentos.
expedienteExpedienteBórralo junto con todos sus documentos.documentoDocumentoBorra solo ese documento.
Respuestas
- 200Página de eliminados · lista de Eliminados
/v1/eliminadosexport HORVELL_API_KEY="hv_tk_TU_CLAVE"
curl "https://api.horvell.com/v1/eliminados?updated_since=2026-10-22T00:00:00Z" \
-H "Authorization: Bearer $HORVELL_API_KEY"Página de eliminados
{
"object": "list",
"data": [
{
"object": "eliminado",
"id": "eli_6537a1b2c3d4e5f607182934",
"tipo": "documento",
"recurso": "doc_6537a1b2c3d4e5f607182936",
"expediente": "exp_6537a1b2c3d4e5f607182930",
"motivo": "eliminado",
"eliminado_en": "2026-10-22T11:20:00.000Z"
},
{
"object": "eliminado",
"id": "eli_6537a1b2c3d4e5f607182937",
"tipo": "expediente",
"recurso": "exp_6537a1b2c3d4e5f607182935",
"expediente": null,
"motivo": "cambio_cliente",
"eliminado_en": "2026-10-22T12:02:00.000Z"
}
],
"has_more": false,
"next_cursor": null
}Objetos
Lo que devuelve la API, campo a campo. Ignora los campos que no conozcas: dentro de la v1 podemos añadir más.
Expediente
Un asunto del despacho, con sus procedimientos, señalamientos e intervinientes.
objecttextoSiempre
expediente.idtextoIdentificador del expediente en la API. Estable: no cambia nunca.
formato exp_…
numerotextoNúmero del expediente en el despacho, el que ve el equipo en Horvell.
titulotextoTítulo del expediente.
referencia_externatextopuede ser nullCódigo del expediente en el sistema del que se importó (p. ej. Kmaleon).
nullsi se creó en Horvell.referenciasobjetoReferencias del cliente para este asunto (su número de préstamo, de siniestro, de cartera…), tal como las lleva el despacho. Puedes buscar por cualquiera de ellas con el filtro
referencia.Ver los campos de referencias
referencia_1textopuede ser nullReferencia 1 del cliente.
nullsi no tiene.referencia_2textopuede ser nullReferencia 2 del cliente.
nullsi no tiene.referencia_3textopuede ser nullReferencia 3 del cliente.
nullsi no tiene.
tipoenumÁrea del derecho del expediente.
Ver los 18 valores posibles
mercantil_societarioMercantil / Societariocivil_contractualCivil / Contractualprocesal_litigacionProcesal / LitigaciónpenalPenallaboral_seguridad_socialLaboral / Seguridad Socialadministrativo_contenciosoAdministrativo / Contenciosofiscal_tributarioFiscal / Tributarioconcursal_reestructuracionConcursal / ReestructuraciónfamiliaFamiliasucesionesSucesionesinmobiliario_urbanismoInmobiliario / Urbanismobancario_financieroBancario / Financieropropiedad_intelectual_industrialPropiedad Intelectual / Industrialproteccion_datos_privacidadProtección de Datos / PrivacidadcomplianceComplianceextranjeria_nacionalidadExtranjería / Nacionalidadnotarial_registralNotarial / RegistralotroOtro
estadoenumEstado de trabajo del expediente en el despacho.
nuevoNuevoRecién abierto; todavía no se ha empezado a trabajar.en_estudioEn estudioEl despacho está analizando el asunto antes de actuar.en_cursoEn cursoEn tramitación activa.pendiente_clientePendiente clienteEsperando algo del cliente: documentación, una decisión, una firma…pendiente_terceroPendiente terceroEsperando a un tercero: juzgado, notaría, registro, contraparte…en_pausaEn pausaParado de forma temporal por decisión del despacho o del cliente.cerradoCerradoTerminado. Se puede reabrir.archivadoArchivadoCerrado y archivado de forma definitiva.
situacion_procesaltextopuede ser nullSituación procesal en texto libre, tal como la anota el despacho.
nullsi no hay.cuantiaobjetopuede ser nullCuantía del asunto.
nullsi no se ha indicado.Ver los campos de cuantia
tipoenumSi la cuantía está fijada o no.
determinadaDeterminadaHay un importe concreto enimporte.indeterminadaIndeterminadaNo se puede fijar;importeesnull.
importenúmeropuede ser nullImporte en euros.
nullsi la cuantía es indeterminada.
etiquetaslista de textoEtiquetas que el despacho ha puesto al expediente.
clienteobjetoCliente del despacho al que pertenece el expediente.
Ver los campos de cliente
idtextoIdentificador del cliente (
cli_…).formato cli_…
nombretextoNombre o razón social del cliente.
responsableobjetopuede ser nullPersona del despacho que lleva el expediente.
nullsi no hay.Ver los campos de responsable
nombretextoNombre del abogado o abogada.
procedimientoslista de objetosProcedimientos judiciales o administrativos del expediente. Puede estar vacío.
Ver los campos de procedimientos
organismotextopuede ser nullJuzgado u organismo.
num_organismotextopuede ser nullNúmero del juzgado u organismo.
poblaciontextopuede ser nullPoblación del juzgado u organismo.
tipo_procedimientotextopuede ser nullTipo de procedimiento (juicio verbal, ordinario…).
numero_procedimientotextopuede ser nullNúmero de autos, p. ej.
1234/2026.nigtextopuede ser nullNúmero de Identificación General del procedimiento.
fecha_altafechapuede ser nullFecha de alta del procedimiento.
senalamientoslista de objetosJuicios, vistas, plazos y demás señalamientos del expediente.
Ver los campos de senalamientos
tipoenumTipo de señalamiento.
juicioJuiciovistaVistacomparecenciaComparecenciaaudiencia_previaAudiencia previadeclaracionDeclaraciónplazoPlazoVencimiento de un plazo procesal o administrativo.otroOtro
estadoenumEstado del señalamiento.
senaladoSeñaladoFijado y pendiente de celebrarse.suspendidoSuspendidoAplazado; puede volver a señalarse con otra fecha.celebradoCelebradoYa tuvo lugar.canceladoCanceladoNo se celebrará.
titulotextoTítulo del señalamiento.
fecha_iniciofechaInicio, en UTC.
fecha_finfechapuede ser nullFin, en UTC.
nullsi no tiene.zona_horariatextoZona horaria IANA en la que se fijó.
ubicaciontextopuede ser nullSala, sede o dirección.
nullsi no consta.
intervinienteslista de objetosPartes y profesionales que intervienen.
Ver los campos de intervinientes
nombretextoNombre de la persona o entidad.
roltextopuede ser nullSu papel en el asunto (demandado, procurador…).
creado_enfechaFecha de alta del expediente, en UTC.
actualizado_enfechaÚltima modificación de los datos propios del expediente, en UTC. Un cambio en sus señalamientos no la mueve, pero sí lo hace volver a salir con
updated_since.
{
"object": "expediente",
"id": "exp_6537a1b2c3d4e5f607182930",
"numero": "EXP-2026-0142",
"titulo": "Reclamación de cantidad · Transportes del Turia",
"referencia_externa": "457906",
"referencias": {
"referencia_1": "PRE-2019-004512",
"referencia_2": "CART-2026-118",
"referencia_3": null
},
"tipo": "procesal_litigacion",
"estado": "en_curso",
"situacion_procesal": "Contestación a la demanda presentada",
"cuantia": {
"tipo": "determinada",
"importe": 18450.75
},
"etiquetas": [
"recobro",
"prioritario"
],
"cliente": {
"id": "cli_6537a1b2c3d4e5f607182933",
"nombre": "Aseguradora Ejemplo, S.A."
},
"responsable": {
"nombre": "Laura Martín"
},
"procedimientos": [
{
"organismo": "Juzgado de Primera Instancia",
"num_organismo": "4",
"poblacion": "Valencia",
"tipo_procedimiento": "Juicio verbal",
"numero_procedimiento": "1234/2026",
"nig": "4625042120260012345",
"fecha_alta": "2026-03-02T00:00:00.000Z"
}
],
"senalamientos": [
{
"tipo": "vista",
"estado": "senalado",
"titulo": "Vista del juicio verbal",
"fecha_inicio": "2026-11-18T09:30:00.000Z",
"fecha_fin": "2026-11-18T10:30:00.000Z",
"zona_horaria": "Europe/Madrid",
"ubicacion": "Ciudad de la Justicia, sala 12"
}
],
"intervinientes": [
{
"nombre": "Transportes Ficticios del Turia, S.L.",
"rol": "Demandado"
},
{
"nombre": "Ana Pérez Gil",
"rol": "Procuradora"
}
],
"creado_en": "2026-02-27T08:15:00.000Z",
"actualizado_en": "2026-10-22T09:30:00.000Z"
}Documento
Un archivo de un expediente. El contenido se descarga aparte.
objecttextoSiempre
documento.idtextoIdentificador del documento en la API. Estable.
formato doc_…
expedientetextoExpediente al que pertenece.
formato exp_…
nombretextoNombre visible del documento en Horvell.
nombre_archivotextoNombre del archivo, con su extensión.
tipo_contenidotextoTipo MIME del archivo.
tamanoenteroTamaño del archivo en bytes.
categoriaenumCategoría del documento en el expediente.
identificacionIdentificaciónDNI, NIE, pasaporte, escrituras de poder…documentacion_clienteDocumentación clienteLo que aporta el cliente para el asunto.contratos_escriturasContratos / EscriturasContratos, escrituras y documentos notariales.escritos_comunicacionesEscritos / ComunicacionesEscritos presentados, correos y comunicaciones.procesal_administrativoProcesal / AdministrativoResoluciones, notificaciones y actos del juzgado o la Administración.pruebaPruebaPruebas e informes periciales.facturacion_economicoFacturación / EconómicoJustificantes de pago, provisiones y documentos económicos.otroOtroCualquier otro documento.
etiquetaslista de textoEtiquetas del documento.
origenenumpuede ser nullVía automática por la que entró;
null= subido a mano.resendCorreo entranteLlegó por correo al buzón del despacho en Horvell.outlook-addinOutlookSe guardó desde el complemento de Outlook.ingestaImportaciónEntró al importar una carpeta de expedientes.apiAPILo subió un integrador con una clave de despacho.
creado_enfechaFecha de alta del documento, en UTC.
actualizado_enfechaÚltima modificación del documento, en UTC.
{
"object": "documento",
"id": "doc_6537a1b2c3d4e5f607182931",
"expediente": "exp_6537a1b2c3d4e5f607182930",
"nombre": "Contestación a la demanda",
"nombre_archivo": "contestacion-demanda.pdf",
"tipo_contenido": "application/pdf",
"tamano": 254331,
"categoria": "escritos_comunicaciones",
"etiquetas": [
"presentado"
],
"origen": null,
"creado_en": "2026-10-20T16:42:00.000Z",
"actualizado_en": "2026-10-20T16:42:00.000Z"
}Subida
Una subida de documento en curso (solo claves de despacho).
objecttextoSiempre
subida.idtextoIdentificador de la subida. Lo necesitas para completarla.
formato sub_…
estadoenumEn qué punto está la subida.
pendientePendienteEsperando el archivo (paso 2) y la confirmación (paso 3).completandoCompletandoSe está creando el documento. Repite el paso 3 en unos segundos.completadaCompletadaEl documento ya existe; está endocumento.caducadaCaducadaPasaron los 30 minutos sin completarla. Empieza otra con unaIdempotency-Keynueva.
expedientetextoExpediente en el que se creará el documento.
formato exp_…
url_subidatextopuede ser nullURL firmada para hacer
PUTdel archivo.nullsi ya se completó.metodotextoMétodo HTTP para enviar el archivo: siempre
PUT.cabecerasobjetoCabeceras obligatorias en el
PUT(elcontent-typedebe coincidir).url_caduca_enfechapuede ser nullHasta cuándo vale
url_subida(15 minutos). Si caduca, repite el paso 1 con la mismaIdempotency-Keyy recibirás una nueva.caduca_enfechaDespués de esta fecha (30 minutos desde el paso 1) la subida ya no se puede completar.
documentotextopuede ser nullDocumento creado al completar.
nullhasta entonces.formato doc_…
{
"object": "subida",
"id": "sub_6537a1b2c3d4e5f607182932",
"estado": "pendiente",
"expediente": "exp_6537a1b2c3d4e5f607182930",
"url_subida": "https://almacenamiento.horvell.com/subidas/sub_6537a1b2c3d4e5f607182932?firma=…",
"metodo": "PUT",
"cabeceras": {
"content-type": "application/pdf"
},
"url_caduca_en": "2026-10-22T10:20:00.000Z",
"caduca_en": "2026-10-22T10:35:00.000Z",
"documento": null
}Eliminado
Algo que ha dejado de existir para tu clave.
objecttextoSiempre
eliminado.idtextoIdentificador del registro de eliminación (
eli_…).formato eli_…
tipoenumQué dejó de existir.
expedienteExpedienteBórralo junto con todos sus documentos.documentoDocumentoBorra solo ese documento.
recursotextoId del expediente (
exp_…) o documento (doc_…) que ya no existe para esta clave.expedientetextopuede ser nullSolo documentos: expediente al que pertenecía.
formato exp_…
motivoenumeliminado: se borró.cambio_cliente: pasó a otro cliente (solo lo ven las claves del cliente anterior).eliminadoEliminadoSe borró en Horvell.cambio_clienteCambio de clientePasó a otro cliente. Solo lo reciben las claves del cliente anterior, que ya no deben verlo.
eliminado_enfechaCuándo dejó de existir para esta clave, en UTC.
{
"object": "eliminado",
"id": "eli_6537a1b2c3d4e5f607182934",
"tipo": "documento",
"recurso": "doc_6537a1b2c3d4e5f607182936",
"expediente": "exp_6537a1b2c3d4e5f607182930",
"motivo": "eliminado",
"eliminado_en": "2026-10-22T11:20:00.000Z"
}Error
El cuerpo de cualquier respuesta de error (RFC 9457, application/problem+json).
typetextoEnlace a la explicación de este error en la documentación.
titletextoTítulo corto del error.
statusenteroEl mismo código HTTP de la respuesta.
detailtextopuede faltarExplicación concreta de este caso, cuando la hay.
codetextoCódigo estable del error. Usa este campo, no
title, para decidir qué hacer.request_idtextoIdentificador de la petición. Inclúyelo si nos escribes.
errorslista de objetospuede faltarDetalle por campo en errores de validación.
Ver los campos de errors
campotextoCampo con el problema, p. ej.
limit.mensajetextoQué le pasa.
{
"type": "https://api.horvell.com/v1/docs#errores-no_encontrado",
"title": "No encontrado",
"status": 404,
"code": "no_encontrado",
"request_id": "req_q3Zl8vY1cN0kT5bW"
}Errores
Todas las respuestas de error usan application/problem+json (RFC 9457). Decide qué hacer según code, nunca según el texto, y guarda el request_id: es lo que necesitamos si nos escribes.
- 400
parametro_invalidoParámetro no válidoNo reintentes igual- Cuándo pasa
- Un parámetro, una cabecera o el cuerpo no cumple el formato.
errorslista cada campo con su motivo. - Qué hacer
- Corrige los campos que indica
errorsy repite.
- 400
parametro_no_permitidoParámetro no permitido para esta claveNo reintentes igual- Cuándo pasa
- Has enviado un parámetro que tu tipo de clave no admite. P. ej.
clientecon una clave de cliente. - Qué hacer
- Quita el parámetro: una clave de cliente ya está limitada a su cliente.
- 400
cursor_invalidoCursor no válidoNo reintentes igual- Cuándo pasa
- El
cursorestá manipulado, caducado o lo pides con filtros distintos a los de la página anterior. - Qué hacer
- Vuelve a empezar el listado sin
cursor, con los mismos filtros en todas las páginas.
- 400
id_invalidoIdentificador no válidoNo reintentes igual- Cuándo pasa
- El identificador no tiene el formato de su tipo (
exp_…,doc_…,sub_…). - Qué hacer
- Usa el
idtal como lo devuelve la API, sin modificarlo.
- 400
tipo_no_permitidoTipo de archivo no permitidoNo reintentes igual- Cuándo pasa
- El tipo de archivo de la subida no está entre los admitidos.
- Qué hacer
- Convierte el archivo a un formato admitido (PDF, Word, Excel, imagen, correo…) o revisa
tipo_contenido.
- 400
idempotency_key_requeridaFalta la cabecera Idempotency-KeyNo reintentes igual- Cuándo pasa
- Falta la cabecera
Idempotency-Keyal iniciar una subida. Hoy la API lo devuelve comoparametro_invalidocon el campoidempotency-key; trata los dos igual. - Qué hacer
- Envía un valor único por documento, p. ej. un UUID.
- 401
no_autenticadoNo autenticadoNo reintentes igual- Cuándo pasa
- Falta la cabecera
Authorization, o la clave no existe, está revocada o ha caducado. - Qué hacer
- Comprueba la clave. Si la revocaron o caducó, pide una nueva al despacho.
- 402
suscripcion_requeridaSuscripción requeridaNo reintentes igual- Cuándo pasa
- El periodo de prueba del despacho ha terminado. Las lecturas siguen funcionando; las escrituras no.
- Qué hacer
- Avisa al despacho. Las subidas volverán a funcionar cuando active su suscripción.
- 403
permiso_insuficientePermiso insuficienteNo reintentes igual- Cuándo pasa
- La clave no tiene el permiso que pide la llamada, o es una clave de cliente intentando escribir.
- Qué hacer
- Pide al despacho una clave con ese permiso. Las claves de cliente son siempre de solo lectura.
- 403
tenant_suspendidoDespacho no disponibleNo reintentes igual- Cuándo pasa
- El despacho tiene la cuenta suspendida o pendiente de activar.
- Qué hacer
- Contacta con el despacho. La API volverá a responder cuando reactive su cuenta.
- 404
no_encontradoNo encontradoNo reintentes igual- Cuándo pasa
- El recurso no existe o tu clave no tiene acceso a él. La API no distingue los dos casos a propósito.
- Qué hacer
- Revisa el
id. Si sincronizas, puede haberse eliminado: consulta/v1/eliminados.
- 409
archivo_no_subidoArchivo no subidoCorrige y reintenta- Cuándo pasa
- Intentas completar una subida, pero el archivo no ha llegado al almacenamiento.
- Qué hacer
- Haz el
PUTdel paso 2 (comprueba que respondió 200) y repite el paso 3.
- 409
subida_en_cursoSubida en cursoEspera y reintenta- Cuándo pasa
- Otra petición está completando esta misma subida ahora mismo.
- Qué hacer
- Espera unos segundos y repite el paso 3: recibirás el mismo documento.
- 410
subida_caducadaSubida caducadaNo reintentes igual- Cuándo pasa
- Han pasado más de 30 minutos desde el paso 1 sin completar la subida.
- Qué hacer
- Empieza otra subida con una
Idempotency-Keynueva.
- 410
sincronizacion_caducadaSincronización caducadaNo reintentes igual- Cuándo pasa
- Has pedido eliminados con un
updated_sincede hace más de 180 días, que ya no se conservan. - Qué hacer
- Haz una reconciliación completa: recorre los listados sin
updated_sincey borra lo que ya no aparezca.
- 410
tenant_eliminadoDespacho eliminadoNo reintentes igual- Cuándo pasa
- El despacho ha dado de baja su cuenta.
- Qué hacer
- La clave no volverá a funcionar. Deja de sincronizar.
- 415
tipo_contenido_no_soportadoTipo de contenido no soportadoNo reintentes igual- Cuándo pasa
- El cuerpo de la petición no es
application/json. - Qué hacer
- Envía el cuerpo como JSON con la cabecera
Content-Type: application/json.
- 422
idempotencia_conflictoConflicto de idempotenciaNo reintentes igual- Cuándo pasa
- Has reutilizado una
Idempotency-Keycon un cuerpo distinto. - Qué hacer
- Usa una clave nueva para cada documento distinto. Repite con la misma clave solo si el cuerpo es idéntico.
- 429
demasiadas_peticionesDemasiadas peticionesEspera y reintenta- Cuándo pasa
- Has superado el límite por minuto de tu clave, o el de tu IP.
- Qué hacer
- Espera los segundos que indica
Retry-Aftery repite. Reparte las peticiones en el tiempo.
- 500
error_internoError internoEspera y reintenta- Cuándo pasa
- Algo ha fallado de nuestro lado.
- Qué hacer
- Repite pasados unos segundos. Si persiste, escríbenos con el
request_id.
- 503
error_almacenamientoAlmacenamiento no disponibleEspera y reintenta- Cuándo pasa
- El almacenamiento de archivos no responde en este momento.
- Qué hacer
- Repite pasados unos segundos.
- 503
mantenimientoEn mantenimientoEspera y reintenta- Cuándo pasa
- La API está en mantenimiento programado.
- Qué hacer
- Espera los segundos que indica
Retry-Aftery repite.
Registro de cambios
- v1.0.0
- Primera versión pública: expedientes, documentos, descarga, subida en tres pasos y eliminados.
- Claves de despacho con permisos por recurso y claves de cliente de solo lectura.
- Las referencias del cliente (
referencias) en el expediente y el filtroreferenciapara buscar por ellas.
¿Tu despacho aún no usa Horvell? Consulta los precios de Horvell o descubre el software para abogados con IA. ¿Dudas o algo que no encaja? Escríbenos a hola@horvell.com con el request_id de la respuesta.