intentic
Create your workspace
Agents

Workflows

Several agents in a fixed order, the designs and the runs

On this page(8 sections)

A workflow is a design: run these conversations, in this order, each handing its result to the next. These routes hold the saved designs and the run history, start a run, stop one in flight, and archive the ones you are done reading.

8 calls. Pick one to open it, or use the list on the right.

GET/workflowsSaved workflows and their runs

Every workflow somebody has designed, each with its own run history, newest first. One answer rather than two, because a workflow that has never been run is the interesting case rather than a mistake.

What you send

Nothing. Call it as it is.

What comes back

FieldType
workflowsEvery saved design with its own…object[]
idThe workflow's idstring
nameWhat to call itstring
descriptionWhat it is forstring
stepsThe steps, each with what it…object[]
idThis step's own name, which other…string
titleWhat to call it on screenstring
goalWhat done means for this step,…string
promptWhat the step is told to…string
needsWhich steps must finish firststring[]
handoffHow it meets what came before:…"fresh" | "continue"
outputWhat it has to produce for…object
kindIt produces nothing but its work"none"
checksWhat has to pass before it…object[]
kindRun something and see if it…"command"
commandThe command to run in the…string
contextHow the step's own repeats meet…"fresh" | "continue"
maxSpendUsdA ceiling on what this step…number
agentWhich provider runs itstring
harnessWhich agentic loop runs it"native" | "claude-code"
accountWhich account pays for itstring
modelWhich model runs itstring
actsAsWhich persona it acts asstring
gatePresent means a machine can run…object
stepWhich step's answer carries the decisionstring
fieldWhich of that step's declared answers…string
passWhich values mean ship itstring[]
tokenThe credential the calling pipeline presentsstring
dailyMaxHow many runs a day, across…integer
maxParallelHow many steps may run at…integer
runsIts runs, newest firstobject[]
runIdThis run's idstring
workflowThe design as it stood when…object
idThe workflow's idstring
nameWhat to call itstring
descriptionWhat it is forstring
stepsThe steps, each with what it…object[]
gatePresent means a machine can run…object
maxParallelHow many steps may run at…integer
reposThe workspace as this run began,…object[]
repostring
basestring
requestWhat this run was asked to…string
stateHow the run is going"running" | "done" | "failed" | "stopped" … (6)
startedAtWhen it began, in millisecondsnumber
endedAtWhen it ended, in millisecondsnumber
resumedHow many times the sandbox restarted…integer
detailWhat went wrong, when something didstring
stepsOne entry per step, in the…object[]
stepIdWhich step this isstring
stateHow it went"pending" | "running" | "done" | "failed" … (6)
conversationIdThe conversation it ran on, and…string
startedAtWhen it began, in millisecondsnumber
endedAtWhen it ended, in millisecondsnumber
iterationsHow many rounds it tookinteger
costUsdWhat it cost, in dollarsnumber
loopStateHow its repeating ended"running" | "done" | "exhausted" | "stalled" … (7)
detailWhat went wrong, when something didstring
documentWhat it produced, once it has…object
reportThe start of its closing wordsstring
reportPathWhere the whole answer is, as…string
archivedAtWhen it was put away, in…number
Try itanswered in this tab
curl
curl "$SANDBOX/workflows" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.workflows.list();
POST/workflowsCreate or replace a workflow

Writes a workflow design. Say which of the two you mean, so an id that happens to collide cannot silently overwrite somebody's work. A design that could never run is refused, in the same words the editor shows while you type: a loop in the steps, a step waiting on one that is not there, a step with no way of knowing it is finished.

What you send

