Skip to content

Pre-release. v0.1 is not out yet, so there is nothing to install and no public source to clone — the quickstart builds from a checkout.

The admin API

The admin API manages agent registrations at /admin/agents. It is meant for operators and GitOps tooling, not for agents or end users.

Every admin request carries one shared API key as a bearer token:

Authorization: Bearer <Onbe:Admin:ApiKey>

The key is set with Onbe:Admin:ApiKey (environment variable Onbe__Admin__ApiKey) and must be at least 32 characters; generate it with openssl rand -base64 32. When it is not set the admin API is disabled and every /admin request answers 503. A missing or wrong key answers 401 and writes an admin.denied record to the audit ledger.

Proper admin identities and role-based access control are out of scope for v0.1. There is one key, it grants every admin operation, and rotating it means changing the setting and restarting.

Method Path Result
POST /admin/agents 201 with the agent; 400 with per-field errors; 409 if the id exists
GET /admin/agents 200 with every agent
GET /admin/agents/{agent_id} 200 or 404
PATCH /admin/agents/{agent_id} 200 with the merged agent; 400; 404
DELETE /admin/agents/{agent_id} 204; 404; 409 while the agent still has tasks
DELETE /admin/agents/{agent_id}/tasks 200 with {"revoked_tasks": n}; 404
DELETE /admin/tasks/{task_id} 200 with {"revoked_tasks": n}; 404
GET /audit 200 with one page of audit records; 400 with per-field errors

The POST body is the registration payload of the spec. The PATCH body is any subset of those fields plus enabled; the merged registration is validated as a whole. Every mutation writes agent.registered, agent.updated or agent.deleted to the audit ledger in the same transaction, so the ledger and the registry cannot disagree.

Disabling an agent ("enabled": false) takes effect on the next request: agents are read from storage per request and never cached.

GET /audit is the query of spec section 7.2, behind the same key. Filter with any of sponsor, agent_id, task_id, from, to and decision; page with limit (default 100, at most 1000) and the next_cursor of the previous page passed as cursor. Records come back oldest first, each in the ledger’s own shape with the hashes as hex, so a page can be checked against audit-verify output. The query only reads; nothing about it is written to the ledger except a failed authentication.

DELETE /admin/tasks/{task_id} revokes the task, every task delegated from it at any depth, and every grant under them, with reason operator_kill_switch on the task named and parent_revoked on its descendants. DELETE /admin/agents/{agent_id}/tasks does the same for every live task of the agent. Both write one task.revoked record per task in the same transaction. Both are idempotent: a repeat answers 200 with revoked_tasks: 0 and writes nothing.

Tokens already issued stay valid until they expire, bounded by the agent’s max_token_ttl, unless the tool server calls introspection per request as it must for high_risk_audiences. Refreshing a revoked task fails at once with access_denied.

OnbePre-release. v0.1 is not out yet.

© 2026 Onbe