Developers

The Owndom API

Owndom has an HTTPS and JSON API for scripts and tools: chat with agents, and work with files, designs, images and memories. This page explains how it works.

Access

API keys are issued by Owndom's administrator. Member accounts use Owndom through the web app and the phone and Windows apps. For API access, write to [email protected].

Address and versions

  • Base address: https://owndom.alk.homes/agent-api/v1/
  • Every answer under /v1 carries the header x-owndom-api-version: 1.
  • Changes to v1 add fields or routes; anything that has to change in a way that would break a script is announced on What's new first.

Keys and scopes

Send the key in the Authorization header:

curl https://owndom.alk.homes/agent-api/v1/auth/whoami \
  -H "Authorization: Bearer hk_…"
  • A key acts as the account it belongs to: it sees that account's chats and files and nothing else.
  • A key is shown once, stored only as a hash, and can be revoked at any time; anything using it stops at once.
  • Scopes limit a key further. Give a script the narrowest scope it needs:
ScopeWhat the key may do
readRead only (GET requests).
chatTalk to agents: start chats, send messages and follow the live reply. Includes read.
writeMake changes the account is allowed to make, such as files, designs, tasks and memories. Includes chat and read.

A key with no scopes can do everything its account can.

Requests and answers

  • JSON in, JSON out (Content-Type: application/json). File downloads and the live reply stream are the exceptions.
  • An agent's reply arrives as a stream of server-sent events.
  • When a free model is out of quota, the reply says so, and Owndom switches to another free model where it can.

Errors

Errors are JSON with an error field (a few gateway errors use detail):

StatusMeaning
400Invalid request; detail says what is wrong.
401No key, or the key isn't valid.
403Not allowed. A scoped key gets insufficient_scope with the scope it needs; an account that isn't confirmed or approved yet gets email_unverified or pending_approval.
404Not found, or not yours.
409Already running (for example, a chat that is still replying).
413Request too large.
429Too many requests: wait and try again.

Python package

The owndom Python package wraps the API: chats with agents (including the live reply), files, memories and the rest, plus ToolServer for giving agents your own tools over MCP. It needs Python 3.9 or newer and nothing else. Signed in, download the newest version from https://owndom.alk.homes/agent-api/sdk/python/download and install it with pip install owndom-*.whl. Like every API call, it needs an API key.

Routes

Generated from the access rules the server enforces: 78 route patterns as of 2026-10-31. "Anyone" routes need no sign-in (health checks, sign-in itself, payment webhooks); "signed in" routes need a key or a session and only ever reach that account's own data. Routes not listed here are for the administrator only. A key's scope must cover the call: read for looking, the scope in the right-hand column for changes.

Service

RouteMethodsWhoKey scope (read / change)
/GET, HEADanyone- / admin
/healthGET, HEADanyone- / admin
/healthzGET, HEADanyone- / admin
/versionGET, HEADanyone- / admin

Accounts & keys

RouteMethodsWhoKey scope (read / change)
/auth/invite/:codeGET, HEADanyone- / admin
/auth/signupPOSTanyoneadmin / -
/auth/sse-tokenGET, HEADsigned inread / admin
/auth/verifyGET, HEADanyone- / admin
/auth/verify/resendPOSTanyoneadmin / -
/auth/whoamiGET, HEADanyone- / admin

Sign-in (Better Auth)

