30 días gratis · Sin tarjeta
APIv1.0.0
APIDocumentación · v1.0.0

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.

URL base
https://api.horvell.com/v1
Formato
JSON · UTF-8
Autenticación
Bearer
Versión
1.0.0
001Empezar

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.

Aspecto
Clave de despachohv_tk_…
Clave de clientehv_ck_…
Para quién es
DespachoLa informática del propio despacho o su proveedor de software.
ClienteUn cliente del despacho (una aseguradora, una empresa, un fondo) que quiere ver sus asuntos desde su sistema.
Quién la crea
DespachoUn administrador del despacho, en Configuración › Integraciones.
ClienteUn administrador del despacho, en la ficha del cliente › Acceso API.
Prefijo
Despachohv_tk_…
Clientehv_ck_…
Qué ve
DespachoTodos los expedientes del despacho, de todos sus clientes.
ClienteSolo los expedientes de ese cliente. Nada de otros clientes, ni siquiera si existen.
Puede escribir
DespachoSí, con el permiso documentos:write: subir documentos.
ClienteNo. Siempre de solo lectura.
Permisos
DespachoLos que elija el administrador: expedientes:read, documentos:read, documentos:write.
ClienteFijos: expedientes:read y documentos:read.
Límite
Despacho600 peticiones por minuto.
Cliente120 peticiones por minuto.
Ejemplo de uso
DespachoVolcar cada noche los expedientes y documentos al ERP o al cuadro de mando del despacho.
ClienteLa aseguradora consulta desde su sistema de siniestros en qué punto está cada reclamación y descarga los escritos.

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.

002Empezar

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 id con 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 code estable para tu programa.

¿Buscas otra forma de conectar Horvell (Outlook, Holded, remesas SEPA, Kmaleon, Excel…)? Están todas en integraciones.

URL base
https://api.horvell.com/v1
Formato de un error
{
  "type": "https://api.horvell.com/v1/docs#errores-no_encontrado",
  "title": "No encontrado",
  "status": 404,
  "code": "no_encontrado",
  "request_id": "req_q3Zl8vY1cN0kT5bW"
}
003Empezar

Inicio rápido

  1. 01
    Consigue 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.

  2. 02
    Guá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.

  3. 03
    Haz tu primera llamada

    Pide los dos primeros expedientes. Si recibes un objeto list, ya estás dentro. Si recibes 401, revisa la clave.

Tu primera llamada
export HORVELL_API_KEY="hv_tk_TU_CLAVE"

curl "https://api.horvell.com/v1/expedientes?limit=2" \
  -H "Authorization: Bearer $HORVELL_API_KEY"
Respuesta
{
  "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"
}
004Empezar

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.
Cabecera
Authorization: Bearer hv_tk_TU_CLAVE
005Guía

Sincronizar 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.

Una vezPrimera cargaGET /v1/expedientestodas las páginas · apunta la hora
Cada N minutos
01EliminadosGET /v1/eliminadosborra lo que devuelva
02Cambios?updated_since=…guarda por id
03Apunta la horainicio − 1 minpara la próxima vez
  1. 01
    Primera carga

    Recorre GET /v1/expedientes siguiendo next_cursor hasta que has_more sea false, y los documentos de cada expediente. Antes de empezar, apunta la hora.

  2. 02
    Eliminados

    En cada sincronización siguiente, pide GET /v1/eliminados con updated_since = la hora que apuntaste, y borra de tu sistema lo que te devuelva. Borrar un expediente implica sus documentos.

  3. 03
    Cambios

    Después pide GET /v1/expedientes?updated_since=… y guarda lo que te devuelva, identificando cada objeto por su id. 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.

Sincronización completa
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
}
006Guía

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.

