intentic
Create your workspace
Agents

Automations

Work the sandbox starts on its own, and the approvals it parks waiting for you

On this page(9 sections)

Scheduled and triggered work: what can trigger one here, what is configured, and switching one on or off, deleting it or firing it by hand. The other half is the approval queue — an automation set to ask first lands there each time it would have run.

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

GET/automationsThings that wake an agent on their own

Every automation with its recent runs and when it fires next.

What you send

Nothing. Call it as it is.

What comes back

FieldType
automationsobject[]
idThe automation's idstring
triggerWhat sets it off: a schedule,…object
when kind is "schedule"shape
cronWhen, in cron notationstring
when kind is "event"shape
tokenThe credential a caller presentsstring
when kind is "listener"shape
providerWhich service to listen tostring
channelIdNarrow it to one channel or…string
eventTypeNarrow it to one kind of…string
mentionedOnly when the agent is actually…boolean
branchNarrow it to one branch, for…string
allowedOriginsWhich websites may reach the chat…string[]
when kind is "workspace"shape
eventWhich happening"turn.settled" | "agent.landed" | "deps.broken" | "deps.fixed"
repoNarrow it to one repositorystring
guardA command run before the wake…string
promptWhat the woken agent is toldstring
webchatSettings for the public chat widget,…object
accessWho may write to it"public" | "google"
requireNameAsk a visitor for a name…boolean
antiBotHow to keep bots out: a…"turnstile" | "pow"
turnstileSiteKeyThe public half of those keys,…string
turnstileSecretThe private half, which the sandbox…string
googleClientIdThe site's own sign-in client idstring
titlestring
greetingstring
accentstring
position"top-right" | "top-left" | "bottom-right" | "bottom-left"
dailyMessageMaxinteger
conversationMessageMaxinteger
sessionTtlMinutesinteger
allowedToolsNarrow the woken turn to these…string[]
agentWhich provider serves the wakestring
accountWhich account pays for itstring
actsAsWhich persona it speaks asstring
harnessWhich agentic loop runs it"native" | "claude-code"
modelWhich model runs itstring
requireApprovalHold every fire for a person…boolean
holdForSecondsHold each fire this long before…number
choreThis automation is a maintenance job,…boolean
enabledWhether it fires at allboolean
runsobject[]
atnumber
outcome"completed" | "skipped" | "error" | "interrupted"
detailstring
conversationIdstring
nextRunnumber
Try itanswered in this tab
curl
curl "$SANDBOX/automations" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.automations.list();
POST/automationsCreate or edit an automation

Writes an automation by id. Nothing needs provisioning: the scheduler picks it up on its next sweep.

What you send

FieldTypeWhere
idrequiredThe automation's idstringbody
triggerrequiredWhat sets it off: a schedule,…objectbody
when kind is "schedule"shapebody
cronrequiredWhen, in cron notationstringbody
when kind is "event"shapebody
tokenThe credential a caller presentsstringbody
when kind is "listener"shapebody
providerrequiredWhich service to listen tostringbody
channelIdNarrow it to one channel or…stringbody
eventTypeNarrow it to one kind of…stringbody
mentionedOnly when the agent is actually…booleanbody
branchNarrow it to one branch, for…stringbody
allowedOriginsWhich websites may reach the chat…string[]body
when kind is "workspace"shapebody
eventrequiredWhich happening"turn.settled" | "agent.landed" | "deps.broken" | "deps.fixed"body
repoNarrow it to one repositorystringbody
guardA command run before the wake…stringbody
promptrequiredWhat the woken agent is toldstringbody
webchatSettings for the public chat widget,…objectbody
accessWho may write to it"public" | "google"body
requireNameAsk a visitor for a name…booleanbody
antiBotHow to keep bots out: a…"turnstile" | "pow"body
turnstileSiteKeyThe public half of those keys,…stringbody
turnstileSecretThe private half, which the sandbox…stringbody
googleClientIdThe site's own sign-in client idstringbody
titlestringbody
greetingstringbody
accentstringbody
position"top-right" | "top-left" | "bottom-right" | "bottom-left"body
dailyMessageMaxintegerbody
conversationMessageMaxintegerbody
sessionTtlMinutesintegerbody
allowedToolsNarrow the woken turn to these…string[]body
agentWhich provider serves the wakestringbody
accountWhich account pays for itstringbody
actsAsWhich persona it speaks asstringbody
harnessWhich agentic loop runs it"native" | "claude-code"body
modelWhich model runs itstringbody
requireApprovalHold every fire for a person…booleanbody
holdForSecondsHold each fire this long before…numberbody
choreThis automation is a maintenance job,…booleanbody
enabledrequiredWhether it fires at allbooleanbody

What comes back

