Skip to content
Hoody.com

This page documents the HTTP endpoints for reading and mutating agent settings, managing model-fusion composites, and configuring BYOA ACP backend agents. The endpoints cover:

  • Settings core — read the effective merged settings (home → project → settings.local.json) and shallow-merge patches into the home ~/.hoody/settings.json.
  • BYOA ACP backends — read the BYOA backend status, enable or disable the claude backend, pin its default model and reasoning effort, and store per-backend env secrets in the dedicated 0600 acp-secrets.env store.
  • Fusion composites — list, create or update, and delete custom model-fusion compositions by slug.

Settings, fusion composites, and the local BYOA ACP report are global, process-wide config with no realm dimension, so a X-Hoody-Realm header or ?realm= query returns 400 realm_scope_unsupported on these routes. The BYOA ACP status report additionally accepts a realm when a remote container is bound through X-Hoody-Container — without a container, the local report has no realm dimension to scope.

The home ~/.hoody/settings.json is the layer PATCH /settings mutates. GET /settings returns the effective merged settings (home → project → settings.local.json, top-level merge) alongside the home-layer object.

Returns the effective merged settings plus the home-layer object that PATCH /settings mutates. Process-wide config (global, no-realm): settings have no realm dimension at any layer, so a per-request realm header returns 400 realm_scope_unsupported.

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope: the .hoody project layer / record cwd / tool+workflow cwd. Required by routes that resolve a cwd (e.g. POST /todos; createTodo also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override selecting which on-disk .hoody install a stateless read/write resolves (HoodyPaths).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local). Rejected (400) on routes with no container dimension.
X-Hoody-RealmheaderstringNoPer-request realm selector: "global" or a 24-hex id (also accepted as ?realm=). Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
realmquerystringNoPer-request realm selector — the in-query alias of the X-Hoody-Realm header (read only when the header is absent): "global" or a 24-hex id. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
Terminal window
curl -X GET "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/settings" \
-H "Authorization: Bearer <token>"
{
"model": null,
"theme": "dark",
"maxTokens": 8192,
"verbose": false
}

Applies a SHALLOW top-level merge into the home ~/.hoody/settings.json (a null value deletes a key). Sending { "features": { ... } } REPLACES the whole features object. A non-null top-level model is rejected (400) because nothing on settings consumes it — pin a model on the chat agent via PATCH /agents/{name}/model, or switch a live session via PATCH /sessions/{id}/model; { "model": null } still deletes a previously-persisted value.

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope: the .hoody project layer / record cwd / tool+workflow cwd. Required by routes that resolve a cwd (e.g. POST /todos; createTodo also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override selecting which on-disk .hoody install a stateless read/write resolves (HoodyPaths).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local). Rejected (400) on routes with no container dimension.
X-Hoody-RealmheaderstringNoPer-request realm selector: "global" or a 24-hex id (also accepted as ?realm=). Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
realmquerystringNoPer-request realm selector — the in-query alias of the X-Hoody-Realm header (read only when the header is absent): "global" or a 24-hex id. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
FieldTypeRequiredDescription
patchobjectYesTop-level keys to merge into the home settings.json (a null value deletes the key).
Terminal window
curl -X PATCH "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/settings" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"patch":{"theme":"dark","maxTokens":8192}}'
{
"theme": "dark",
"maxTokens": 8192,
"verbose": false
}

The BYOA (Bring Your Own Agent) ACP backend is a delegated session target. A delegated session — POST /sessions with backend: "acp" — runs through the armed backend, so a backend must be enabled before delegated sessions can use it. Per-backend env VALUES live in the dedicated 0600 acp-secrets.env store; settings.json holds only the env KEY NAMES.

Reports the BYOA delegated-session backend availability (claude) — enabled flag, on-PATH status, trust posture (acp.status). A fixed status object, NOT a paginated collection. The report is resolved through the layered settings the delegated session would use, so X-Hoody-Config-Dir (override) and X-Hoody-Cwd (project layer) are folded. For REMOTE BYOA, a bound X-Hoody-Container switches the report to ON-CONTAINER detection and login probing, and X-Hoody-Realm scopes that probe (threaded as realm_selector). A realm header WITHOUT a container returns 400 realm_scope_unsupported because the local report has no realm dimension.

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope: the .hoody project layer / record cwd / tool+workflow cwd. Required by routes that resolve a cwd (e.g. POST /todos; createTodo also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override selecting which on-disk .hoody install a stateless read/write resolves (HoodyPaths).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local). Rejected (400) on routes with no container dimension. When bound, switches the report to ON-CONTAINER detection / login probing and allows a realm scope.
X-Hoody-RealmheaderstringNoPer-request realm selector: "global" or a 24-hex id (also accepted as ?realm=). Rejected (400 realm_scope_unsupported) on active-only / no-realm routes; on this route only valid together with a bound X-Hoody-Container.
realmquerystringNoPer-request realm selector — the in-query alias of the X-Hoody-Realm header (read only when the header is absent): "global" or a 24-hex id. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes; on this route only valid together with a bound X-Hoody-Container.
Terminal window
curl -X GET "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/acp/agents" \
-H "Authorization: Bearer <token>"
{
"agent": "claude",
"enabled": true,
"on_path": true,
"trust": "verified"
}

