Status: Draft v1. The spec covers authentication, the read-only catalogs (plans, models, runtimes, tools, team templates), agent and team management (list / create / get / update / delete), and agent chat (OpenAI-compatible, with streaming). More endpoints are added over time. Documented endpoints are stable — we only add fields, never rename or remove them, without a version bump.
Base URL
/api/v1/.
The OpenAPI spec
The full machine-readable spec is served straight from the backend and always matches the live API (it’s generated from the server code, so it never drifts):Authentication
All API calls authenticate with an API key passed as a Bearer token:Creating an API key
- Sign in at clawup.org.
- Go to Account → API Keys.
- Click Create key, choose the permissions the key should grant and an optional expiry, then confirm.
- Click Reveal to show the key, then Copy it.
Keys are prefixedcu_. Older keys with aneb_prefix continue to work.
Permissions (scopes)
Each key grants a set of<resource>:<action> scopes, chosen when you create it:
New keys default to read-only (
agents:read, teams:read). A request made with a key that lacks the scope a route requires returns 403 SCOPE_FORBIDDEN. (Browser/session logins from the dashboard are unrestricted.)
Quick example
Verify your key by fetching your own account:Chat with an agent
The chat endpoint is OpenAI-compatible, so you can point any OpenAI client (or a rawcurl) at it. Use the agent’s id in the path. Requires the agents:chat scope.
"model": "openclaw" to route to the agent’s own configured model. Only the last user message is sent — earlier turns are loaded from the agent’s stored transcript on the server.
Streaming
Set"stream": true to receive a text/event-stream of OpenAI chat.completion.chunk frames, terminated by data: [DONE]:
GET /api/v1/agents/AGENT_ID/chat (requires agents:read).
Available endpoints (v1)
See
https://api.clawup.org/openapi.json for the authoritative, always-current list, request/response schemas, and which endpoints require authentication.
Errors
Errors use a consistent JSON shape:error field is a stable string code (e.g. AUTH_401); message is human-readable and may change. A 401 means the key is missing, invalid, expired, or revoked. A 403 SCOPE_FORBIDDEN means the key is valid but lacks the scope the route requires — mint a key with the right permission (see Permissions).
Versioning
Every route is under/api/v1/. Breaking changes ship as a new version (/api/v2/) and the old version keeps working during a deprecation window. Within a version, we only add optional request fields and additive response fields.