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.
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
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 }
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.
Los documentos de un proceso, con filtros. El parámetro slug es obligatorio; sin él
devuelve error 400.
sluggth, pet, ifo… Recuerda que no siempre coincide con el código del archivo:
ver Codificación.qcarpetalimitGET /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.
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("");
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 |
Sí | Son la descripción pública del documento. |
fechaSubida | Sí, como fecha |
Permite ordenar por novedad. |
url | Sí | Descarga directa del binario. |
uploader.email, uploader.nombre, uploader.uid |
No | Datos personales de quien publicó el archivo. |
metadata (bucket, hash, rutas internas) |
No | Detalle de infraestructura sin valor para el consumidor. |
storagePath | No | Ruta interna del almacenamiento. |
Rendimiento y buenas prácticas
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.
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.
Filtra en el servidor
Usar q y carpeta es más barato que traerse todo y filtrar en el cliente.
Prevé el proceso vacío
Un proceso sin documentos devuelve total: 0 e items: [], no un error. Tu interfaz
debe contemplarlo.
- Un
sluginexistente también devuelve lista vacía, no 404: valida contra/procesos.
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.
/sig/api/public/formatos?slug=pet abierto directamente, mostrando el JSON con
sus elementos.