Skip to content
Hoody.com

Define, read, replace, hide, and delete multi-step agent workflows, run them onto a session, and snapshot, inspect, or cancel workflow runs. The endpoints group into two families: workflow definitions (the saved YAML/JSON in the realm’s workflow store) and workflow runs (live executions of a definition, with their own state machine).

List workflow definitions visible to the requesting cwd/config_dir (name, summary, step briefs, system flag). The realm is named by X-Hoody-Realm or ?realm=; omitted, the agent’s own realm.

Terminal window
curl -X GET "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/workflows?page=1&limit=50" \
-H "X-Hoody-Cwd: /home/user/projects/my-app" \
-H "X-Hoody-Config-Dir: /home/user/.hoody"
NameInTypeRequiredDescription
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; client.agent.todos.create() also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request —config-dir override selecting which on-disk .hoody install a stateless read/write resolves against.
X-Hoody-RealmheaderstringNoPer-request realm selector: “global” (not tied to a realm) or a 24-hex realm id (also accepted as ?realm=). On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
realmquerystringNoPer-request realm selector — the in:query alias of the X-Hoody-Realm header (read only when the header is absent): “global” (not tied to a realm) or a 24-hex realm id. On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
{
"items": [],
"meta": { "total": 0 }
}
Error CodeTitleDescriptionResolution

Read one workflow definition. Returns the tool envelope {output, is_error} carrying the definition JSON in output. With ?include_revision=true, the first line of output is revision: <opaque> to use as a CAS baseline for client.agent.workflows.set() or client.agent.workflows.setSummary(). An unknown name returns is_error: true with output "workflow X not found".

Terminal window
curl -X GET "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/workflows/lint?include_revision=true" \
-H "X-Hoody-Cwd: /home/user/projects/my-app" \
-H "X-Hoody-Config-Dir: /home/user/.hoody"
NameInTypeRequiredDescription
namepathstringYesThe name.
include_revisionquerybooleanNoIf “true”, the tool output’s first line is revision: <opaque> — pass that value as the expected_revision of client.agent.workflows.set() to guard against concurrent edits; the JSON below it is unchanged. Strictly parsed: exactly one value, “true” or “false”; anything else (empty, “TRUE”, “1”, repeated) is a 400 bad_request.
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; client.agent.todos.create() also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request —config-dir override selecting which on-disk .hoody install a stateless read/write resolves against.
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local). Rejected (400) on routes with no container dimension.
X-Hoody-RealmheaderstringNoPer-request realm selector: “global” (not tied to a realm) or a 24-hex realm id (also accepted as ?realm=). On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
realmquerystringNoPer-request realm selector — the in:query alias of the X-Hoody-Realm header (read only when the header is absent): “global” (not tied to a realm) or a 24-hex realm id. On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
{
"status": "ok",
"output": "{\"name\":\"lint\"}",
"is_error": false
}
Error CodeTitleDescriptionResolution

Create or replace one workflow definition. The body carries the definition object; the {name} path value is authoritative. The daemon validates the definition strictly before writing atomically (unknown fields rejected, the loader’s structural gate enforced), so a malformed definition is refused (is_error:true) rather than corrupting workflow.json. The system flag is authoritative from the embedded defaults. The 200 status also covers CAS refusals, which return is_error: true with a typed code (revision_conflict or already_exists) and the entry’s current_revision when available.