Tu sistemaAPI de HorvellAlmacenamiento
  1. 01POST /v1/expedientes/{id}/subidas← url_subida firmada
  2. 02PUT url_subidael archivo, sin Authorization
  3. 03POST /v1/subidas/{id}/completar← el Documento creado
  1. 01
    Iniciar

    POST /v1/expedientes/{id}/subidas con el nombre, tipo, tamaño y categoría del archivo, y una Idempotency-Key única. Te devolvemos url_subida y las cabeceras que debe llevar el envío.

  2. 02
    Enviar el archivo

    PUT del archivo a url_subida, con esas cabeceras y sin Authorization. El enlace dura 15 minutos.

  3. 03
    Completar

    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.

Subida completa
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
}
007Guía

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.

  • limit va 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_en y después id), así que no te saltarás elementos aunque cambien datos mientras recorres.
Página siguiente
curl "https://api.horvell.com/v1/expedientes?limit=100&cursor=eyJmIjoiMjAyNi0xMC0yMlQwOTozMDowMC4wMDBaIiwiaSI6IjY1MzdhMWIyIn0.k4vQ2s" \
  -H "Authorization: Bearer $HORVELL_API_KEY"
008Guía

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.

Petición condicional
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 304
009Guía

Límites de uso

LímiteValor
Clave de despacho600 peticiones por minuto
Clave de cliente120 peticiones por minuto
Por dirección IP1.200 peticiones por minuto
Subidas por despacho30 por minuto
Tamaño de archivo50 MB
Elementos por página100

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.

Cabeceras de límite
HTTP/2 200
RateLimit-Limit: 600
RateLimit-Remaining: 557
RateLimit-Reset: 41
010Guía

Versiones 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.

011Referencia

Expedientes

Los asuntos del despacho, con sus procedimientos, señalamientos e intervinientes.

GET/v1/expedientes

Listar expedientes

Despacho: síCliente: sípermiso expedientes:read

Devuelve 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_en ascendente, 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. referencia busca 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 su actualizado_en no cambie.

Parámetros de consulta

  • limitenteroopcional

    Elementos por página, de 1 a 100.

    mín. 1 · máx. 100 · por defecto 25

  • cursortextoopcional

    next_cursor de la página anterior.

    máx. 500 caracteres

  • updated_sincefechaopcional

    RFC 3339. Inclusivo: devuelve lo modificado en o después de esta fecha.

  • numerotextoopcional

    Número exacto del expediente.

    máx. 80 caracteres

  • referencia_externatextoopcional

    Código exacto del expediente en el sistema del que se importó.

    máx. 200 caracteres

  • referenciatextoopcional

    Valor exacto de cualquiera de las tres referencias del cliente (referencias).

    máx. 200 caracteres

  • numero_procedimientotextoopcional

    Número de autos exacto de alguno de sus procedimientos, p. ej. 1234/2026.

    máx. 80 caracteres

  • nigtextoopcional

    NIG exacto de alguno de sus procedimientos.

    máx. 50 caracteres

  • estadolista de enumopcional

    Uno 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 despacho

    Solo claves de despacho: expedientes de ese cliente. Con una clave de cliente devuelve 400 parametro_no_permitido.

    formato cli_…

Respuestas

GET/v1/expedientes
GET /v1/expedientes
export 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"
Respuesta

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"
}
GET/v1/expedientes/{id}

Detalle de un expediente

Despacho: síCliente: sípermiso expedientes:read

Devuelve un expediente con sus procedimientos, señalamientos e intervinientes.

  • La respuesta lleva una cabecera ETag. Si la envías en If-None-Match en la siguiente consulta y el expediente no ha cambiado, recibirás un 304 sin 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

  • idtextoobligatorio

    Id del expediente (exp_…).

    formato exp_…

Respuestas

  • 200Expediente · Expediente
  • 304Sin cambios desde el ETag enviado en If-None-Match
GET/v1/expedientes/{id}
GET /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"
Respuesta

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"
}
012Referencia

Documentos

Los archivos de cada expediente: sus datos y su descarga.

GET/v1/expedientes/{id}/documentos

Listar los documentos de un expediente

Despacho: síCliente: sípermiso documentos:read