FieldTypeWhere
workflowrequiredThe design to writeobjectbody
idrequiredThe workflow's idstringbody
namerequiredWhat to call itstringbody
descriptionWhat it is forstringbody
stepsrequiredThe steps, each with what it…object[]body
idrequiredThis step's own name, which other…stringbody
titlerequiredWhat to call it on screenstringbody
goalWhat done means for this step,…stringbody
promptWhat the step is told to…stringbody
needsrequiredWhich steps must finish firststring[]body
handoffrequiredHow it meets what came before:…"fresh" | "continue"body
outputrequiredWhat it has to produce for…objectbody
kindrequiredIt produces nothing but its work"none"body
checksrequiredWhat has to pass before it…object[]body
kindrequiredRun something and see if it…"command"body
commandrequiredThe command to run in the…stringbody
contextrequiredHow the step's own repeats meet…"fresh" | "continue"body
maxSpendUsdA ceiling on what this step…numberbody
agentWhich provider runs itstringbody
harnessWhich agentic loop runs it"native" | "claude-code"body
accountWhich account pays for itstringbody
modelWhich model runs itstringbody
actsAsWhich persona it acts asstringbody
gatePresent means a machine can run…objectbody
steprequiredWhich step's answer carries the decisionstringbody
fieldrequiredWhich of that step's declared answers…stringbody
passrequiredWhich values mean ship itstring[]body
tokenThe credential the calling pipeline presentsstringbody
dailyMaxHow many runs a day, across…integerbody
maxParallelrequiredHow many steps may run at…integerbody
createrequiredWhether you mean to make a…booleanbody

What comes back

FieldType
idThe workflow's idstring
nameWhat to call itstring
descriptionWhat it is forstring
stepsThe steps, each with what it…object[]
idThis step's own name, which other…string
titleWhat to call it on screenstring
goalWhat done means for this step,…string
promptWhat the step is told to…string
needsWhich steps must finish firststring[]
handoffHow it meets what came before:…"fresh" | "continue"
outputWhat it has to produce for…object
when kind is "none"shape
when kind is "claim"shape
when kind is "json"shape
fieldsThe shape that answer has to…object[]
checksWhat has to pass before it…object[]
when kind is "command"shape
commandThe command to run in the…string
when kind is "judge"shape
rubricWhat that judge is askedstring
modelWhich model judgesstring
contextHow the step's own repeats meet…"fresh" | "continue"
maxSpendUsdA ceiling on what this step…number
agentWhich provider runs itstring
harnessWhich agentic loop runs it"native" | "claude-code"
accountWhich account pays for itstring
modelWhich model runs itstring
actsAsWhich persona it acts asstring
gatePresent means a machine can run…object
stepWhich step's answer carries the decisionstring
fieldWhich of that step's declared answers…string
passWhich values mean ship itstring[]
tokenThe credential the calling pipeline presentsstring
dailyMaxHow many runs a day, across…integer
maxParallelHow many steps may run at…integer
Try itanswered in this tab
curl
curl -X POST "$SANDBOX/workflows" \
  -H "x-intentic-control: $INTENTIC_TOKEN" \
  -H "content-type: application/json" \
  -d '{"workflow":{"id":"a1b2c3d4","name":"nightly changelog","description":"Runs every night and opens a pull request when anything changed.","steps":[{"id":"a1b2c3d4","title":"Update the changelog","goal":"…","prompt":"Update the changelog for the last five commits.","needs":["…","…"],"handoff":"fresh","output":{},"checks":[],"context":"fresh","maxSpendUsd":1,"agent":"…","harness":"native","account":"work","model":"claude-sonnet-4-6","actsAs":"…"},{"id":"e5f6a7b8","title":"Draft the release notes","goal":"…","prompt":"Update the changelog for the last five commits.","needs":["…","…"],"handoff":"continue","output":{},"checks":[],"context":"continue","maxSpendUsd":1,"agent":"…","harness":"claude-code","account":"work","model":"claude-haiku-4-6","actsAs":"…"}],"gate":{"step":"…","field":"…","pass":["…","…"],"token":"ict_9wQ4rTz8kLmN3pXbV7hJ","dailyMax":1},"maxParallel":1},"create":true}'
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.workflows.save({
  "workflow": {
    "id": "a1b2c3d4",
    "name": "nightly changelog",
    "description": "Runs every night and opens a pull request when anything changed.",
    "steps": [
      {
        "id": "a1b2c3d4",
        "title": "Update the changelog",
        "goal": "",
        "prompt": "Update the changelog for the last five commits.",
        "needs": [
          "",
          ""
        ],
        "handoff": "fresh",
        "output": {},
        "checks": [],
        "context": "fresh",
        "maxSpendUsd": 1,
        "agent": "",
        "harness": "native",
        "account": "work",
        "model": "claude-sonnet-4-6",
        "actsAs": ""
      },
      {
        "id": "e5f6a7b8",
        "title": "Draft the release notes",
        "goal": "",
        "prompt": "Update the changelog for the last five commits.",
        "needs": [
          "",
          ""
        ],
        "handoff": "continue",
        "output": {},
        "checks": [],
        "context": "continue",
        "maxSpendUsd": 1,
        "agent": "",
        "harness": "claude-code",
        "account": "work",
        "model": "claude-haiku-4-6",
        "actsAs": ""
      }
    ],
    "gate": {
      "step": "",
      "field": "",
      "pass": [
        "",
        ""
      ],
      "token": "ict_9wQ4rTz8kLmN3pXbV7hJ",
      "dailyMax": 1
    },
    "maxParallel": 1
  },
  "create": true
});
DELETE/workflows/{id}Delete a workflow

