Especificación · SIG

API pública

El SIG expone su catálogo documental como una API de solo lectura, sin autenticación y con CORS abierto. Existe para que otras aplicaciones institucionales puedan ofrecer los formatos del sistema sin copiar los archivos ni mantener una lista paralela que se desactualice.

Base: https://sigunitropico.co/sig/api/public. Todas las respuestas son JSON. Todas llevan cabeceras de caché de cinco minutos y permiten cualquier origen, así que se pueden llamar directamente desde el navegador.

Los cuatro endpoints

GET/health

Ping de disponibilidad. Devuelve si el servicio responde, cuántos procesos tiene cargados y la versión de la API. Útil para monitorización.

{ "ok": true, "procesos": 16, "version": 1 }
GET/procesos

El mapa de procesos completo. Es la puerta de entrada: de aquí salen los slug que necesitan los demás endpoints.

{
  "procesos": [
    { "slug": "git", "nombre": "Gobierno Institucional y Transparencia",
      "icon": "fa-scale-balanced", "categoria": "estrategico" },
    { "slug": "pet", "nombre": "Planeación Estratégica",
      "icon": "fa-diagram-project", "categoria": "estrategico" },
    …
  ]
}

Las categorías son estrategico, misional, apoyo y evaluacion.

GET/formatos?slug={proceso}

Los documentos de un proceso, con filtros. El parámetro slug es obligatorio; sin él devuelve error 400.

slug
Obligatorio. Slug del proceso: gth, pet, ifo… Recuerda que no siempre coincide con el código del archivo: ver Codificación.
q
Búsqueda por texto sobre nombre, carpeta y formato. Se parte en palabras y se exige que todas aparezcan.
carpeta
Filtra por nombre exacto de carpeta, sin distinguir mayúsculas.
limit
Máximo de resultados. Por defecto 50, tope 500.
GET /sig/api/public/formatos?slug=pet&q=acta&limit=20

{
  "slug": "pet",
  "total": 3,                    ← coincidencias antes de aplicar el límite
  "items": [
    {
      "slug": "pet",
      "key": "-OiEqka8kZyFvznPLH5C",
      "nombre": "FR-PET-07.01 ACTA DE REUNIÓN.docx",
      "carpeta": "Formatos",
      "formato": "WORD",
      "peso": 57734,
      "fecha": 1761843497214,
      "url": "https://…",              ← descarga directa del binario
      "descargar_url": "/sig/descargar/pet/-OiEqka8kZyFvznPLH5C"
    }
  ]
}

Los resultados vienen ordenados por nombre ascendente, con criterio de español.

GET/formatos/{slug}

Atajo equivalente a /formatos?slug={slug}, con los mismos filtros opcionales. Cómodo cuando se construyen rutas por concatenación.

GET /sig/api/public/formatos/gth?carpeta=Procedimientos

Un ejemplo completo

Listar los procedimientos de un proceso y pintarlos como enlaces, en cuatro líneas útiles.

const base = "https://sigunitropico.co/sig/api/public";

// 1 · descubrir los procesos
const { procesos } = await fetch(`${base}/procesos`).then(r => r.json());

// 2 · pedir los documentos de uno de ellos
const { items } = await fetch(`${base}/formatos?slug=gth&carpeta=Procedimientos&limit=200`)
  .then(r => r.json());

// 3 · enlazar a la página de descarga, NO al binario
const html = items.map(f =>
  `<a href="https://sigunitropico.co${f.descargar_url}">${f.nombre}</a>`
).join("");
Enlaza a descargar_url, no a url. La página de descarga presenta el documento antes de entregarlo, registra el uso cuando hay sesión y sobrevive a los cambios de configuración del almacenamiento. El campo url es el binario crudo.

Qué no devuelve

La API aplica una proyección explícita sobre el registro del documento: construye la respuesta campo a campo en lugar de devolver el registro tal cual. Eso hace imposible que un campo nuevo se filtre por descuido.

Campo del registro¿Se expone?Motivo
nombre, carpeta, formato, peso Son la descripción pública del documento.
fechaSubidaSí, como fecha Permite ordenar por novedad.
urlDescarga directa del binario.
uploader.email, uploader.nombre, uploader.uid NoDatos personales de quien publicó el archivo.
metadata (bucket, hash, rutas internas) NoDetalle de infraestructura sin valor para el consumidor.
storagePathNo Ruta interna del almacenamiento.

Rendimiento y buenas prácticas

1

Respeta la caché

Las respuestas se sirven con caché de cinco minutos y el servicio mantiene además su propia caché en memoria. Consultar en cada pintado de pantalla no acelera nada y multiplica el tráfico.

2

Pide por proceso, no todo el catálogo

No hay endpoint que devuelva los seiscientos documentos de una vez, y es intencional. Pide el proceso que necesitas.

3

Filtra en el servidor

Usar q y carpeta es más barato que traerse todo y filtrar en el cliente.

4

Prevé el proceso vacío

Un proceso sin documentos devuelve total: 0 e items: [], no un error. Tu interfaz debe contemplarlo.

  • Un slug inexistente también devuelve lista vacía, no 404: valida contra /procesos.
5

Maneja el 400 y el 500

Sin slug obtienes 400 con { "error": "slug requerido" }. Si falla la lectura del repositorio, 500 con error y detail.

Respuesta de la API en el navegador
Captura de /sig/api/public/formatos?slug=pet abierto directamente, mostrando el JSON con sus elementos.
Espacio para screenshot

Por dónde seguir

Modelo de datos

El registro completo del que sale esta proyección.

Rutas de acceso

Todas las direcciones del sitio, no solo la API.

Enlaces de descarga

Qué hace exactamente descargar_url.

Caso de uso

Integrar el catálogo en otra aplicación, paso a paso.