Devuelve los documentos de un expediente: nombre, tipo, tamaño, categoría y fechas. El archivo se descarga aparte.

  • Orden: actualizado_en ascendente.
  • Los PDF de las facturas del despacho no se incluyen.

Parámetros de ruta

  • idtextoobligatorio

    Id del expediente (exp_…).

    formato exp_…

Parámetros de consulta

  • limitenteroopcional

    Elementos por página, de 1 a 100.

    mín. 1 · máx. 100 · por defecto 25

  • cursortextoopcional

    next_cursor de la página anterior.

    máx. 500 caracteres

  • updated_sincefechaopcional

    RFC 3339. Inclusivo: devuelve lo modificado en o después de esta fecha.

  • categoriaenumopcional

    Solo 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

GET/v1/expedientes/{id}/documentos
GET /v1/expedientes/{id}/documentos
export 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"
Respuesta

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
}
GET/v1/documentos/{id}

Metadatos de un documento

Despacho: síCliente: sípermiso documentos:read

Devuelve los datos de un documento, sin el archivo.

  • Admite ETag e If-None-Match igual que el detalle de un expediente.

Parámetros de ruta

  • idtextoobligatorio

    Id del documento (doc_…).

    formato doc_…

Respuestas

  • 200Documento · Documento
  • 304Sin cambios desde el ETag enviado en If-None-Match
GET/v1/documentos/{id}
GET /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"
Respuesta

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"
}
GET/v1/documentos/{id}/contenido

Descargar un documento

Despacho: síCliente: sípermiso documentos:read

Responde 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-Type original y exactamente tamano bytes.

Parámetros de ruta

  • idtextoobligatorio

    Id del documento (doc_…).

    formato doc_…

Respuestas

  • 302Redirección a la URL firmada del archivo
GET/v1/documentos/{id}/contenido
GET /v1/documentos/{id}/contenido
export 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"
Respuesta

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.

013Referencia

Subidas

Añadir documentos a un expediente en tres pasos. Solo claves de despacho.

POST/v1/expedientes/{id}/subidas

Iniciar la subida de un documento (paso 1 de 3)

Despacho: síCliente: nopermiso documentos:write

Con 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 PUT del archivo a url_subida con las cabeceras que te devolvemos. El archivo va directo al almacenamiento, hasta 50 MB.
  • Paso 3: completa la subida para crear el documento.
  • Idempotency-Key es 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_subida dura 15.
  • Solo claves de despacho con el permiso documentos:write. Con el periodo de prueba del despacho caducado, devuelve 402.

Parámetros de ruta

  • idtextoobligatorio

    Id del expediente (exp_…).

    formato exp_…

Cabeceras

  • idempotency-keytextoobligatorio

    Valor ú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_archivotextoobligatorio

    Nombre del archivo con su extensión.

    mín. 1 caracteres · máx. 255 caracteres

  • tipo_contenidotextoobligatorio

    Tipo MIME del archivo. Debe ser uno de los admitidos.

    mín. 1 caracteres · máx. 150 caracteres

  • tamanoenteroobligatorio

    Tamaño exacto del archivo en bytes, hasta 50000000.

    mín. 1 · máx. 50.000.000

  • categoriaenumobligatorio

    Categorí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.
  • nombretextoopcional

    Nombre visible en Horvell. Si no lo envías, se usa nombre_archivo.

    máx. 255 caracteres

  • etiquetaslista de textoopcional

    Hasta 20 etiquetas de 60 caracteres como máximo.

    máx. 20 elementos · cada uno mín. 1 caracteres · cada uno máx. 60 caracteres

Respuestas

  • 200Misma Idempotency-Key: la subida ya existía · Subida
  • 201Subida creada · Subida
POST/v1/expedientes/{id}/subidas
POST /v1/expedientes/{id}/subidas
export 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"
  ]
}'
Respuesta

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
}
POST/v1/subidas/{id}/completar

Completar la subida y crear el documento (paso 3 de 3)

Despacho: síCliente: nopermiso documentos:write