Removes the design. A run of it that is already going keeps going and stays readable and stoppable, because a run takes its own copy of the design when it starts.

What you send

FieldTypeWhere
idrequiredWhich workflowstringaddress

What comes back

FieldType
okAlways truetrue
Try itanswered in this tab
curl
curl -X DELETE "$SANDBOX/workflows/a1b2c3d4" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.workflows.remove({
  "id": "a1b2c3d4"
});
POST/workflows/{id}/runStart a workflow

Kicks a workflow off and answers immediately with the run as recorded; the work carries on without you. Point it at a question and every step gets that on top of its own instructions. Every step is written down as waiting up front, so the picture is complete from the first frame. Several runs of one design can be in flight at once without colliding.

What you send

FieldTypeWhere
idrequiredWhich workflowstringaddress
requestWhat to point it atstringbody

What comes back

FieldType
runIdThis run's idstring
workflowThe design as it stood when…object
idThe workflow's idstring
nameWhat to call itstring
descriptionWhat it is forstring
stepsThe steps, each with what it…object[]
idThis step's own name, which other…string
titleWhat to call it on screenstring
goalWhat done means for this step,…string
promptWhat the step is told to…string
needsWhich steps must finish firststring[]
handoffHow it meets what came before:…"fresh" | "continue"
outputWhat it has to produce for…object
kindIt produces nothing but its work"none"
checksWhat has to pass before it…object[]
kindRun something and see if it…"command"
commandThe command to run in the…string
contextHow the step's own repeats meet…"fresh" | "continue"
maxSpendUsdA ceiling on what this step…number
agentWhich provider runs itstring
harnessWhich agentic loop runs it"native" | "claude-code"
accountWhich account pays for itstring
modelWhich model runs itstring
actsAsWhich persona it acts asstring
gatePresent means a machine can run…object
stepWhich step's answer carries the decisionstring
fieldWhich of that step's declared answers…string
passWhich values mean ship itstring[]
tokenThe credential the calling pipeline presentsstring
dailyMaxHow many runs a day, across…integer
maxParallelHow many steps may run at…integer
reposThe workspace as this run began,…object[]
repostring
basestring
requestWhat this run was asked to…string
stateHow the run is going"running" | "done" | "failed" | "stopped" … (6)
startedAtWhen it began, in millisecondsnumber
endedAtWhen it ended, in millisecondsnumber
resumedHow many times the sandbox restarted…integer
detailWhat went wrong, when something didstring
stepsOne entry per step, in the…object[]
stepIdWhich step this isstring
stateHow it went"pending" | "running" | "done" | "failed" … (6)
conversationIdThe conversation it ran on, and…string
startedAtWhen it began, in millisecondsnumber
endedAtWhen it ended, in millisecondsnumber
iterationsHow many rounds it tookinteger
costUsdWhat it cost, in dollarsnumber
loopStateHow its repeating ended"running" | "done" | "exhausted" | "stalled" … (7)
detailWhat went wrong, when something didstring
documentWhat it produced, once it has…object
doneWhether the goal is metboolean
reasonWhy, in one linestring
evidenceWhat was checked to know thatstring
dataThe declared answer, for a loop…object
reportThe start of its closing wordsstring
reportPathWhere the whole answer is, as…string
archivedAtWhen it was put away, in…number
Try itanswered in this tab
curl
curl -X POST "$SANDBOX/workflows/a1b2c3d4/run" \
  -H "x-intentic-control: $INTENTIC_TOKEN" \
  -H "content-type: application/json" \
  -d '{"request":"…"}'
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.workflows.run({
  "id": "a1b2c3d4",
  "request": ""
});
GET/workflows/runsEvery workflow run

All runs across all workflows, newest first. This is also the only place the runs of a deleted workflow are still reachable.

What you send

Nothing. Call it as it is.

What comes back

