Create sessions

Opens a live agent session in the caller's org — the row every surface (the CLI's outer agent, hanzo.bot, the console, chat) hangs its activity off.

POST /v1/agent/sessions

Addresshttps://api.hanzo.ai/v1/agent/sessions
MethodPOST
Operationpost_agent_sessions
AuthAuthorization: Bearer $HANZO_API_KEY

Opens a live agent session in the caller's org — the row every surface (the CLI's outer agent, hanzo.bot, the console, chat) hangs its activity off. A session with a parentSessionId becomes a subagent of that session and inherits its root, so one flow is one tree; without one it is itself a root. Registering with a terminal status records a session that has already finished.

Request

18 fields, body application/json (required).

FieldInTypeRequiredDescription
accountbodystring—Account is which subscription or API account under that provider served the run, up to 256 characters.
actorbodystring—Actor is the "org/sub" identity to record the session under, up to 256 characters.
agentbodystring—Agent is the label the surface opening this session calls itself by ("hanzo-dev").
budget_micro_usdbodyinteger (int64)—BudgetMicroUSD caps what this session may spend, integer micro-USD.
cwdbodystring—Cwd is the directory the session starts in, up to 1024 characters.
hostbodystring—Execution context — where this session runs (all optional).
parentSessionIdbodystring—ParentSessionID makes this a subagent of that session: it inherits the parent's root, so one flow stays one tree.
projectbodystring—The readable build (provenance.go): which product this session builds, and whether its story may be read by the world.
providerbodystring—Account tag — the linked AI account this session ran under (login manager).
publishedbodyboolean—Published opens this session's story to the public build route.
repobodystring—Repo is the code being worked on, up to 512 characters.
roombodystring—Room is the collaborative room this run was started in (HIP-0523), so a space view can list the sessions of one room.
statusbodystring—Status opens the session in one of running, paused, done or error.
targetbodystring—Target names a run-target the org has registered.
taskRunIdbodystring—TaskRunID is that workflow's particular run, same bound.
taskWorkflowIdbodystring—TaskWorkflowID links this session to the hanzoai/tasks workflow that executes it, up to 256 characters.
terminalbodystring—Terminal is the URL this session's live terminal is published at, so the console can watch it.
titlebodystring—Title is the human line a card shows, up to 512 characters.

Response

StatusBodyMeaning
201agent.sessionViewcreated
defaultproblem-detailsrefused

201 body — 45 fields.