Con 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, el PUT del 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

  • idtextoobligatorio

    Id de la subida (sub_…) que devolvió el paso 1.

    formato sub_…

Respuestas

POST/v1/subidas/{id}/completar
POST /v1/subidas/{id}/completar
export 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"
Respuesta

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"
}
014Referencia

Eliminados

Lo que ha dejado de existir, para que tu sistema lo borre también.

GET/v1/eliminados

Listar lo que ha dejado de existir

Despacho: síCliente: sísin permiso propio

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_since más antiguo, recibirás 410 sincronizacion_caducada y tendrás que reconciliar con un listado completo.
  • No pide un permiso propio: cualquier clave válida puede consultarlo.

Parámetros de consulta

  • limitenteroopcional

    Elementos por página, de 1 a 100.

    mín. 1 · máx. 100 · por defecto 25

  • cursortextoopcional

    next_cursor de la página anterior.

    máx. 500 caracteres

  • updated_sincefechaopcional

    RFC 3339. Inclusivo: devuelve lo modificado en o después de esta fecha.

  • tipoenumopcional

    Solo expedientes o solo documentos.

    • expedienteExpedienteBórralo junto con todos sus documentos.
    • documentoDocumentoBorra solo ese documento.

Respuestas

GET/v1/eliminados
GET /v1/eliminados
export 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"
Respuesta

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
}
015Referencia

Objetos

Lo que devuelve la API, campo a campo. Ignora los campos que no conozcas: dentro de la v1 podemos añadir más.

Objeto

Expediente

Un asunto del despacho, con sus procedimientos, señalamientos e intervinientes.

  • objecttexto

    Siempre expediente.

  • idtexto

    Identificador del expediente en la API. Estable: no cambia nunca.

    formato exp_…

  • numerotexto

    Número del expediente en el despacho, el que ve el equipo en Horvell.

  • titulotexto

    Título del expediente.

  • referencia_externatextopuede ser null

    Código del expediente en el sistema del que se importó (p. ej. Kmaleon). null si se creó en Horvell.

  • referenciasobjeto

    Referencias 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 null

      Referencia 1 del cliente. null si no tiene.

    • referencia_2textopuede ser null

      Referencia 2 del cliente. null si no tiene.

    • referencia_3textopuede ser null

      Referencia 3 del cliente. null si no tiene.

  • tipoenum

    Área del derecho del expediente.

    Ver los 18 valores posibles
    • mercantil_societarioMercantil / Societario
    • civil_contractualCivil / Contractual
    • procesal_litigacionProcesal / Litigación
    • penalPenal
    • laboral_seguridad_socialLaboral / Seguridad Social
    • administrativo_contenciosoAdministrativo / Contencioso
    • fiscal_tributarioFiscal / Tributario
    • concursal_reestructuracionConcursal / Reestructuración
    • familiaFamilia
    • sucesionesSucesiones
    • inmobiliario_urbanismoInmobiliario / Urbanismo
    • bancario_financieroBancario / Financiero
    • propiedad_intelectual_industrialPropiedad Intelectual / Industrial
    • proteccion_datos_privacidadProtección de Datos / Privacidad
    • complianceCompliance
    • extranjeria_nacionalidadExtranjería / Nacionalidad
    • notarial_registralNotarial / Registral
    • otroOtro
  • estadoenum

    Estado 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 null

    Situación procesal en texto libre, tal como la anota el despacho. null si no hay.

  • cuantiaobjetopuede ser null

    Cuantía del asunto. null si no se ha indicado.

    Ver los campos de cuantia
    • tipoenum

      Si la cuantía está fijada o no.

      • determinadaDeterminadaHay un importe concreto en importe.
      • indeterminadaIndeterminadaNo se puede fijar; importe es null.
    • importenúmeropuede ser null

      Importe en euros. null si la cuantía es indeterminada.

  • etiquetaslista de texto

    Etiquetas que el despacho ha puesto al expediente.

  • clienteobjeto

    Cliente del despacho al que pertenece el expediente.

    Ver los campos de cliente
    • idtexto

      Identificador del cliente (cli_…).

      formato cli_…

    • nombretexto

      Nombre o razón social del cliente.

  • responsableobjetopuede ser null

    Persona del despacho que lleva el expediente. null si no hay.

    Ver los campos de responsable
    • nombretexto

      Nombre del abogado o abogada.

  • procedimientoslista de objetos

    Procedimientos judiciales o administrativos del expediente. Puede estar vacío.

    Ver los campos de procedimientos
    • organismotextopuede ser null

      Juzgado u organismo.

    • num_organismotextopuede ser null

      Número del juzgado u organismo.

    • poblaciontextopuede ser null

      Población del juzgado u organismo.

    • tipo_procedimientotextopuede ser null

      Tipo de procedimiento (juicio verbal, ordinario…).

    • numero_procedimientotextopuede ser null

      Número de autos, p. ej. 1234/2026.

    • nigtextopuede ser null

      Número de Identificación General del procedimiento.

    • fecha_altafechapuede ser null

      Fecha de alta del procedimiento.

  • senalamientoslista de objetos

    Juicios, vistas, plazos y demás señalamientos del expediente.

    Ver los campos de senalamientos
    • tipoenum

      Tipo de señalamiento.

      • juicioJuicio
      • vistaVista
      • comparecenciaComparecencia
      • audiencia_previaAudiencia previa
      • declaracionDeclaración
      • plazoPlazoVencimiento de un plazo procesal o administrativo.
      • otroOtro
    • estadoenum

      Estado del señalamiento.

      • senaladoSeñaladoFijado y pendiente de celebrarse.
      • suspendidoSuspendidoAplazado; puede volver a señalarse con otra fecha.
      • celebradoCelebradoYa tuvo lugar.
      • canceladoCanceladoNo se celebrará.
    • titulotexto

      Título del señalamiento.

    • fecha_iniciofecha

      Inicio, en UTC.

    • fecha_finfechapuede ser null

      Fin, en UTC. null si no tiene.

    • zona_horariatexto

      Zona horaria IANA en la que se fijó.

    • ubicaciontextopuede ser null

      Sala, sede o dirección. null si no consta.

  • intervinienteslista de objetos

    Partes y profesionales que intervienen.

    Ver los campos de intervinientes
    • nombretexto

      Nombre de la persona o entidad.

    • roltextopuede ser null

      Su papel en el asunto (demandado, procurador…).

  • creado_enfecha

    Fecha 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.

