Skip to content
Hoody.com

The Agent: Settings API exposes the runtime configuration that governs how the Hoody daemon resolves, merges, and persists its layered settings (~/.hoody/settings.json + project layer + local overrides), manages model-fusion composites (named groups of model members that can be addressed as a single routing target), and configures the BYOA/ACP delegated-session backend (currently claude) and its secrets. Use these endpoints to inspect the merged effective settings, apply shallow patches to non-protected top-level keys, curate fusion composites, and store per-agent secret values out-of-band in the 0600 secrets store.

Returns the effective merged settings (home -> project -> settings.local.json, top-level merge) plus the home-layer object that the patch endpoint mutates.

Terminal window
curl -X GET 'https://proj_a1b2c3d4e5f6-cnt_1a2b3c4d5e6f-agent-1.us-east-1.containers.hoody.icu/api/v1/agent/settings' \
-H 'X-Hoody-Container: cnt_1a2b3c4d5e6f'
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.
{
"theme": "dark",
"model": null,
"autoCompactThreshold": 90,
"defaultModel": "claude-sonnet-4.5",
"home": {
"theme": "dark",
"autoCompactThreshold": 90
}
}

Applies a shallow top-level merge into the home ~/.hoody/settings.json. A null value deletes a key. Top-level only — sending {"features":{...}} replaces the whole features object. Returns the resulting home object.

Terminal window
curl -X PATCH 'https://proj_a1b2c3d4e5f6-cnt_1a2b3c4d5e6f-agent-1.us-east-1.containers.hoody.icu/api/v1/agent/settings' \
-H 'Content-Type: application/json' \
-H 'X-Hoody-Container: cnt_1a2b3c4d5e6f' \
-d '{ "patch": { "theme": "light", "autoCompactThreshold": 95 } }'
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.
NameRequiredTypeDescription
patchYesobjectTop-level keys to merge into the home settings.json. A null value deletes the key. A non-null top-level model is rejected 400 (nothing consumes it).
{
"theme": "light",
"autoCompactThreshold": 95,
"defaultModel": "claude-sonnet-4.5"
}

Lists the persisted model-fusion composites (fusion.list). Pass ?include_invalid=true to also receive 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/deletable.

Terminal window
curl -X GET 'https://proj_a1b2c3d4e5f6-cnt_1a2b3c4d5e6f-agent-1.us-east-1.containers.hoody.icu/api/v1/agent/settings/fusion?page=1&limit=20&include_invalid=false' \
-H 'X-Hoody-Container: cnt_1a2b3c4d5e6f'
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.
{
"items": [
{
"name": "ensemble-fast",
"method": "weighted-vote",
"members": [
{ "model": "claude-haiku-4.5", "weight": 0.6 },
{ "model": "claude-sonnet-4.5", "weight": 0.4 }
],
"context_window": 200000
}
],
"meta": {
"total": 3,
"page": 1,
"limit": 20
}
}

Creates or updates a model-fusion composite keyed by slug (fusion.upsert). 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.

Terminal window
curl -X PUT 'https://proj_a1b2c3d4e5f6-cnt_1a2b3c4d5e6f-agent-1.us-east-1.containers.hoody.icu/api/v1/agent/settings/fusion/ensemble-fast' \
-H 'Content-Type: application/json' \
-H 'X-Hoody-Container: cnt_1a2b3c4d5e6f' \
-d '{
"spec": {
"name": "ensemble-fast",
"method": "weighted-vote",
"members": [
{ "model": "claude-haiku-4.5", "weight": 0.6 },
{ "model": "claude-sonnet-4.5", "weight": 0.4 }
],
"context_window": 200000
}
}'
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.
NameRequiredTypeDescription
specYesobjectThe FusionSpec object (name, method, members, …). The persisted slug is derived from spec.name.
{
"name": "ensemble-fast",
"method": "weighted-vote",
"members": [
{ "model": "claude-haiku-4.5", "weight": 0.6 },
{ "model": "claude-sonnet-4.5", "weight": 0.4 }
],
"context_window": 200000
}

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).

Terminal window
curl -X DELETE 'https://proj_a1b2c3d4e5f6-cnt_1a2b3c4d5e6f-agent-1.us-east-1.containers.hoody.icu/api/v1/agent/settings/fusion/ensemble-fast' \
-H 'X-Hoody-Container: cnt_1a2b3c4d5e6f'
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.
{
"removed": true,
"slug": "ensemble-fast"
}

Reports the BYOA (Bring-Your-Own-Agent) delegated-session backend availability (currently claude) — enabled flag, on-PATH status, and trust posture (acp.status). The result is 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/login probing, and X-Hoody-Realm scopes that probe. A realm header without a container returns 400 realm_scope_unsupported (the local report has no realm dimension).

Terminal window
curl -X GET 'https://proj_a1b2c3d4e5f6-cnt_1a2b3c4d5e6f-agent-1.us-east-1.containers.hoody.icu/api/v1/agent/acp/agents' \
-H 'X-Hoody-Container: cnt_1a2b3c4d5e6f'
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.
{
"agent": "claude",
"enabled": true,
"on_path": true,
"version": "1.0.32",
"trust": "verified",
"secrets_configured": true
}

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). Writes tools.acp_agents.<agent>.enabled in settings.json.

Terminal window
curl -X PUT 'https://proj_a1b2c3d4e5f6-cnt_1a2b3c4d5e6f-agent-1.us-east-1.containers.hoody.icu/api/v1/agent/acp/agents/claude/enabled' \
-H 'Content-Type: application/json' \
-H 'X-Hoody-Container: cnt_1a2b3c4d5e6f' \
-d '{ "enabled": true }'
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.
NameRequiredTypeDescription
enabledNobooleantrue arms the backend; false disarms it. Defaults to true when omitted.
{
"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.

Terminal window
curl -X PUT 'https://proj_a1b2c3d4e5f6-cnt_1a2b3c4d5e6f-agent-1.us-east-1.containers.hoody.icu/api/v1/agent/acp/agents/claude/model' \
-H 'Content-Type: application/json' \
-H 'X-Hoody-Container: cnt_1a2b3c4d5e6f' \
-d '{ "model": "claude-opus-5", "effort": "high" }'
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.
NameRequiredTypeDescription
modelNostringBackend model id or alias. An empty string clears the pin.
effortNostringReasoning effort (backend-specific). An empty string clears the pin.
{
"agent": "claude",
"model": "claude-opus-5",
"effort": "high"
}

model and effort echo the stored pins, and are empty strings when cleared.


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.

Terminal window
curl -X PUT 'https://proj_a1b2c3d4e5f6-cnt_1a2b3c4d5e6f-agent-1.us-east-1.containers.hoody.icu/api/v1/agent/acp/agents/claude/secrets/ANTHROPIC_API_KEY' \
-H 'Content-Type: application/json' \
-H 'X-Hoody-Container: cnt_1a2b3c4d5e6f' \
-d '{ "value": "sk-ant-EXAMPLE-REPLACE-WITH-REAL-KEY" }'
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.
NameRequiredTypeDescription
valueNostringThe env secret value. Empty string clears (unsets) the reference. Stored only in the 0600 acp-secrets.env store.
{
"agent": "claude",
"key": "ANTHROPIC_API_KEY",
"stored": true,
"cleared": false
}