FieldInTypeAlwaysDescription
accountbodystring—Account is which subscription or API account under that provider served it.
actorbodystring—Actor is WHO this session belongs to, as "org/sub" — the same identity a run is billed under.
agentbodystring—Agent is the label the surface running this session calls itself by ("hanzo-dev"), up to 128 characters.
basebodystring—Base is the branch the run started from.
branchbodystring—Branch is the branch the run pushes its work to, and the only one it may write.
childrenbodyinteger (int64)—Children is the DIRECT fan-out — how many sessions name this one as parent — and not the size of the subtree.
createdAtbodystring—CreatedAt is when the row was written, same format.
cwdbodystring—Cwd is the directory the session is working in NOW, not the one it started in: a linked shell moves around, and a card showing where hanzo link was run answers "which work is this" with something that was true once.
endedAtbodystring—EndedAt is when it reached done or error, same format.
environmentbodystring—Environment is where the run executes: "sandbox" for a Hanzo sandbox, or the id of the org's machine it was routed to (the same id Target carries).
eventsbodyinteger (int64)—Events is how many turns the session's log holds, counted at read time.
hostbodystring—Execution context (mission-control): the machine/repo/cwd a card shows and the run-target a session is dispatched to.
idbodystring—ID is the session's handle, minted here as "sess_" + 32 hex characters.
kindbodystring—Kind is what sort of run this session is the view of — "coding" for a coding run.
lastEventbodyagent.lastEventView—
lastEvent.actorbodystring—Actor is who produced the turn, defaulted to the calling principal when the writer named nobody.
lastEvent.atbodystring—At is when the turn was recorded, RFC 3339 in UTC to the second.
lastEvent.kindbodystring—Kind is what the turn was, from the log's closed six: message, tool-call, spawn, log, status, control.
lastEvent.previewbodystring—Preview is the first 240 bytes of the event's payload, cut without regard for the JSON inside it — it is a string to SHOW, never a value to parse.
lastEvent.seqbodyinteger (int64)—Seq is that event's position in the session's log — monotonic from 1, per session.
modebodystring—Mode is what the run may do to its repository: "build" edits, commits and pushes its branch; "plan" reads and answers with a plan, writing nothing.
orgbodystring—Org is the caller's OWN tenant, echoed so a client can build the public build URL (/builds/:org/:project) without a second call or a guess.
parentSessionIdbodystring—ParentSessionID is the session that spawned this one, making this a subagent of it.
prbodystring—PR is the address of the pull request the run proposed.
progressbodyagent.sessionProgress—
progress.activitybodystring—Activity is the one line saying what the run is doing right now ("running the reaper's tests"), up to 120 characters, in the model's words.
progress.atbodystring—At is when this was determined, RFC 3339 in UTC to the second.
progress.estimatedbodyboolean—Estimated says a MODEL produced this, from the run's transcript, and it may be wrong.
progress.pctbodyinteger (int64)—Pct is how much of the run is done, 0 to 100.
progress.phasebodystring—Phase is what shape the run is in: running, blocked, done, error, or unknown when nothing has estimated it yet.
projectbodystring—The readable build: the product this session built and whether its story is public (provenance.go).
providerbodystring—Provider is the linked AI account's provider (claude | codex | hanzo | …) that served this run.
publishedbodyboolean—Published is the author's decision to let anyone read this session's story at the public build route.
repobodystring—Repo is the code the session is working on, as the surface reported it.
roombodystring—Room is the collaborative room this run was started in (HIP-0523), empty when it came from anywhere else — a CLI, a schedule, an API call.
rootSessionIdbodystring—RootSessionID is the top of this session's tree, inherited from the parent and shared by every node in one flow.
sandboxbodystring—Sandbox is the id of the sandbox the run works in ("m_" and 24 hex), the handle its terminal and its screen are opened with (/v1/sandbox/{id}/terminal, /screen).
startedAtbodystring—StartedAt is when the session opened, RFC 3339 in UTC to the second.
statusbodystring—Status is one of exactly four: running, paused, done, error.
targetbodystring—Target is the registered run-target this session is dispatched to — a machine the org claimed, resolved same-org when it was set, so it can never point at another tenant's computer.
taskRunIdbodystring—TaskRunID is that workflow's particular run.
taskWorkflowIdbodystring—TaskWorkflowID is the hanzoai/tasks durable workflow that actually EXECUTES this session — this registry is the view, control and stream layer over it.
terminalbodystring—Terminal is where this session can be WATCHED — the URL the machine published for its live terminal.
titlebodystring—Title is the human line a card shows ("ship the landing page"), up to 512 characters.
updatedAtbodystring—UpdatedAt is the session's last-activity clock, same format.

Failure carries the platform error shape — see Errors.

Examples

hanzo agent sessions create
import { Configuration, AgentApi } from 'hanzoai';

const api = new AgentApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postAgentSessions({ account: "<account>", actor: "<actor>" });
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import AgentApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = AgentApi(client).post_agent_sessions(account="<account>", actor="<actor>")
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.AgentAPI.PostAgentSessions(context.Background()).Execute()
if err != nil {
	return err
}
use hanzo_client::apis::{configuration::Configuration, agent_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = agent_api::post_agent_sessions(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.AgentApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new AgentApi(client).postAgentSessions();
curl -X POST https://api.hanzo.ai/v1/agent/sessions \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "account": "<account>",
       "actor": "<actor>"
     }'

MCP reaches agent through the agent tool, which names its 38 operations with its own verbs — this one among them, under a name only MCP declares. describe explains any of them:

curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "describe",
         "arguments": {
           "op": "list_agents"
         }
       }
     }'

Agent API · All Hanzo APIs · Interactive reference

Was this page useful?