Ejemplo de 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"
}
Objeto

Documento

Un archivo de un expediente. El contenido se descarga aparte.

  • objecttexto

    Siempre documento.

  • idtexto

    Identificador del documento en la API. Estable.

    formato doc_…

  • expedientetexto

    Expediente al que pertenece.

    formato exp_…

  • nombretexto

    Nombre visible del documento en Horvell.

  • nombre_archivotexto

    Nombre del archivo, con su extensión.

  • tipo_contenidotexto

    Tipo MIME del archivo.

  • tamanoentero

    Tamaño del archivo en bytes.

  • categoriaenum

    Categorí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 texto

    Etiquetas del documento.

  • origenenumpuede ser null

    Ví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_enfecha

    Fecha de alta del documento, en UTC.

  • actualizado_enfecha

    Última modificación del documento, en UTC.

Ejemplo de 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"
}
Objeto

Subida

Una subida de documento en curso (solo claves de despacho).

  • objecttexto

    Siempre subida.

  • idtexto

    Identificador de la subida. Lo necesitas para completarla.

    formato sub_…

  • estadoenum

    En 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á en documento.
    • caducadaCaducadaPasaron los 30 minutos sin completarla. Empieza otra con una Idempotency-Key nueva.
  • expedientetexto

    Expediente en el que se creará el documento.

    formato exp_…

  • url_subidatextopuede ser null

    URL firmada para hacer PUT del archivo. null si ya se completó.

  • metodotexto

    Método HTTP para enviar el archivo: siempre PUT.

  • cabecerasobjeto

    Cabeceras obligatorias en el PUT (el content-type debe coincidir).

  • url_caduca_enfechapuede ser null

    Hasta cuándo vale url_subida (15 minutos). Si caduca, repite el paso 1 con la misma Idempotency-Key y recibirás una nueva.

  • caduca_enfecha

    Después de esta fecha (30 minutos desde el paso 1) la subida ya no se puede completar.

  • documentotextopuede ser null

    Documento creado al completar. null hasta entonces.

    formato doc_…