FieldType
okAlways truetrue
Try itanswered in this tab
curl
curl -X POST "$SANDBOX/automations" \
  -H "x-intentic-control: $INTENTIC_TOKEN" \
  -H "content-type: application/json" \
  -d '{"id":"a1b2c3d4","trigger":{"kind":"schedule","cron":"…"},"guard":"…","prompt":"Update the changelog for the last five commits.","webchat":{"access":"public","requireName":true,"antiBot":"turnstile","turnstileSiteKey":"…","turnstileSecret":"…","googleClientId":"a1b2c3d4","title":"Update the changelog","greeting":"…","accent":"…","position":"top-right","dailyMessageMax":1,"conversationMessageMax":1,"sessionTtlMinutes":1},"allowedTools":["…","…"],"agent":"…","account":"work","actsAs":"…","harness":"native","model":"claude-sonnet-4-6","requireApproval":true,"holdForSeconds":1,"chore":true,"enabled":true}'
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.automations.upsert({
  "id": "a1b2c3d4",
  "trigger": {
    "kind": "schedule",
    "cron": ""
  },
  "guard": "",
  "prompt": "Update the changelog for the last five commits.",
  "webchat": {
    "access": "public",
    "requireName": true,
    "antiBot": "turnstile",
    "turnstileSiteKey": "",
    "turnstileSecret": "",
    "googleClientId": "a1b2c3d4",
    "title": "Update the changelog",
    "greeting": "",
    "accent": "",
    "position": "top-right",
    "dailyMessageMax": 1,
    "conversationMessageMax": 1,
    "sessionTtlMinutes": 1
  },
  "allowedTools": [
    "",
    ""
  ],
  "agent": "",
  "account": "work",
  "actsAs": "",
  "harness": "native",
  "model": "claude-sonnet-4-6",
  "requireApproval": true,
  "holdForSeconds": 1,
  "chore": true,
  "enabled": true
});
GET/automations/catalogWhat can trigger an automation here

Every trigger this sandbox understands and every template worth starting from, the daemon's own merged with each installed extension's. Writing an automation is checked against this same list, so a screen and the daemon can never disagree about what is allowed.

What you send

Nothing. Call it as it is.

What comes back

FieldType
sourcesobject[]
providerstring
labelstring
logostring
iconstring
eventsobject[]
valuestring
labelstring
channelobject
labelstring
placeholderstring
hintstring
branchFieldobject
labelstring
placeholderstring
hintstring
mentionLabelstring
starterPromptstring
requiresstring[]
enabledboolean
templatesobject[]
idstring
titlestring
logostring
iconstring
requiresstring[]
triggerobject
when kind is "schedule"shape
cronWhen, in cron notationstring
when kind is "event"shape
tokenThe credential a caller presentsstring
when kind is "listener"shape
providerWhich service to listen tostring
channelIdNarrow it to one channel or…string
eventTypeNarrow it to one kind of…string
mentionedOnly when the agent is actually…boolean
branchNarrow it to one branch, for…string
allowedOriginsWhich websites may reach the chat…string[]
when kind is "workspace"shape
eventWhich happening"turn.settled" | "agent.landed" | "deps.broken" | "deps.fixed"
repoNarrow it to one repositorystring
guardstring
holdForSecondsinteger
promptstring
notestring
setupstring
descriptionstring
offer"create" | "configure"
choreboolean
Try itanswered in this tab
curl
curl "$SANDBOX/automations/catalog" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.automations.catalog();
POST/automations/{id}/enabledTurn an automation on or off

Flips only the switch, so a row in a list can be toggled without rebuilding the whole record.

What you send

FieldTypeWhere
idrequiredstringaddress
enabledrequiredbooleanbody

What comes back

FieldType
okAlways truetrue
Try itanswered in this tab
curl
curl -X POST "$SANDBOX/automations/a1b2c3d4/enabled" \
  -H "x-intentic-control: $INTENTIC_TOKEN" \
  -H "content-type: application/json" \
  -d '{"enabled":true}'
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.automations.setEnabled({
  "id": "a1b2c3d4",
  "enabled": true
});
DELETE/automations/{id}Delete an automation

Removes it, so nothing fires from it again.

What you send

FieldTypeWhere
idrequiredstringaddress

What comes back

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

const result = await sandbox.automations.remove({
  "id": "a1b2c3d4"
});
POST/automations/{id}/runFire an automation by hand

The answer to writing something that runs at three in the morning and having no way to try it. It takes exactly the path the real trigger takes, including the check that decides whether there was anything to do, since skipped by the guard is the most useful thing this can tell you. A switched-off automation fires too, because trying it before switching it on is the main reason to press this. Not available for the trigger that listens for incoming messages, where a hand-fire would produce an agent asked to handle events and handed none; send the bot a message instead. Answers straight away and runs detached.

What you send

FieldTypeWhere
idrequiredstringaddress

What comes back

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

const result = await sandbox.automations.run({
  "id": "a1b2c3d4"
});
GET/automations/pendingAutomations waiting for a yes

The queue an automation set to ask first lands in each time it would have fired.

What you send

Nothing. Call it as it is.

What comes back

FieldType
approvalsEverything waiting for a yesobject[]
idThis waiting item's own id, which…string
automationIdWhich automation it came fromstring
payloadWhat set it off, kept whole…string
originWhere the message came from, kept…object
automationIdstring
providerstring
channelIdstring
authorstring
titleWhat the conversation would be calledstring
conversationIdThe thread this belongs to, when…string
sessionIdThe provider session that thread last…string
createdAtWhen it started waiting, in millisecondsnumber
autoRunAtWhen it goes ahead on its…number
Try itanswered in this tab
curl
curl "$SANDBOX/automations/pending" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.automations.pendingList();
POST/automations/pending/{id}/approveLet a held automation run

Releases one waiting automation and runs the wake it was holding. Answers straight away and runs detached.

What you send

FieldTypeWhere
idrequiredWhich waiting itemstringaddress

What comes back

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

const result = await sandbox.automations.approve({
  "id": "a1b2c3d4"
});
POST/automations/pending/{id}/rejectDrop a held automation

Throws one waiting fire away. The automation stays on, and the next trigger queues as usual.

What you send

FieldTypeWhere
idrequiredWhich waiting itemstringaddress

What comes back

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

const result = await sandbox.automations.reject({
  "id": "a1b2c3d4"
});
More in Agents

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