Terminal window
curl -X PUT "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/workflows/lint" \
-H "X-Hoody-Cwd: /home/user/projects/my-app" \
-H "X-Hoody-Config-Dir: /home/user/.hoody" \
-H "Content-Type: application/json" \
-d '{
"definition": {
"name": "lint",
"summary": "Run the linter and report what it found.",
"entry_point": { "id": "lint" },
"steps": {
"lint": { "type": "bash", "command": "make lint" }
}
}
}'
NameInTypeRequiredDescription
namepathstringYesThe name.
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; client.agent.todos.create() also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request —config-dir override selecting which on-disk .hoody install a stateless read/write resolves against.
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local). Rejected (400) on routes with no container dimension.
X-Hoody-RealmheaderstringNoPer-request realm selector: “global” (not tied to a realm) or a 24-hex realm id (also accepted as ?realm=). On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
realmquerystringNoPer-request realm selector — the in:query alias of the X-Hoody-Realm header (read only when the header is absent): “global” (not tied to a realm) or a 24-hex realm id. On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
NameTypeRequiredDescription
definitionobjectYesThe full workflow definition object (steps, entry_point, summary). Validated strictly by the agent before an atomic write.
expected_revisionstringNoOptional optimistic-concurrency guard: the revision: value from client.agent.workflows.get() (?include_revision=true). If the stored workflow changed since that read, the upsert is refused with [revision_conflict] and nothing is written. Omit to save unconditionally. The revision is bound to the realm this request resolves to: on a gateway without a realm pin, a revision read while another realm was active is refused [revision_conflict] (current_revision is this realm’s), never written into the other realm.
expected_absentbooleanNoOptional create-only guard: refuse with [already_exists] (writing nothing) if any workflow with this name already exists. Use when creating a new workflow that must not overwrite an existing one. Mutually exclusive with expected_revision.
{
"definition": {
"name": "lint",
"summary": "Run the linter and report what it found.",
"entry_point": { "id": "lint" },
"steps": {
"lint": { "type": "bash", "command": "make lint" }
}
}
}
{
"status": "ok",
"output": "workflow lint updated",
"is_error": false
}
Error CodeTitleDescriptionResolution
revision_conflictRevision conflictThe workflow changed (or was deleted) since the revision the request was based on, so nothing was written.Re-read the workflow (client.agent.workflows.get() with include_revision=true), re-apply the change, and retry with the new revision.
already_existsAlready existsThe expected_absent guard failed: a workflow with this name already exists, so nothing was written.Omit expected_absent to overwrite, or use a different name.

PUT /api/v1/agent/workflows/{name}/summary

Section titled “PUT /api/v1/agent/workflows/{name}/summary”

Replace one workflow’s summary (the one-line description shown in the Workflows tab and in client.agent.workflows.list()), or clear it with summary:"". Only that field is written, atomically, so a concurrent edit to the steps is never overwritten. Setting the summary of a shipped system workflow the realm has no copy of yet saves a copy of it first. A project-supplied workflow (listed with project:true) is refused (400): copy it explicitly first.

Terminal window
curl -X PUT "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/workflows/lint/summary" \
-H "X-Hoody-Cwd: /home/user/projects/my-app" \
-H "X-Hoody-Config-Dir: /home/user/.hoody" \
-H "Content-Type: application/json" \
-d '{
"summary": "Run the linter and report what it found."
}'
NameInTypeRequiredDescription
namepathstringYesThe name.
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; client.agent.todos.create() also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request —config-dir override selecting which on-disk .hoody install a stateless read/write resolves against.
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local). Rejected (400) on routes with no container dimension.
X-Hoody-RealmheaderstringNoPer-request realm selector: “global” (not tied to a realm) or a 24-hex realm id (also accepted as ?realm=). On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
realmquerystringNoPer-request realm selector — the in:query alias of the X-Hoody-Realm header (read only when the header is absent): “global” (not tied to a realm) or a 24-hex realm id. On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
NameTypeRequiredDescription
summarystringYesThe new summary. An empty string clears it. Required — omitting it is a 400, not a clear.
expected_revisionstringNoOptional optimistic-concurrency guard: the revision: value from client.agent.workflows.get() (?include_revision=true). If the workflow changed or was deleted since that read, the write is refused 409 revision_conflict and nothing is written. Omit to write unconditionally. The revision is bound to the realm this request resolves to: on a gateway without a realm pin, a revision read while another realm was active is refused 409 revision_conflict (details.current_revision is this realm’s), never written into the other realm.
{
"summary": "Run the linter and report what it found."
}
{
"status": "ok",
"name": "lint",
"revision": "rev_01HMZX7P5V3J8N9K4Q2WXABCDE"
}
Error CodeTitleDescriptionResolution

Delete one user workflow definition. System workflows are refused (is_error:true) — they re-seed on boot; hide them instead via client.agent.workflows.setHidden().

