Skip to main content
REST and GraphQL surface of the Observal server. Unless noted, endpoints require authentication via Bearer token or API key (Authorization: Bearer <token> or X-API-Key: <key>). Base path: /api/v1.

Auth

Registry

Per type: mcps, agents, skills, hooks, prompts, sandboxes. All {id} parameters accept a UUID or a name. POST /{type}/{id}/install accepts version for agents, MCP servers, skills, and hooks. The response reports the version that was installed; component installs also return its version_id and content digest.

MCP webhook sync

Owner routes manage GitHub or GitLab webhook sync for one MCP listing. See Sync an MCP server from GitHub or GitLab.

Registry forks

Only authenticated users can fork an approved listing and an approved base release. The result is an independently owned draft; no source content or counts are changed. For component endpoints, {type} is one of mcps, skills, hooks, prompts, or sandboxes. Diff access follows normal fork-version permissions. If the upstream is no longer visible or its approved base is gone, comparison returns 404, never a saved source reference. Component diffs omit secret environment/header values and use a digest marker for install content excluded from public version responses. Fork and customize describes the workflow.

Agent versions and locks

Each agent version pins exact component versions. Installs generate every component from its pinned version. Agent versions released before pinning can have unlocked components: those install at their latest approved release, are reported with source: fallback-latest in the install lock, and are refused by a strict install. A component reference’s version must name an approved (or archived) release. Drafts may also pin a release that is not approved yet, but only a caller who may read it (its owner, co-authors, admins, and reviewers); to anyone else it does not exist, as on the component version routes. POST /agents/{id}/install also accepts strict. Its response includes version (the agent version installed) and lock: status (locked, partial, or unlocked), digest, components with each one’s source, and problems. With strict: true, any problem is a 409 and nothing is generated.

Scan

Review

Discovery (ARD)

Agentic Resource Discovery endpoints. Authentication is optional: anonymous callers see public, approved resources only when deployment.public_registry_enabled is on; authenticated callers see what the registry’s visibility rules already grant them (public, their teams’, and their own drafts). Errors use the ARD envelope {"errorCode": "INVALID_ARGUMENT", "message": "..."}. See ADR 0001. Search request body follows the spec: {"query": {"text": "...", "filter": {...}}, "federation": "none", "pageSize": 5}. Supported filter terms: type, tags, capabilities, publisher, version, obs:kind, obs:supportedHarnesses, obs:lifecycle, obs:activatable, obs:forksOf. The last filter takes one upstream urn:air: identifier and returns only currently public approved direct forks. Search, List, entry, and manifest serialization add obs:forkedFrom only while both fork and source are currently public and approved; private lineage is never projected from a saved reference.

Remote A2A agents

Remote agents are registered by Agent Card URL and reviewed before anyone can delegate to them. They then appear in search as type: application/a2a-agent-card+json with the reviewed card pinned in the entry (obs:agentCard, obs:a2aInterface). Clients call the agent directly; the server does not proxy A2A traffic. See ADR 0002. Cards must be served over https from a public address. Internal hosts are allowed individually with the discovery.a2a_private_hosts setting. The discovery.delegation_enabled setting (default on) adds the observal-agents MCP server to every pulled Agent.

Telemetry

Session record identity is scoped by project, user, harness, session ID, and source line index. Retrying the same content at the same index is safe; different content at an already acknowledged index returns 409. Final session requests can include session_hash and hashed_line_count. The response includes integrity_ok, server_hash, and repair_from_line. A failed audit rewinds the durable checkpoint to the first affected range; the exporter then replays that range idempotently. Hashing and canonical manifest scans occur only for final/audit requests, not incremental ingest.

Telemetry hooks

Alerts

Feedback

Admin

Requires admin or super_admin role.

GraphQL

Single endpoint, query + subscription via WebSocket. Subscriptions use graphql-ws protocol.

Health

Rate limiting

Auth endpoints are subject to RATE_LIMIT_AUTH and RATE_LIMIT_AUTH_STRICT. Non-auth endpoints are not rate-limited by default; put a reverse proxy or API gateway in front if you need it.

Request size limits

MAX_REQUEST_SIZE_MB (default 10) caps body size on all endpoints. Large telemetry batches may need tuning.