PUT /api/v1/agent/acp/agents/{agent}/enabled

Section titled “PUT /api/v1/agent/acp/agents/{agent}/enabled”

Arms (or disarms) a BYOA ACP backend for delegated sessions (acp.set_enabled). A delegated session — POST /sessions with backend: "acp" — is refused by the daemon while its backend is disabled, so this is the prerequisite for the whole delegated-session capability on a host configured over HTTP. Writes tools.acp_agents.<agent>.enabled in settings.json. Returns 404 unknown_agent for anything that is not a known BYOA backend (claude).

NameInTypeRequiredDescription
agentpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope: the .hoody project layer / record cwd / tool+workflow cwd. Required by routes that resolve a cwd (e.g. POST /todos; createTodo also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override selecting which on-disk .hoody install a stateless read/write resolves (HoodyPaths).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local). Rejected (400) on routes with no container dimension.
X-Hoody-RealmheaderstringNoPer-request realm selector: "global" or a 24-hex id (also accepted as ?realm=). Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
realmquerystringNoPer-request realm selector — the in-query alias of the X-Hoody-Realm header (read only when the header is absent): "global" or a 24-hex id. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
FieldTypeRequiredDescription
enabledbooleanNoTrue arms the backend; false disarms it. Defaults to true when omitted.
Terminal window
curl -X PUT "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/acp/agents/claude/enabled" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"enabled":true}'
{
"agent": "claude",
"enabled": true
}

PUT /api/v1/agent/acp/agents/{agent}/model

Section titled “PUT /api/v1/agent/acp/agents/{agent}/model”

Sets the default model and reasoning effort a BYOA ACP backend runs on (acp.set_agent_model). These are the values the daemon passes to the backend at connect; a delegated session started without an explicit model inherits them. An empty value clears the pin and returns the backend to its own default. Returns 404 unknown_agent for anything that is not a known BYOA backend (claude).

NameInTypeRequiredDescription
agentpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope: the .hoody project layer / record cwd / tool+workflow cwd. Required by routes that resolve a cwd (e.g. POST /todos; createTodo also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override selecting which on-disk .hoody install a stateless read/write resolves (HoodyPaths).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local). Rejected (400) on routes with no container dimension.
X-Hoody-RealmheaderstringNoPer-request realm selector: "global" or a 24-hex id (also accepted as ?realm=). Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
realmquerystringNoPer-request realm selector — the in-query alias of the X-Hoody-Realm header (read only when the header is absent): "global" or a 24-hex id. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
FieldTypeRequiredDescription
modelstringNoBackend model id or alias. Empty clears the pin.
effortstringNoReasoning effort (backend-specific; empty clears).
Terminal window
curl -X PUT "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/acp/agents/claude/model" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"model":"claude-3-7-sonnet-latest","effort":"high"}'
{
"agent": "claude",
"model": "claude-3-7-sonnet-latest",
"effort": "high"
}

PUT /api/v1/agent/acp/agents/{agent}/secrets/{key}

Section titled “PUT /api/v1/agent/acp/agents/{agent}/secrets/{key}”

Stores (or clears) one per-backend env VALUE for a BYOA ACP agent (acp.set_secret) in the dedicated 0600 ~/.hoody/acp-secrets.env store under acp/<agent>/ (atomic temp + rename, flock). settings.json holds only the env KEY NAMES; the VALUE lives ONLY in the 0600 store. An empty value DELETES (unsets) the reference. Returns 404 unknown_agent for an agent that is not a known BYOA backend (claude).

NameInTypeRequiredDescription
agentpathstringYesPath identifier.
keypathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope: the .hoody project layer / record cwd / tool+workflow cwd. Required by routes that resolve a cwd (e.g. POST /todos; createTodo also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override selecting which on-disk .hoody install a stateless read/write resolves (HoodyPaths).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local). Rejected (400) on routes with no container dimension.
X-Hoody-RealmheaderstringNoPer-request realm selector: "global" or a 24-hex id (also accepted as ?realm=). Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
realmquerystringNoPer-request realm selector — the in-query alias of the X-Hoody-Realm header (read only when the header is absent): "global" or a 24-hex id. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
FieldTypeRequiredDescription
valuestringNoThe env secret value. Empty string clears (unsets) the reference. Stored only in the 0600 acp-secrets.env store.
Terminal window
curl -X PUT "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/acp/agents/claude/secrets/ANTHROPIC_API_KEY" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"value":"sk-ant-api03-EXAMPLE-REDACTED"}'
{
"agent": "claude",
"key": "ANTHROPIC_API_KEY",
"stored": true,
"cleared": false
}