RouteMethodsWhoKey scope (read / change)
/api/auth/***anyone- / -

Your account

RouteMethodsWhoKey scope (read / change)
/account/ageGET, HEAD, POSTsigned inread / write
/account/billing/checkoutPOSTsigned inadmin / write
/account/billing/portalPOSTsigned inadmin / write
/account/consentGET, HEAD, POSTsigned inread / write
/account/deletePOSTsigned inadmin / write
/account/exportGETsigned inread / admin
/account/export/filesGETsigned inread / admin
/account/model-keys*signed inread / write
/account/model-keys/:provider*signed inread / write
/account/model-limitsGET, HEADsigned inread / admin
/account/model-prefsPUTsigned inadmin / write
/account/planGET, HEADsigned inread / admin
/account/plan-surveyPOSTsigned inadmin / write
/account/training-choicePOSTsigned inadmin / write
/account/training-optoutPOSTsigned inadmin / write

Chat & agent runs

RouteMethodsWhoKey scope (read / change)
/sessions*signed inread / chat
/sessions/***signed inread / chat

Agents

RouteMethodsWhoKey scope (read / change)
/agentsGET, HEADsigned inread / admin
/agents/:nameGET, HEAD, PUT, DELETEsigned inread / write
/agents/:name/duplicatePOSTsigned inadmin / write
/agents/:name/previewGET, HEADsigned inread / admin

Tasks, goals & missions

RouteMethodsWhoKey scope (read / change)
/goalsGET, HEAD, POSTsigned inread / write
/goals/:id*signed inread / write
/goals/:id/***signed inread / write
/symphony/missionsGET, HEAD, POSTsigned inread / write
/symphony/missions/:id*signed inread / write
/symphony/missions/:id/***signed inread / write
/tasksGET, HEAD, POSTsigned inread / write
/tasks/:id*signed inread / write
/tasks/:id/***signed inread / write
/tasks/plans/:plan_id/approvePOSTsigned inadmin / write
/tasks/plans/:plan_id/rejectPOSTsigned inadmin / write

Tools, skills & commands

RouteMethodsWhoKey scope (read / change)
/commandsGET, HEADsigned inread / admin
/commands/:name/renderPOSTsigned inadmin / write
/rulesGET, HEAD, PUTsigned inread / write
/skillsGET, HEADsigned inread / admin
/skills/:name/renderPOSTsigned inadmin / write
/toolsGET, HEADsigned inread / admin

Files & code

RouteMethodsWhoKey scope (read / change)
/files/***signed inread / write
/snapshots*signed inread / write
/snapshots/***signed inread / write

Memory & knowledge

RouteMethodsWhoKey scope (read / change)
/memories*signed inread / write
/memories/:id*signed inread / write

Models & settings

RouteMethodsWhoKey scope (read / change)
/permissions/:idPOSTsigned inadmin / write
/providers/catalogGET, HEADsigned inread / admin
/providers/privacy*signed inread / write
/settingsGET, HEADsigned inread / admin

Studios

RouteMethodsWhoKey scope (read / change)
/design*signed inread / write
/design/***signed inread / write
/image*signed inread / write
/image/***signed inread / write

People

RouteMethodsWhoKey scope (read / change)
/people/***signed inread / write

Messages & notifications

RouteMethodsWhoKey scope (read / change)
/mailbox*signed inread / write
/mailbox/***signed inread / chat
/push*signed inread / write
/push/***signed inread / write
/spaces/summarizePOSTsigned inadmin / chat

Devices & phones

RouteMethodsWhoKey scope (read / change)
/devices*signed inread / write
/devices/***signed inread / write
/devices/reportPOSTanyoneread / -

Quality, data & cost

RouteMethodsWhoKey scope (read / change)
/activityGET, HEADsigned inread / admin
/activity-logGET, HEADsigned inread / admin
/activity-log/statsGET, HEADsigned inread / admin

Integrations, plugins & SDK

RouteMethodsWhoKey scope (read / change)
/sdk/pythonGETsigned inread / admin
/sdk/python/downloadGETsigned inread / admin

Billing

RouteMethodsWhoKey scope (read / change)
/billing/webhookPOSTanyoneadmin / -
/billing/webhook/:providerPOSTanyoneadmin / -

Privacy

Requests made with a key follow the same rules as the app: a chat on a cloud model is sent to the provider you choose, and data is kept as described in the Privacy policy.

Questions

Write to [email protected].