https://api.opencomputer.dev/v3. Management calls authenticate with your org API key; stream and steer also accept a client token.
Each section toggles between the TypeScript SDK (@opencomputer/sdk), REST, and the oc CLI — pick one and the whole page follows.
The SDK uses camelCase for fields and params (
last_turn → lastTurn, idempotency_key → idempotencyKey); the wire shapes below are raw JSON. Opaque blobs — session metadata, event refs/raw — pass through verbatim; everything else (incl. event body) is camelCased. The CLI prints a table, or raw JSON with --json.Sessions
- TypeScript SDK
- REST API
- oc CLI
agent is required; the model resolves to Managed (default) or a credential, else 422 no_credential / 422 managed_unavailable.
input— the task (string or envelope). Truncate large inputs; let the agent fetch the rest via sandbox tools.revision?: pin a specific revision (number /rev_…); default = the agent’s active one. Use to test a staged built-in runtime revision. A Flue agent has one live Worker, so an old revision does not isolate older Worker code.model?— run this session on a different model than the agent’s (sameprovider/modelform; its provider must match the agent’s runtime, e.g.anthropic/…forclaude). Default = the agent’s model. Pinned for the session’s life like the rest of the snapshot. Rejected (400 invalid) for flue agents — their model is fixed in the deployed artifact.key?— get-or-create (one session per key). Keyless: anIdempotency-Keyheader makes create retry-safe.metadata?— opaque routing state (≤ 16 KB); on get/list + verbatim in webhooks; never sent to the model, not indexed.limits?{ tokens, turn_seconds, turns }: non-monetary; tripping one ends a built-in runtime turn with the matchingyield_reason. These limits are stored but not yet enforced for Flue sessions.sources?: repos checked out before turn 1 for built-in runtimes (the token never enters the sandbox; see GitHub). Each registered{ repo, ref, sha?, name? }or inline{ url, ref, sha, name?, auth }.refis required;shais required for inline sources but optional for a registered repo. Flue sessions rejectsourceswith422 sources_not_supported.- Client tokens:
scopes?(read/steer),ttl?60–86400 s (SDKttlSeconds).
Session
Turn
A turn’s
yield_reason tells you why it stopped:
SessionSource — one of two variants:
SourceSummary (sanitized; on create + GET …/sources)
Events
- TypeScript SDK
- REST API
- oc CLI
type (exact or prefix.*), turn_id, limit. after resumes from a seq; level is a visibility threshold — user < progress < internal (default internal; see visibility levels). Switch on type, don’t parse prose. …/messages is an alias for level=user + type=*.message.
Event
Steer
- TypeScript SDK
- REST API
- oc CLI
{ text, idempotency_key? } or { envelope }. Returns 202 (or 200 on idempotent replay) with { event: { id, seq }, session: { id, status, head } }.
Watches
Managed with the SDK (session.watches.create/list/delete), the CLI (oc session watch/watches/unwatch), or REST — authenticate with your org API key (server-side). The agent-facing path is the watch_pull_request runtime tool. Full guide: Watches.
wake_on is the wake condition (checks default · review · comment · merge); intent is the freeform “why,” replayed on wake. repo/pr are optional — omitted, they resolve to the PR this session opened. A watch fires only on PRs the same session opened, on Connected-App (oc_app) repos. Limits: 10 active watches per session, 30-day TTL (and never outlives the PR).
Watch
Delivered events — appended into the session log at level
user with source: "github", carrying a normalized summary (not the raw webhook): github.pr.checks_completed · github.pr.review_submitted · github.pr.comment · github.pr.merged · github.pr.closed.
Agents
- TypeScript SDK
- REST API
- oc CLI
name, prompt, model, runtime? (claude|codex), key?, credential?, limits?. PATCH takes the same minus runtime (fixed at create). runtime/model provider must agree (claude↔anthropic/…, codex↔openai/…). credential: a cred_… id (BYO, provider-matched) or "managed" (via OpenComputer, billed to credits) — mutually exclusive with key.
POST /agents is idempotent by name: fresh → 201, matching config → 200, differing → 409. Editing prompt/model (here or via deploy) creates a revision; the agent keeps a pointer to its active revision (GET /agents/:id → active_revision) and sessions pin it. The agent row holds only identity + bindings.
POST /agents/import is the reviewed repository-import command described below. It deliberately creates
an agent with no active revision; revision #1 appears only after the queued build and live deployment
verify successfully.
Deployments and revisions
You deploy an agent’s behavior. A deployment is a time-aware attempt; only a successful attempt produces an immutable revision. Failed attempts and their logs remain in deployment history. See the Deployments & revisions guide.Review and import a repository agent
Review resolves the moving production branch to one exact commit and interprets bounded metadata without executing repository code. Repository-first import currently accepts the exact Flue result.GET /github/deploy-app returns the installed OpenComputer GitHub App and its pickable repositories.
Each repository includes linked_sources[] with the owner-scoped path, production_ref, status,
and owning agent { id, name }. Clients should block review when the selected normalized root has a
claim. This is an early user-facing check; import repeats the uniqueness check transactionally.
root, production_ref, exact sha,
review_fingerprint, and one interpretation:
Exact Flue review
interpretation.disposition is exact, invalid, or unrecognized. Invalid and unrecognized are
successful review responses, not service failures: invalid includes bounded issues; an
unrecognized root can include up to 20 candidate_roots and explicitly reports truncation. Only
exact includes a deployable profile and may proceed to import. No response contains a repository
token or source bytes.
The non-exact variants keep the common repository/root/SHA/fingerprint fields shown above and use
these shapes:
Invalid or unrecognized interpretation
source_profile: null, source_profile_version: null, and
reason_code: "unrecognized_source". Its optional candidate entries are
{ path, source_profile: "flue-app-v1" | null, summary, marker }; selecting one always performs a
new review. candidate_roots_truncated means more matches existed than the bounded response could
return, so ask the user to choose a narrower root rather than selecting one automatically.
Import sends the same source coordinates, a human-readable agent name, and the exact review receipt.
The name is independent of the Flue entrypoint in agent.toml.
{ agent, source, deployment } atomically. If the branch head or relevant source changed, it returns
409 source_changed_re_review and creates nothing. Reusing the same idempotency key and command
returns the same import; reusing it with different fields returns 409 idempotency_conflict. A name
or repository-root conflict also returns 409 and identifies the existing agent when available.
The source remains linked after import. Its source_profile, source_profile_version, and
review_fingerprint describe the reviewed source identity. A later GitHub push that touches the
selected production root automatically creates the next deployment. If that root no longer matches
the imported source profile, the link status becomes source_profile_changed; no build starts and
the current active revision remains unchanged.
Deploy
- TypeScript SDK
- REST API
- oc CLI
input: { type:"inline", prompt, model?, skills?, runtime? } (the complete built-in
behavior — omitted skills = none) or { type:"github", ref?, sha? } (deploys an already-linked
repository; repo/path come from the server-owned link). activate:false stages an inline built-in
deployment. Built-in GitHub links remain branch-driven. A new Flue repository agent instead starts
with POST /agents/import; import deploys the reviewed production head,
and subsequent production-branch pushes deploy automatically. Flue has no preview/staged Worker.
POST …/revisions is inline-only sugar.
Deployment
List returns
{ data, next_cursor }. Log reads return
{ data: [{ seq, cursor, recorded_at, phase, stream, chunk }], next_cursor, has_more }; treat seq
and both cursors as opaque strings. Continue with after=next_cursor until has_more is false, then
poll again while the deployment is nonterminal. Source archives, bundles, credentials, raw provider
responses, and operator telemetry are never projected through these APIs.
Revisions, rollback & promote
- TypeScript SDK
- REST API
- oc CLI
:rev is a number or rev_… id. Activate moves the active pointer instantly (no rebuild); rollback (earlier) and promote (a staged one) are the same call.
Revision
Skills
- TypeScript SDK
- REST API
- oc CLI
SKILL.md; PUT/DELETE are deployments (versioned, rollback-able). Limits: 64 files, 256 KiB total, UTF-8, modes 0644/0755. Full guide: Skills.
Deploy from a repo
- TypeScript SDK
- REST API
- oc CLI
deploy_now: false / --no-deploy).
The link is unique by owner, repository, and normalized root. Unlinking stops deploy-on-push but does
not delete the agent, revisions, deployment history, or sessions.
For built-in runtimes, a push to the production branch activates while other branches stage. For
Flue, only the production branch deploys. Scopes: deploy_now: false needs agents:link; the
default (with an initial deploy) needs agents:link + agents:deploy, plus agents:activate when
that deploy auto-activates. Repo/path are server-anchored to the link. Deployment sources use the
OpenComputer App (no BYO). Full flow + guarantees:
Deploy from a repo.
DeploymentSource
Schedules
Run an agent on a cron — each firing starts a session. Managed with the SDK, theoc CLI, or REST (org key). Full guide: Schedules.
- TypeScript SDK
- REST API
- oc CLI
cron is a 5-field expression (1-minute floor); tz is an IANA name (UTC if omitted); input (≤ 32 KiB) is the first message of every run; overlap is skip (default) or allow. Schedules are also synced from agent.toml on deploy — a repo-driven agent rejects edits other than pause/resume (409). Max 20 per agent.
Schedule
Run — one per firing decision, newest-first: srn_… with outcome (enacted · skipped · failed), scheduled_for? (null for a manual fire), fired_at, session_id? (when enacted), error?. Chain session_id into GET /sessions/:id.
Slack
Managed Slack uses the OpenComputer-operated app. Starting authorization returns a browser-safe Slack OAuth URL, or the current active connection when the agent is already connected. The optional deployment id is validated return context, not a redirect URL. Status responses never contain credentials.- TypeScript SDK
- REST API
active, disconnected, error, or revoked. An active
response includes workspace, app, open_url, and connected_at; error
states expose only a stable error_code.
The connection list returns { data }; each item has the same public status
shape plus agent: { id, name }. It contains no Slack token, signing secret, or
credential reference. Treat it as a preflight convenience: authorization still
enforces the one-workspace-to-one-agent claim transactionally.
Builder-owned Slack apps remain a separate resource and can overlap during an
explicit handoff:
See Slack for installation, trust boundaries, and
conversation behavior.
Destinations
Webhooks are configured via SDK/REST (nooc command).
- TypeScript SDK
- REST API
url, secret?, level? (user), types?[], include_raw? (false, SDK: includeRaw), enabled? (true). types accepts exact types or prefix.*.
Deliveries
Delivery records are read via SDK/REST (nooc command).
- TypeScript SDK
- REST API
Destination
Delivery
GitHub Apps and Repos
A GitHub App lets OpenComputer mint short-lived, repo-scoped tokens; a Repo is a stable handle resolving to your configured App (the OpenComputer App by default). Used for session sources (work repos) and deploy-from-a-repo (the agent’s definition repo). Install the OpenComputer App. Bring-your-own Apps apply to session sources / PR publishing (your users acting on their own repos) — deployment sources always use the OpenComputer App.- TypeScript SDK
- REST API
- oc CLI
owner, repo, provider? (github), name? — no auth (resolves via your App); idempotent by (provider, owner, repo). Registering is optional under the OpenComputer App (reference "owner/repo" directly). Responses never carry a token/secret; App responses have id, mode, status, github_app_id?, app_name?, is_default?. Guide.
Credentials
- TypeScript SDK
- REST API
- oc CLI
provider (anthropic | openai), key, name?, is_default?. Keys are write-only. A BYO credential is optional — agents can run Managed (credential: "managed", the default). See Credentials.
Errors & rate limits
One envelope:{ "error": { "type", "message" } }; the SDK throws typed OpenComputerError subclasses (AuthError, NotFoundError, ConflictError, ValidationError, RateLimitError); the CLI exits non-zero and prints the message (the JSON with --json). Cross-owner resources return 404 (not 403). Rate/concurrency limits aren’t enforced at launch (a 429 with Retry-After may come later; the SDK retries it).