name: opencode-docs-server
description: Describes how to interact with opencode server over HTTP.
The opencode serve command runs a headless HTTP server that exposes an OpenAPI endpoint that an opencode client can use.
Usage
opencode serve [--port <number>] [--hostname <string>] [--cors <origin>]
Options
| Flag |
Description |
Default |
--port |
Port to listen on |
4096 |
--hostname |
Hostname to listen on |
127.0.0.1 |
--mdns |
Enable mDNS discovery |
false |
--mdns-domain |
Custom domain name for mDNS service |
opencode.local |
--cors |
Additional browser origins to allow |
[] |
--cors can be passed multiple times:
opencode serve --cors http://localhost:5173 --cors https://app.example.com
Authentication
Set OPENCODE_SERVER_PASSWORD to protect the server with HTTP basic auth. The username defaults to opencode, or set OPENCODE_SERVER_USERNAME to override it. This applies to both opencode serve and opencode web.
OPENCODE_SERVER_PASSWORD=your-password opencode serve
How it works
When you run opencode it starts a TUI and a server. Where the TUI is the
client that talks to the server. The server exposes an OpenAPI 3.1 spec
endpoint. This endpoint is also used to generate an SDK.
:::tip
Use the opencode server to interact with opencode programmatically.
:::
This architecture lets opencode support multiple clients and allows you to interact with opencode programmatically.
You can run opencode serve to start a standalone server. If you have the
opencode TUI running, opencode serve will start a new server.
Connect to an existing server
When you start the TUI it randomly assigns a port and hostname. You can instead pass in the --hostname and --port flags. Then use this to connect to its server.
The /tui endpoint can be used to drive the TUI through the server. For example, you can prefill or run a prompt. This setup is used by the OpenCode IDE plugins.
Spec
The server publishes an OpenAPI 3.1 spec that can be viewed at:
http://<hostname>:<port>/doc
For example, http://localhost:4096/doc. Use the spec to generate clients or inspect request and response types. Or view it in a Swagger explorer.
APIs
The opencode server exposes the following APIs.
Global
| Method |
Path |
Description |
Response |
GET |
/global/health |
Get server health and version |
{ healthy: true, version: string } |
GET |
/global/event |
Get global events (SSE stream) |
Event stream |
Project
| Method |
Path |
Description |
Response |
GET |
/project |
List all projects |
Project[] |
GET |
/project/current |
Get the current project |
Project |
Path & VCS
| Method |
Path |
Description |
Response |
GET |
/path |
Get the current path |
Path |
GET |
/vcs |
Get VCS info for the current project |
VcsInfo |
Instance
| Method |
Path |
Description |
Response |
POST |
/instance/dispose |
Dispose the current instance |
boolean |
Config
| Method |
Path |
Description |
Response |
GET |
/config |
Get config info |
Config |
PATCH |
/config |
Update config |
Config |
GET |
/config/providers |
List providers and default models |
{ providers: Provider[], default: { [key: string]: string } } |
Provider
| Method |
Path |
Description |
Response |
GET |
/provider |
List all providers |
{ all: Provider[], default: {...}, connected: string[] } |
GET |
/provider/auth |
Get provider authentication methods |
{ [providerID: string]: ProviderAuthMethod[] } |
POST |
/provider/{id}/oauth/authorize |
Authorize a provider using OAuth |
ProviderAuthAuthorization |
POST |
/provider/{id}/oauth/callback |
Handle OAuth callback for a provider |
boolean |
Sessions
| Method |
Path |
Description |
Notes |
GET |
/session |
List all sessions |
Returns Session[] |
POST |
/session |
Create a new session |
body: { parentID?, title? }, returns Session |
GET |
/session/status |
Get session status for all sessions |
Returns { [sessionID: string]: SessionStatus } |
GET |
/session/:id |
Get session details |
Returns Session |
DELETE |
/session/:id |
Delete a session and all its data |
Returns boolean |
PATCH |
/session/:id |
Update session properties |
body: { title? }, returns Session |
GET |
/session/:id/children |
Get a session's child sessions |
Returns Session[] |
GET |
/session/:id/todo |
Get the todo list for a session |
Returns Todo[] |
POST |
/session/:id/init |
Analyze app and create AGENTS.md |
body: { messageID, providerID, modelID }, returns boolean |
POST |
/session/:id/fork |
Fork an existing session at a message |
body: { messageID? }, returns Session |
POST |
/session/:id/abort |
Abort a running session |
Returns boolean |
POST |
/session/:id/share |
Share a session |
Returns Session |
DELETE |
/session/:id/share |
Unshare a session |
Returns Session |
GET |
/session/:id/diff |
Get the diff for this session |
query: messageID?, returns FileDiff[] |
POST |
/session/:id/summarize |
Summarize the session |
body: { providerID, modelID }, returns boolean |
POST |
/session/:id/revert |
Revert a message |
body: { messageID, partID? }, returns boolean |
POST |
/session/:id/unrevert |
Restore all reverted messages |
Returns boolean |
POST |
/session/:id/permissions/:permissionID |
Respond to a permission request |
body: { response, remember? }, returns boolean |
Messages
| Method |
Path |
Description |
Notes |
GET |
/session/:id/message |
List messages in a session |
query: limit?, returns { info: Message, parts: Part[]}[] |
POST |
/session/:id/message |
Send a message and wait for response |
body: { messageID?, model?, agent?, noReply?, system?, tools?, parts }, returns { info: Message, parts: Part[]} |
GET |
/session/:id/message/:messageID |
Get message details |
Returns { info: Message, parts: Part[]} |
POST |
/session/:id/prompt_async |
Send a message asynchronously (no wait) |
body: same as /session/:id/message, returns 204 No Content |
POST |
/session/:id/command |
Execute a slash command |
body: { messageID?, agent?, model?, command, arguments }, returns { info: Message, parts: Part[]} |
POST |
/session/:id/shell |
Run a shell command |
body: { agent, model?, command }, returns { info: Message, parts: Part[]} |
Commands
| Method |
Path |
Description |
Response |
GET |
/command |
List all commands |
Command[] |
Files
| Method |
Path |
Description |
Response |
GET |
/find?pattern=<pat> |
Search for text in files |
Array of match objects with path, lines, line_number, absolute_offset, submatches |
GET |
/find/file?query=<q> |
Find files and directories by name |
string[] (paths) |
GET |
/find/symbol?query=<q> |
Find workspace symbols |
Symbol[] |
GET |
/file?path=<path> |
List files and directories |
FileNode[] |
GET |
/file/content?path=<p> |
Read a file |
FileContent |
GET |
/file/status |
Get status for tracked files |
File[] |
/find/file query parameters
query (required) — search string (fuzzy match)
type (optional) — limit results to "file" or "directory"
directory (optional) — override the project root for the search
limit (optional) — max results (1–200)
dirs (optional) — legacy flag ("false" returns only files)
Tools (Experimental)
| Method |
Path |
Description |
Response |
GET |
/experimental/tool/ids |
List all tool IDs |
ToolIDs |
GET |
/experimental/tool?provider=<p>&model=<m> |
List tools with JSON schemas for a model |
ToolList |
LSP, Formatters & MCP
| Method |
Path |
Description |
Response |
GET |
/lsp |
Get LSP server status |
LSPStatus[] |
GET |
/formatter |
Get formatter status |
FormatterStatus[] |
GET |
/mcp |
Get MCP server status |
{ [name: string]: MCPStatus } |
POST |
/mcp |
Add MCP server dynamically |
body: { name, config }, returns MCP status object |
Agents
| Method |
Path |
Description |
Response |
GET |
/agent |
List all available agents |
Agent[] |
Logging
| Method |
Path |
Description |
Response |
POST |
/log |
Write log entry. Body: { service, level, message, extra? } |
boolean |
TUI
| Method |
Path |
Description |
Response |
POST |
/tui/append-prompt |
Append text to the prompt |
boolean |
POST |
/tui/open-help |
Open the help dialog |
boolean |
POST |
/tui/open-sessions |
Open the session selector |
boolean |
POST |
/tui/open-themes |
Open the theme selector |
boolean |
POST |
/tui/open-models |
Open the model selector |
boolean |
POST |
/tui/submit-prompt |
Submit the current prompt |
boolean |
POST |
/tui/clear-prompt |
Clear the prompt |
boolean |
POST |
/tui/execute-command |
Execute a command ({ command }) |
boolean |
POST |
/tui/show-toast |
Show toast ({ title?, message, variant }) |
boolean |
GET |
/tui/control/next |
Wait for the next control request |
Control request object |
POST |
/tui/control/response |
Respond to a control request ({ body }) |
boolean |
Auth
| Method |
Path |
Description |
Response |
PUT |
/auth/:id |
Set authentication credentials. Body must match provider schema |
boolean |
Events
| Method |
Path |
Description |
Response |
GET |
/event |
Server-sent events stream. First event is server.connected, then bus events |
Server-sent events stream |
Docs
| Method |
Path |
Description |
Response |
GET |
/doc |
OpenAPI 3.1 specification |
HTML page with OpenAPI spec |