Ejemplo de Subida
{
  "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
}
Objeto

Eliminado

Algo que ha dejado de existir para tu clave.

  • objecttexto

    Siempre eliminado.

  • idtexto

    Identificador del registro de eliminación (eli_…).

    formato eli_…

  • tipoenum

    Qué dejó de existir.

    • expedienteExpedienteBórralo junto con todos sus documentos.
    • documentoDocumentoBorra solo ese documento.
  • recursotexto

    Id del expediente (exp_…) o documento (doc_…) que ya no existe para esta clave.

  • expedientetextopuede ser null

    Solo documentos: expediente al que pertenecía.

    formato exp_…

  • motivoenum

    eliminado: 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_enfecha

    Cuándo dejó de existir para esta clave, en UTC.

Ejemplo de Eliminado
{
  "object": "eliminado",
  "id": "eli_6537a1b2c3d4e5f607182934",
  "tipo": "documento",
  "recurso": "doc_6537a1b2c3d4e5f607182936",
  "expediente": "exp_6537a1b2c3d4e5f607182930",
  "motivo": "eliminado",
  "eliminado_en": "2026-10-22T11:20:00.000Z"
}
Objeto

Error

El cuerpo de cualquier respuesta de error (RFC 9457, application/problem+json).

  • typetexto

    Enlace a la explicación de este error en la documentación.

  • titletexto

    Título corto del error.

  • statusentero

    El mismo código HTTP de la respuesta.

  • detailtextopuede faltar

    Explicación concreta de este caso, cuando la hay.

  • codetexto

    Código estable del error. Usa este campo, no title, para decidir qué hacer.

  • request_idtexto

    Identificador de la petición. Inclúyelo si nos escribes.

  • errorslista de objetospuede faltar

    Detalle por campo en errores de validación.

    Ver los campos de errors
    • campotexto

      Campo con el problema, p. ej. limit.

    • mensajetexto

      Qué le pasa.

Ejemplo de Error
{
  "type": "https://api.horvell.com/v1/docs#errores-no_encontrado",
  "title": "No encontrado",
  "status": 404,
  "code": "no_encontrado",
  "request_id": "req_q3Zl8vY1cN0kT5bW"
}
016Referencia

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.

017Versiones

Registro de cambios

  1. 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 filtro referencia para 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.

Preguntas frecuentes

Lo que más nos preguntan sobre la API

Sí. La API de Horvell da acceso a los expedientes y documentos del despacho desde un ERP, un cuadro de mando o cualquier automatización, y permite subir documentos. Es REST, en JSON, y está documentada con un contrato OpenAPI 3.1.

Sí, con una clave de cliente que crea un administrador del despacho desde la ficha del cliente. Esa clave es de solo lectura y solo ve los expedientes de ese cliente: los de otros clientes no existen para ella.

La clave de despacho (hv_tk_) ve todos los expedientes y puede subir documentos si tiene el permiso documentos:write. La clave de cliente (hv_ck_) es de solo lectura y solo ve los expedientes de su cliente. Admiten 600 y 120 peticiones por minuto.

Con una sincronización periódica: primero se piden los eliminados y se borran, y después los expedientes con updated_since para guardar los cambios. Los eliminados se conservan 180 días.

Sí, con una clave de despacho y el permiso documentos:write, en tres pasos: iniciar la subida, enviar el archivo a un enlace firmado y completarla. Admite archivos de hasta 50 MB y los reintentos nunca crean duplicados.