Terminal window
curl -X DELETE "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/workflows/lint" \
-H "X-Hoody-Cwd: /home/user/projects/my-app" \
-H "X-Hoody-Config-Dir: /home/user/.hoody"
NameInTypeRequiredDescription
namepathstringYesThe name.
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; client.agent.todos.create() also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request —config-dir override selecting which on-disk .hoody install a stateless read/write resolves against.
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local). Rejected (400) on routes with no container dimension.
X-Hoody-RealmheaderstringNoPer-request realm selector: “global” (not tied to a realm) or a 24-hex realm id (also accepted as ?realm=). On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
realmquerystringNoPer-request realm selector — the in:query alias of the X-Hoody-Realm header (read only when the header is absent): “global” (not tied to a realm) or a 24-hex realm id. On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
{
"status": "ok",
"output": "workflow lint deleted",
"is_error": false
}
Error CodeTitleDescriptionResolution

Hide or un-hide a workflow. Hiding is the only way to remove a system workflow from view (system workflows are re-seeded on every boot and can never be deleted). Pass hidden:false to un-hide. A hide stays private to its realm, named by X-Hoody-Realm or ?realm= (omitted, the agent’s own realm).

Terminal window
curl -X POST "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/workflows/lint/hide" \
-H "X-Hoody-Cwd: /home/user/projects/my-app" \
-H "X-Hoody-Config-Dir: /home/user/.hoody" \
-H "Content-Type: application/json" \
-d '{ "hidden": true }'
NameInTypeRequiredDescription
namepathstringYesThe name.
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; client.agent.todos.create() also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request —config-dir override selecting which on-disk .hoody install a stateless read/write resolves against.
X-Hoody-ContainerheaderstringNoPer-request bound remote container (omitted = local). Rejected (400) on routes with no container dimension.
X-Hoody-RealmheaderstringNoPer-request realm selector: “global” (not tied to a realm) or a 24-hex realm id (also accepted as ?realm=). On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
realmquerystringNoPer-request realm selector — the in:query alias of the X-Hoody-Realm header (read only when the header is absent): “global” (not tied to a realm) or a 24-hex realm id. On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
NameTypeRequiredDescription
hiddenbooleanNotrue (default) to hide the workflow; false to un-hide it.
{
"hidden": true
}
{
"hidden_workflows": ["lint"]
}
Error CodeTitleDescriptionResolution

Snapshot in-flight and recent workflow runs. The registry exposes Snapshot() rather than Subscribe(). Poll this to track a run’s progress; live events also flow on the owning session’s stream.

Terminal window
curl -X GET "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/workflows/runs?page=1&limit=50" \
-H "X-Hoody-Cwd: /home/user/projects/my-app" \
-H "X-Hoody-Config-Dir: /home/user/.hoody"
NameInTypeRequiredDescription
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; client.agent.todos.create() also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request —config-dir override selecting which on-disk .hoody install a stateless read/write resolves against.
realmquerystringNoThe realm to list: “global” (runs not tied to a realm), a 24-hex realm id, or “all” for every realm this login serves. Also accepted as the X-Hoody-Realm header, except “all”. Omitted, the agent’s current realm.
X-Hoody-RealmheaderstringNoPer-request realm selector: “global” (not tied to a realm) or a 24-hex realm id (also accepted as ?realm=). On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
{
"items": [],
"meta": { "total": 0 }
}
Error CodeTitleDescriptionResolution

Get one workflow run by id, including its per-step outcomes (step id, status, duration, tokens, and error). Returns 404 not_found when the run id is no longer retained (evicted or never existed) or belongs to another realm/account (never revealed as existing).

Terminal window
curl -X GET "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/workflows/runs/3b1f0c9e-7a2d-4e58-9c61-0d4b8a7e2f13" \
-H "X-Hoody-Cwd: /home/user/projects/my-app" \
-H "X-Hoody-Config-Dir: /home/user/.hoody"
NameInTypeRequiredDescription
run_idpathstringYesThe run id.
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; client.agent.todos.create() also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request —config-dir override selecting which on-disk .hoody install a stateless read/write resolves against.
X-Hoody-RealmheaderstringNoPer-request realm selector: “global” (not tied to a realm) or a 24-hex realm id (also accepted as ?realm=). On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
realmquerystringNoPer-request realm selector — the in:query alias of the X-Hoody-Realm header (read only when the header is absent): “global” (not tied to a realm) or a 24-hex realm id. On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
{
"run": {
"run_id": "wfr_01HMZX7P5V3J8N9K4Q2WXABCDE",
"status": "running"
}
}
Error CodeTitleDescriptionResolution

