Skip to content

Referencia REST API

El manager expone una única REST API rooteada en /api. La SPA en web/ la llama; puedes llamarla directamente con cualquier cliente HTTP. No hay GraphQL, no hay gRPC para tráfico de aplicación (gRPC solo se usa para el túnel geminio, interno al manager).

Esta página es un catálogo de rutas, no una especificación swagger escrita a mano. Fuente de verdad: cmd/ongrid/main.go (los mounts chi.Router) y internal/manager/server/*/http.go (los handlers por-BC). Click al handler para los campos exactos de struct request/response.

Convenciones

  • Base path: cada ruta tiene prefijo /api. Así GET /v1/edges se alcanza en https://<manager>/api/v1/edges.
  • Versionado: todas las rutas están bajo /v1/. No hay /v2/. Cambios incompatibles hacia atrás se distribuyen detrás de feature flags o nuevas rutas.
  • Auth: bearer JWT en Authorization: Bearer .... Las rutas públicas (login, refresh, register, webhooks IM, probe auth_request de Prometheus) saltean el middleware. Listadas en la tabla "Public" abajo.
  • Roles: admin, user, viewer. Las rutas de escritura requieren admin (o la acción casbin relevante como edge:* / write); las rutas de lectura aceptan cualquier rol autenticado. viewer puede chatear pero el toolbag del agente se filtra a ClassSafe. Ver ADR-022 three-role RBAC.
  • Errores: JSON {"error":"code","message":"human text"}. Los códigos son enums estables (not_found, invalid_argument, unauthorized, forbidden, conflict).
  • Content type: cada request y response es application/json salvo que se note explícitamente (chat streamed es SSE, ingest de log/traza es OTLP-protobuf o Loki-JSON).

Rutas públicas (sin auth)

MétodoPathPropósito
GET/healthzprobe de liveness
GET/readyzprobe de readiness
GET/internal/auth/dataplane-verifyprobe auth_request de nginx para ingest de log/traza
POST/api/v1/auth/loginintercambia email+password por JWT
POST/api/v1/auth/refreshintercambia refresh token por un access token fresco
POST/api/v1/auth/registerself-registration (gateado por config)
GET/api/v1/prometheus/authprobe auth_request de nginx para el embed de Grafana
POST/api/v1/im/feishu/eventscallback entrante de Feishu/Lark; la firma webhook es la auth

Rutas autenticadas

iam (usuarios, orgs, sesiones)

MétodoPathRolFuente
GET/v1/versionanycmd/ongrid/main.go (inline)
GET/v1/meanyinternal/iam/server/http.go
GET/v1/selfanyinternal/iam/server/http.go
GET/v1/usersanylistar usuarios
POST/v1/usersadmincrear usuario
PATCH/v1/users/{id}adminactualizar usuario (nombre, email)
PATCH/v1/users/{id}/passwordself o adminrotar password
PATCH/v1/users/{id}/roleadmincambiar rol (admin/user/viewer)
DELETE/v1/users/{id}adminremover usuario
GET/v1/orgsanylistar orgs
POST/v1/orgsadmincrear org
PATCH/v1/orgs/{id}adminactualizar org
DELETE/v1/orgs/{id}adminremover org
GET/v1/orgs/{id}/membersanylistar miembros
POST/v1/orgs/{id}/membersadminañadir miembro
PATCH/v1/orgs/{id}/members/{user_id}admincambiar rol de miembro
DELETE/v1/orgs/{id}/members/{user_id}adminremover miembro

edge (el agente conectado al túnel)

MétodoPathRolDescripción
POST/v1/edgesedge:*crea edge, emite access+secret keys
GET/v1/edgesanylistar edges
GET/v1/edges/{id}anyobtener detalle del edge
DELETE/v1/edges/{id}edge:*borrar edge
POST/v1/edges/{id}/rotate-secretedge:*rotar la secret key
POST/v1/edges/{id}/upgradeedge:*disparar upgrade remoto del agente con URL+sha256 explícitos
POST/v1/edges/{id}/upgrade-packageedge:*upgrade de bundle de un clic (ADR-024)
GET/v1/edges/{id}/processesanylista de procesos read-only (RPC on-demand)
GET/v1/edges/{id}/pluginsanylistar plugins configurados + vivos del edge (con health)
PUT/v1/edges/{id}/plugins/{name}edge:pluginhabilitar/deshabilitar + tunear un plugin
GET/v1/integrations/plugin-countsanycounts globales de plugin enable/disable (para el tile de homepage)

device (entidad host, desacoplada del estado del túnel)

MétodoPathRolDescripción
GET/v1/devicesanylistar host devices
GET/v1/devices/{id}anyobtener detalle del device
PATCH/v1/devices/{id}device:*actualizar nombre de display, tags
DELETE/v1/devices/{id}device:*remover device
PATCH/v1/devices/{id}/rolesdevice:*asignar roles (db, web, cache...)
GET/v1/devices/{id}/edgesanyedges representando actualmente este device
GET/v1/devices/{device_id}/shellwebshellabrir un stream WebSSH (upgrade de websocket)

topology (CMDB tipada)

MétodoPathRolDescripción
GET/v1/topology/node-typesanylistar schemas de node-type
POST/v1/topology/node-typestopology:*crear node type
GET/v1/topology/node-types/{name}anyobtener un node type
DELETE/v1/topology/node-types/{name}topology:*remover node type
GET/v1/topology/nodesanylistar nodos (filtro por type, tag)
POST/v1/topology/nodestopology:*crear nodo
GET/v1/topology/nodes/{id}anyobtener nodo
PATCH/v1/topology/nodes/{id}topology:*actualizar nodo
DELETE/v1/topology/nodes/{id}topology:*remover nodo
GET/v1/topology/relation-typesanylistar schemas de relation-type
POST/v1/topology/relation-typestopology:*crear relation type
GET/v1/topology/relation-types/{name}anyobtener un relation type
DELETE/v1/topology/relation-types/{name}topology:*remover relation type
GET/v1/topology/relationsanylistar edges (relaciones)
POST/v1/topology/relationstopology:*crear relación
GET/v1/topology/relations/{id}anyobtener relación
PATCH/v1/topology/relations/{id}topology:*actualizar relación
DELETE/v1/topology/relations/{id}topology:*remover relación

alert (reglas, incidentes, canales)

MétodoPathRolDescripción
GET/v1/alert-rulesanylistar reglas
POST/v1/alert-rulesalert:*crear regla
GET/v1/alert-rules/{id}anyobtener regla
PUT/v1/alert-rules/{id}alert:*reemplazar regla
DELETE/v1/alert-rules/{id}alert:*remover regla
POST/v1/alert-rules/{id}/enabledalert:*flippear flag enabled
POST/v1/alert-rules/previewalert:*dry-run una definición de regla contra data actual
GET/v1/alerts/incidentsanylistar incidentes (filtros: status, severity, scope)
GET/v1/alerts/incidents/{id}anyobtener incidente
GET/v1/alerts/incidents/{id}/eventsanytimeline de eventos
POST/v1/alerts/incidents/{id}/ackanyacknowledge
POST/v1/alerts/incidents/{id}/resolveanymarcar resuelto
POST/v1/alerts/incidents/{id}/silenceanysilenciar por N horas
GET/v1/alerts/incidents/{id}/investigationanyobtener el informe de investigación generado por IA
POST/v1/alerts/incidents/{id}/investigationanydisparar o re-ejecutar la investigación
GET/v1/alerts/runtime-infoanypace del evaluator + stats del último ciclo
GET/v1/notification-channelsanylistar canales
POST/v1/notification-channelschannel:*crear canal
GET/v1/notification-channels/{id}anyobtener canal
PUT/v1/notification-channels/{id}channel:*reemplazar canal
DELETE/v1/notification-channels/{id}channel:*remover canal
POST/v1/notification-channels/{id}/testchannel:*enviar una notificación sintética

Ver Esquema de reglas de alerta para la forma JSON de una regla.

aiops (chat, agentes, modelos)

MétodoPathRolDescripción
GET/v1/agentsanylistar personas de agente
GET/v1/agents/{name}anyobtener detalle de persona
DELETE/v1/agents/{name}agent:*borrar una persona built-in / on-disk (raro; usualmente solo custom es borrable)
POST/v1/agents/customagent:*crear una persona definida por usuario
PATCH/v1/agents/custom/{name}agent:*actualizar persona de usuario
DELETE/v1/agents/custom/{name}agent:*borrar persona de usuario
GET/v1/chat/sessionsanylistar sesiones
POST/v1/chat/sessionsanycrear sesión
PATCH/v1/chat/sessions/{id}anyrenombrar / taguear una sesión
DELETE/v1/chat/sessions/{id}anyborrar sesión
GET/v1/chat/sessions/{id}/messagesanyhistoria de mensajes
POST/v1/chat/sessions/{id}/messagesanyenviar un mensaje (no-streaming, devuelve respuesta final)
POST/v1/chat/sessions/{id}/messages/streamanyenviar un mensaje (stream SSE de eventos token + tool-call)
GET/v1/aiops/modelsanyproviders + modelos disponibles (gateado por API keys configuradas)
POST/v1/aiops/query-translateanycomposición LLM-asistida de PromQL / LogQL / TraceQL
GET/v1/aiops/mentions/searchanyautocompletado para menciones @edge, @device, @dashboard
GET/v1/usage/todayanyuso de tokens para el UTC-día actual

Ver Formato de persona de agente para la forma del frontmatter markdown.

knowledge (RAG, vault, repos, uploads)

MétodoPathRolDescripción
GET/v1/knowledge/docsanylistar documentos (árbol)
POST/v1/knowledge/docsknowledge:*crear documento
GET/v1/knowledge/docs/{id}anyobtener documento
PATCH/v1/knowledge/docs/{id}knowledge:*editar cuerpo del documento
PATCH/v1/knowledge/docs/{id}/moveknowledge:*mover a otro path
DELETE/v1/knowledge/docs/{id}knowledge:*remover documento
GET/v1/knowledge/pathsanylistar nodos de path (para el árbol)
GET/v1/knowledge/reposanylistar repos Git
POST/v1/knowledge/reposknowledge:*registrar un repo
DELETE/v1/knowledge/repos/{id}knowledge:*remover repo
POST/v1/knowledge/repos/{id}/syncknowledge:*disparar un re-sync
POST/v1/knowledge/uploadknowledge:*upload .md / .txt / .pdf / .docx (parseado vía docextract)
GET/v1/knowledge/searchanyquery RAG (devuelve chunks + scores)
POST/v1/knowledge/vault/syncknowledge:*re-pull del vault integrado desde GitHub
GET/v1/knowledge/ssh-identitiesknowledge:*listar SSH keys para auth de Git
POST/v1/knowledge/ssh-identitiesknowledge:*registrar una SSH key existente
POST/v1/knowledge/ssh-identities/generateknowledge:*generar un nuevo keypair (la private key nunca sale del servidor)
PATCH/v1/knowledge/ssh-identities/{id}knowledge:*editar identidad (nombre, comment)
DELETE/v1/knowledge/ssh-identities/{id}knowledge:*remover identidad

skill (introspección del toolbag)

MétodoPathRolDescripción
GET/v1/skillsanylistar skills (manager-scope + edge-scope)
GET/v1/skills/{key}anyobtener detalle de skill (schema, description, scope, class)
POST/v1/skills/{key}/executeskill:*ejecución directa de skill (testing / debugging)

Ver Skill manifest para la forma de skill.json en disco.

logs / traces (proxies read-only)

MétodoPathRolDescripción
GET/v1/logs/query_rangeanyLogQL query_range proxied
GET/v1/logs/labelsanylabel-names proxied
GET/v1/logs/labels/{name}/valuesanylabel-values proxied
GET/v1/traces/searchanyTraceQL /api/search proxied
GET/v1/traces/{trace_id}anyuna traza por ID
GET/v1/traces/tags/{tag}/valuesany/api/search/tag/.../values proxied

monitor (dashboards / paneles)

MétodoPathRolDescripción
GET/v1/monitor/panelsanylistar paneles
POST/v1/monitor/panelsmonitor:*crear panel
PATCH/v1/monitor/panels/{id}monitor:*editar panel
DELETE/v1/monitor/panels/{id}monitor:*remover panel
GET/v1/observability/dashboards/{uid}anyJSON de dashboard Grafana listo para render

metric (snapshot de métrica por-edge)

MétodoPathRolDescripción
GET/v1/edges/{id}/metricsanysnapshot más reciente del conjunto cerrado de métricas de host

prometheus (admin)

MétodoPathRolDescripción
POST/v1/prometheus/launchadmin(re-)lanzar el Prometheus embedded
POST/v1/prometheus/query_rangeanyquery_range cara al LLM-tool (devuelve matrix normalizada)

imbridge (superficies de chat — Slack / Telegram / Lark / DingTalk / WeCom)

MétodoPathRolDescripción
GET/v1/im/appsanylistar apps IM conectadas
POST/v1/im/appsim:*registrar app IM
GET/v1/im/apps/{id}anyobtener app
PUT/v1/im/apps/{id}im:*actualizar app
DELETE/v1/im/apps/{id}im:*remover app
POST/v1/im/apps/{id}/revealadminrevelar secrets enmascarados

marketplace (skill packs)

MétodoPathRolDescripción
GET/v1/marketplace/registriesanylistar registries configurados
GET/v1/marketplace/installedanylistar packs instalados
POST/v1/marketplace/installmarketplace:*instalar pack desde un registry
DELETE/v1/marketplace/installed/{pack_id}marketplace:*desinstalar pack

setting (system settings: integraciones, defaults, secrets)

MétodoPathRolDescripción
GET/v1/system-settingsanylistar settings visibles
PUT/v1/system-settings/{category}/{key}adminupsert setting
DELETE/v1/system-settings/{category}/{key}adminremover setting
GET/v1/system-settings/{category}/{key}/revealadminrevelar secret enmascarado

integration (tests de conectividad)

MétodoPathRolDescripción
POST/v1/integrations/grafana/syncadminsincronizar dashboards + datasources
POST/v1/integrations/grafana/testadmintestear conexión Grafana
POST/v1/integrations/llm/invalidateadmininvalidar cliente LLM cacheado (fuerza re-lectura de API keys)
POST/v1/integrations/loki/testadmintestear conexión Loki
POST/v1/integrations/prom/testadmintestear conexión Prometheus
POST/v1/integrations/tempo/testadmintestear conexión Tempo
POST/v1/integrations/websearch/testadmintestear backend SearXNG / web-search

webshell (shell interactivo sobre el túnel)

MétodoPathRolDescripción
GET/v1/devices/{device_id}/shellwebshellabrir stream SSH upgraded a WebSocket
GET/v1/webshell/sessionsanylistar sesiones activas
DELETE/v1/webshell/sessions/{id}webshellmatar una sesión

audit (admin log)

MétodoPathRolDescripción
GET/v1/admin/audit-logsadmintrail de audit tenant-wide (HLD-010)

Paginación

Los endpoints de lista usan cursors opacos:

text
GET /v1/edges?limit=50&cursor=eyJpZCI6MTAwMH0

La respuesta lleva {"items":[...], "next_cursor":"...", "total":...}. next_cursor está vacío en la última página.

Rate limits

No hay rate limits globales en el build open-source. El gate de budget LLM (ONGRID_LLM_DAILY_TOKEN_LIMIT) acota el tráfico de chat — todo otro endpoint depende de lo que pongas delante del manager (nginx, tu propio gateway).

Versionado

GET /v1/version devuelve {"manager_version":"vX.Y.Z"}. La SPA lee esto y flaggea edges cuya versión de agente drifta del manager. Úsalo para tooling de upgrade.

Ver también