FieldType
runsEvery run across every workflow, newest…object[]
runIdThis run's idstring
workflowThe design as it stood when…object
idThe workflow's idstring
nameWhat to call itstring
descriptionWhat it is forstring
stepsThe steps, each with what it…object[]
idThis step's own name, which other…string
titleWhat to call it on screenstring
goalWhat done means for this step,…string
promptWhat the step is told to…string
needsWhich steps must finish firststring[]
handoffHow it meets what came before:…"fresh" | "continue"
outputWhat it has to produce for…object
checksWhat has to pass before it…object[]
contextHow the step's own repeats meet…"fresh" | "continue"
maxSpendUsdA ceiling on what this step…number
agentWhich provider runs itstring
harnessWhich agentic loop runs it"native" | "claude-code"
accountWhich account pays for itstring
modelWhich model runs itstring
actsAsWhich persona it acts asstring
gatePresent means a machine can run…object
stepWhich step's answer carries the decisionstring
fieldWhich of that step's declared answers…string
passWhich values mean ship itstring[]
tokenThe credential the calling pipeline presentsstring
dailyMaxHow many runs a day, across…integer
maxParallelHow many steps may run at…integer
reposThe workspace as this run began,…object[]
repostring
basestring
requestWhat this run was asked to…string
stateHow the run is going"running" | "done" | "failed" | "stopped" … (6)
startedAtWhen it began, in millisecondsnumber
endedAtWhen it ended, in millisecondsnumber
resumedHow many times the sandbox restarted…integer
detailWhat went wrong, when something didstring
stepsOne entry per step, in the…object[]
stepIdWhich step this isstring
stateHow it went"pending" | "running" | "done" | "failed" … (6)
conversationIdThe conversation it ran on, and…string
startedAtWhen it began, in millisecondsnumber
endedAtWhen it ended, in millisecondsnumber
iterationsHow many rounds it tookinteger
costUsdWhat it cost, in dollarsnumber
loopStateHow its repeating ended"running" | "done" | "exhausted" | "stalled" … (7)
detailWhat went wrong, when something didstring
documentWhat it produced, once it has…object
doneWhether the goal is metboolean
reasonWhy, in one linestring
evidenceWhat was checked to know thatstring
dataThe declared answer, for a loop…object
reportThe start of its closing wordsstring
reportPathWhere the whole answer is, as…string
archivedAtWhen it was put away, in…number
Try itanswered in this tab
curl
curl "$SANDBOX/workflows/runs" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.workflows.runs();
POST/workflows/runs/{runId}/stopStop a run now

Nothing further starts, and the steps already going are cut off where they stand. Whatever they had written stays on their branches. Deliberately abrupt rather than letting the current step finish: a step is a whole agent turn, and a stop that kept spending for minutes afterwards is indistinguishable from a button that does nothing. It always ends the run, including one left stranded by a daemon that was replaced mid-flight.

What you send

FieldTypeWhere
runIdrequiredWhich runstringaddress

What comes back

FieldType
okAlways truetrue
Try itanswered in this tab
curl
curl -X POST "$SANDBOX/workflows/runs/run_8c2f41d9/stop" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.workflows.stopRun({
  "runId": "run_8c2f41d9"
});
POST/workflows/runs/{runId}/archiveTake a finished run off the board

Nothing is lost and the working copies are reclaimed. Every conversation the run started is put away with it, which is what makes this an archive rather than a dismissal: a step has no card of its own, so merely dropping the run would spill its conversations onto the board at the moment somebody said they were done. Refused while the run is still going.

What you send

FieldTypeWhere
runIdrequiredWhich runstringaddress

What comes back

FieldType
okAlways truetrue
Try itanswered in this tab
curl
curl -X POST "$SANDBOX/workflows/runs/run_8c2f41d9/archive" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.workflows.archiveRun({
  "runId": "run_8c2f41d9"
});
POST/workflows/runs/{runId}/unarchiveBring an archived run back

Puts a run and every conversation it started back on the board.

What you send

FieldTypeWhere
runIdrequiredWhich runstringaddress

What comes back

FieldType
okAlways truetrue
Try itanswered in this tab
curl
curl -X POST "$SANDBOX/workflows/runs/run_8c2f41d9/unarchive" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.workflows.unarchiveRun({
  "runId": "run_8c2f41d9"
});

Type to search every page, in the docs and the API reference.