Open a new session and dispatch the named workflow onto it in one call, returning 202 {job_id, session_id, run_id, turn_id}. Equivalent to POST /sessions followed by POST /sessions/{id}/workflows/{name}/runs: the run’s events flow on that session’s stream, a gate it parks is answered through that session, and job.run_id is null until the workflow loop registers the run.

The name is checked against the new session’s own realm and project: an unknown name is a 404 and the session is closed without being recorded. The check is best-effort: if the workflow list cannot be read the run is dispatched anyway and an unknown name fails on the session stream. An Idempotency-Key header is refused (400): a retry-safe run needs a keyed POST /sessions followed by client.agent.sessions.startWorkflow().

The session is an ordinary session: it stays listed, and the gateway releases it once it is idle with no attached client. A parked gate counts as idle, so a run that parks a gate while nobody is attached is cancelled after the idle timeout (5 minutes). Attach to the session’s stream to answer its gates, or start it with headless:true to have them decided without a human. If the request ends after the run was sent but before the daemon confirmed it, the session is closed (cancelling the run) since its ids were never returned.

The POST /sessions fields attach, fork, fork_turn_idx, backend, delegated_agent, approval and expected_binding are refused (400), never ignored: create the session first and use client.agent.sessions.startWorkflow().

Terminal window
curl -X POST "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/workflows/release-check/runs" \
-H "X-Hoody-Cwd: /home/user/projects/my-app" \
-H "X-Hoody-Config-Dir: /home/user/.hoody" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Tag and publish v1.4.2",
"inputs": { "version": "1.4.2" },
"cwd": "/home/user/projects/my-app",
"model": "anthropic/claude-sonnet-4",
"tool_mode": "standard",
"dir_scope": "home",
"headless": false
}'
NameInTypeRequiredDescription
namepathstringYesThe name.
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; client.agent.todos.create() also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request —config-dir override selecting which on-disk .hoody install a stateless read/write resolves against.
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.
NameTypeRequiredDescription
promptstringNoOptional input text fed to the workflow run ($(workflow.prompt)).
inputsobjectNoOptional run-time values for the workflow’s declared input parameters (declared name -> string value; resolves to $(input.<name>) in every step). A workflow with a required declared parameter cannot run without these. Values must be strings; a non-string value is a 400.
realmstringNoRealm selector for the new session (frozen at start). A pinned gateway always uses its pin.
containerstringNoContainer id/selector to run tools on (frozen at start).
cwdstringNoWorking directory for the session (frozen at start); it also selects the project workflow layer.
config_dirstringNoConfig directory override.
modelstringNoModel for this session; overrides the chat agent’s pinned model for this session only. An unknown model is refused 422 unknown_model.
agentstringNoInitial chat-agent name.
tool_modestringNoInitial tool mode (frozen at start): standard (the default) or orchestrator. Any other value is refused 400 invalid_tool_mode.
dir_scopestringNoInitial directory-access scope (frozen at start): home or full. Any other value is refused 400 invalid_dir_scope.
headlessbooleanNoStart the session in headless posture.
{
"prompt": "Tag and publish v1.4.2",
"inputs": { "version": "1.4.2" },
"cwd": "/home/user/projects/my-app",
"model": "anthropic/claude-sonnet-4",
"tool_mode": "standard",
"dir_scope": "home",
"headless": false
}
{
"job_id": "job_01HMZX7P5V3J8N9K4Q2WXABCDE",
"session_id": "67e89abc123def456789abcd-890abcdef12345678901cdef",
"run_id": null,
"turn_id": "turn_01HMZX7P5V3J8N9K4Q2WXFGHIJ"
}
Error CodeTitleDescriptionResolution

POST /api/v1/agent/sessions/{id}/workflows/{name}/runs

Section titled “POST /api/v1/agent/sessions/{id}/workflows/{name}/runs”

Dispatch a workflow run onto a live session (a live session_id is required) and returns {job_id}. job.run_id is null during the brief dispatch window and is populated once the workflow loop registers the run (observe workflow_start on the session’s stream). Run events flow on the owning session’s WS/SSE attach; there is no per-run event bus.