Model-fusion composites combine multiple model members into a single named entry (fusion.list, fusion.upsert, fusion.delete). The persisted key is derived from spec.name (lowercased, separators collapsed to -).

Lists the persisted model-fusion composites (fusion.list). Pass ?include_invalid=true to also receive the entries that failed validation as a TOP-LEVEL invalid array beside items (each with the failure reason and its stable raw-file index; never mixed into or paginated with the selectable items) so a broken composite is editable or deletable. Composites are process-wide config with no realm dimension, so a per-request realm header returns 400 realm_scope_unsupported.

NameInTypeRequiredDescription
include_invalidquerybooleanNoWhen true, also return composites that failed validation as a top-level invalid array beside items (each with a reason + raw-file index) so a broken composite is editable/deletable.
pagequeryintegerNo1-based page number for pagination.
limitqueryintegerNoMaximum items per page (0 = no pagination).
X-Hoody-CwdheaderstringNoPer-request working-directory scope: the .hoody project layer / record cwd / tool+workflow cwd. Required by routes that resolve a cwd (e.g. POST /todos; createTodo also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override selecting which on-disk .hoody install a stateless read/write resolves (HoodyPaths).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local). Rejected (400) on routes with no container dimension.
X-Hoody-RealmheaderstringNoPer-request realm selector: "global" or a 24-hex id (also accepted as ?realm=). Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
realmquerystringNoPer-request realm selector — the in-query alias of the X-Hoody-Realm header (read only when the header is absent): "global" or a 24-hex id. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
Terminal window
curl -X GET "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/settings/fusion?include_invalid=true&page=1&limit=20" \
-H "Authorization: Bearer <token>"
{
"items": [
{
"name": "Tri-Brained",
"slug": "tri-brained",
"method": "ensemble",
"members": [
{ "role": "planner", "model": "claude-3-7-sonnet-latest" },
{ "role": "critic", "model": "claude-3-7-sonnet-latest" },
{ "role": "executor", "model": "claude-3-7-sonnet-latest" }
]
}
],
"meta": {
"total": 1,
"page": 1,
"limit": 20
}
}

Creates or updates a model-fusion composite keyed by slug (fusion.upsert). The body is the daemon FusionSpec under spec. The persisted key is derived from spec.name (lowercased, separators collapsed to -); the path {slug} must normalize to the same slug or the request is rejected 400 slug_mismatch — the path cannot rename what the body describes. Structural invariants (name, method, members, cycle guard, non-zero context window) are validated server-side.

NameInTypeRequiredDescription
slugpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope: the .hoody project layer / record cwd / tool+workflow cwd. Required by routes that resolve a cwd (e.g. POST /todos; createTodo also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override selecting which on-disk .hoody install a stateless read/write resolves (HoodyPaths).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local). Rejected (400) on routes with no container dimension.
X-Hoody-RealmheaderstringNoPer-request realm selector: "global" or a 24-hex id (also accepted as ?realm=). Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
realmquerystringNoPer-request realm selector — the in-query alias of the X-Hoody-Realm header (read only when the header is absent): "global" or a 24-hex id. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
FieldTypeRequiredDescription
specobjectYesThe FusionSpec object (name, method, members, …). The persisted key is derived from spec.name (lowercased, separators collapsed to -).
Terminal window
curl -X PUT "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/settings/fusion/tri-brained" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"spec":{"name":"Tri-Brained","method":"ensemble","members":[{"role":"planner","model":"claude-3-7-sonnet-latest"},{"role":"critic","model":"claude-3-7-sonnet-latest"},{"role":"executor","model":"claude-3-7-sonnet-latest"}]}}'
{
"name": "Tri-Brained",
"slug": "tri-brained",
"method": "ensemble",
"members": [
{ "role": "planner", "model": "claude-3-7-sonnet-latest" },
{ "role": "critic", "model": "claude-3-7-sonnet-latest" },
{ "role": "executor", "model": "claude-3-7-sonnet-latest" }
]
}

DELETE /api/v1/agent/settings/fusion/{slug}

Section titled “DELETE /api/v1/agent/settings/fusion/{slug}”

Removes a model-fusion composite by slug (fusion.delete). Composites are process-wide config with no realm dimension, so a per-request realm header returns 400 realm_scope_unsupported.

NameInTypeRequiredDescription
slugpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope: the .hoody project layer / record cwd / tool+workflow cwd. Required by routes that resolve a cwd (e.g. POST /todos; createTodo also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override selecting which on-disk .hoody install a stateless read/write resolves (HoodyPaths).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local). Rejected (400) on routes with no container dimension.
X-Hoody-RealmheaderstringNoPer-request realm selector: "global" or a 24-hex id (also accepted as ?realm=). Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
realmquerystringNoPer-request realm selector — the in-query alias of the X-Hoody-Realm header (read only when the header is absent): "global" or a 24-hex id. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
Terminal window
curl -X DELETE "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/settings/fusion/tri-brained" \
-H "Authorization: Bearer <token>"
{
"slug": "tri-brained",
"removed": true
}