GET/1.0/tasks/:taskId/runs/:runId
Reads one run of a task. Required scope: workbench:flows:run (scopes reference).
This is how you follow a run you started. A task run isn't a single call that returns an answer — it works through its plan, and it can stop partway to wait for a person or a timer, so poll this until it reaches a status that isn't going to change.
Path parameters
taskIdstringRequiredThe task the run belongs to.
runIdstringRequiredThe run, from the response when you started it.
Response (200)
statusstringOne of running, waiting_human, waiting_timer, done, failed, or canceled. The first three mean come back later; the last three are final.
planobjectThe version of the task's plan this run pinned when it started. A run always finishes against the plan it began with, even if someone edits the task while it's going.
packetobjectWhat the run has gathered so far — the working state its steps have built up.
eventsarrayWhat's happened, step by step, in order.
curl https://api.zerowidth.ai/1.0/tasks/cmpd9k2x10001.../runs/run_8fd21a9c... \
-H "Authorization: Bearer zw_live_abc12345_..."{
"status": "waiting_human",
"plan": { "version": 3 },
"packet": { "flagged": 4 },
"events": [
{ "at": "2026-09-15T16:02:11.000Z", "step": "pull-invoices", "outcome": "ok" },
{ "at": "2026-09-15T16:02:39.000Z", "step": "approve-writeoffs", "outcome": "waiting" }
]
}Errors
Uses the shared error envelope. 404 not_found when the task or run isn't in the key's workspace, plus 401 and 403 scope_missing.