Terminal window
curl -X POST "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/sessions/67e89abc123def456789abcd-890abcdef12345678901cdef/workflows/release-check/runs" \
-H "X-Hoody-Cwd: /home/user/projects/my-app" \
-H "X-Hoody-Config-Dir: /home/user/.hoody" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Run the release checklist",
"inputs": { "version": "1.4.2" }
}'
NameInTypeRequiredDescription
idpathstringYesThe session id.
namepathstringYesThe name.
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; client.agent.todos.create() also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request —config-dir override selecting which on-disk .hoody install a stateless read/write resolves against.
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.
NameTypeRequiredDescription
promptstringNoOptional input text fed to the workflow run ($(workflow.prompt)).
inputsobjectNoOptional run-time values for the workflow’s declared input parameters (declared name -> string value; resolves to $(input.<name>) in every step). A workflow with a required declared parameter cannot run without these. Values must be strings; a non-string value is a 400.
{
"prompt": "Run the release checklist",
"inputs": { "version": "1.4.2" }
}
{
"job_id": "job_01HMZX7P5V3J8N9K4Q2WXABCDE",
"session_id": "67e89abc123def456789abcd-890abcdef12345678901cdef",
"run_id": null
}
Error CodeTitleDescriptionResolution

POST /api/v1/agent/workflows/runs/{run_id}/cancel

Section titled “POST /api/v1/agent/workflows/runs/{run_id}/cancel”

Cancel an in-flight workflow run by run id.

Terminal window
curl -X POST "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/workflows/runs/3b1f0c9e-7a2d-4e58-9c61-0d4b8a7e2f13/cancel" \
-H "X-Hoody-Cwd: /home/user/projects/my-app" \
-H "X-Hoody-Config-Dir: /home/user/.hoody"
NameInTypeRequiredDescription
run_idpathstringYesThe run id.
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; client.agent.todos.create() also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request —config-dir override selecting which on-disk .hoody install a stateless read/write resolves against.
X-Hoody-RealmheaderstringNoPer-request realm selector: “global” (not tied to a realm) or a 24-hex realm id (also accepted as ?realm=). On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
realmquerystringNoPer-request realm selector — the in:query alias of the X-Hoody-Realm header (read only when the header is absent): “global” (not tied to a realm) or a 24-hex realm id. On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
{
"status": "ok"
}
Error CodeTitleDescriptionResolution

POST /api/v1/agent/workflows/runs/{run_id}/resume

Section titled “POST /api/v1/agent/workflows/runs/{run_id}/resume”

Resume a terminal (failed/cancelled) run in a live session: committed steps replay from the run’s recorded journal and execution continues live from the first incomplete step. Body: {"session_id"}. The resuming session must match the run’s realm, owner, working directory, and container binding.

Terminal window
curl -X POST "https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/workflows/runs/3b1f0c9e-7a2d-4e58-9c61-0d4b8a7e2f13/resume" \
-H "X-Hoody-Cwd: /home/user/projects/my-app" \
-H "X-Hoody-Config-Dir: /home/user/.hoody" \
-H "Content-Type: application/json" \
-d '{ "session_id": "67e89abc123def456789abcd-890abcdef12345678901cdef" }'
NameInTypeRequiredDescription
run_idpathstringYesThe run id.
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; client.agent.todos.create() also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request —config-dir override selecting which on-disk .hoody install a stateless read/write resolves against.
X-Hoody-RealmheaderstringNoPer-request realm selector: “global” (not tied to a realm) or a 24-hex realm id (also accepted as ?realm=). On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
realmquerystringNoPer-request realm selector — the in:query alias of the X-Hoody-Realm header (read only when the header is absent): “global” (not tied to a realm) or a 24-hex realm id. On a session route it names the realm the session is looked up in: a session in another realm, or in a realm this login does not serve, is 404 not_found. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes, and for any other realm on an agent pinned to one realm.
NameTypeRequiredDescription
session_idstringYesA live session matching the run’s realm, owner, working directory, and container binding.
{
"session_id": "67e89abc123def456789abcd-890abcdef12345678901cdef"
}
{
"status": "ok",
"run_id": "9c2e4a71-5d3b-4f8e-b6a0-1e7d2c9f4b35"
}
Error CodeTitleDescriptionResolution