intentic
Download the app
Download the app
Agents

Automations

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

On this page(11 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.

11 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
tzWhich clock the times in the…string
afterSessionsFire only once at least this…integer
when kind is "once"shape
atThe moment it fires, in millisecondsinteger
when kind is "event"shape
dailyMaxHow many webhook calls a day…integer
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 public…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
issuesSettings for the bug reporter, for…object
keyFromBrowsersLet a browser report with the…boolean
dailyReportMaxHow many reports a day this…integer
escalateAfterHow many more times a known…integer
antiBotMake a person's browser solve a…"pow"
titleThe dialog's headingstring
promptThe line above the box they…string
thanksWhat it says once they have…string
askEmailAsk for an address to reply…boolean
accentstring
captureCrashesCatch uncaught errors automatically, as well…boolean
allowedToolsNarrow the woken turn to these…string[]
modelsWhich models this automation may run…object[]
providerWhich provider serves this workstring
modelWhich of its modelsstring
effortHow hard this model should think,…string
thinkingWhether this model reasons before it…boolean
fastAsk for this model's work at…boolean
harnessWhich agentic loop runs it"native" | "claude-code"
accountWhich account pays for itstring
actsAsWhich persona it speaks asstring
sendersWho may talk to it, and…object
rulesWalked in order; the first rule…object[]
labelWhat to call these people on…string
idsSender ids, as the service names…string[]
groupsGroup ids the service reports on…string[]
actsAsWhich persona their wakes speak asstring
requireApprovalHold their wakes for a person,…boolean
othersWhat a sender no rule names…"allow" | "hold" | "ignore"
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
webhookTokenWhat a caller presents at /automations/{id}/fire,…string
ingestKeyWhat a client with no website…string
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
tzWhich clock the times in the…stringbody
afterSessionsFire only once at least this…integerbody
when kind is "once"shapebody
atrequiredThe moment it fires, in millisecondsintegerbody
when kind is "event"shapebody
dailyMaxHow many webhook calls a day…integerbody
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 public…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
issuesSettings for the bug reporter, for…objectbody
keyFromBrowsersLet a browser report with the…booleanbody
dailyReportMaxHow many reports a day this…integerbody
escalateAfterHow many more times a known…integerbody
antiBotMake a person's browser solve a…"pow"body
titleThe dialog's headingstringbody
promptThe line above the box they…stringbody
thanksWhat it says once they have…stringbody
askEmailAsk for an address to reply…booleanbody
accentstringbody
captureCrashesCatch uncaught errors automatically, as well…booleanbody
allowedToolsNarrow the woken turn to these…string[]body
modelsrequiredWhich models this automation may run…object[]body
providerrequiredWhich provider serves this workstringbody
modelrequiredWhich of its modelsstringbody
effortHow hard this model should think,…stringbody
thinkingWhether this model reasons before it…booleanbody
fastAsk for this model's work at…booleanbody
harnessWhich agentic loop runs it"native" | "claude-code"body
accountWhich account pays for itstringbody
actsAsWhich persona it speaks asstringbody
sendersWho may talk to it, and…objectbody
rulesrequiredWalked in order; the first rule…object[]body
labelWhat to call these people on…stringbody
idsSender ids, as the service names…string[]body
groupsGroup ids the service reports on…string[]body
actsAsWhich persona their wakes speak asstringbody
requireApprovalHold their wakes for a person,…booleanbody
othersrequiredWhat a sender no rule names…"allow" | "hold" | "ignore"body
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":"…","tz":"…","afterSessions":1},"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},"issues":{"keyFromBrowsers":true,"dailyReportMax":1,"escalateAfter":1,"antiBot":"pow","title":"Update the changelog","prompt":"Update the changelog for the last five commits.","thanks":"…","askEmail":true,"accent":"…","captureCrashes":true},"allowedTools":["…","…"],"models":[{"provider":"claude","model":"claude-sonnet-4-6","effort":"…","thinking":true,"fast":true,"harness":"native"},{"provider":"claude","model":"claude-haiku-4-6","effort":"…","thinking":true,"fast":true,"harness":"claude-code"}],"account":"work","actsAs":"…","senders":{"rules":[{"label":"Nightly changelog","ids":["a1b2c3d4","e5f6a7b8"],"groups":["…","…"],"actsAs":"…","requireApproval":true},{"label":"Release notes","ids":["a1b2c3d4","e5f6a7b8"],"groups":["…","…"],"actsAs":"…","requireApproval":true}],"others":"allow"},"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": "…",
    "tz": "…",
    "afterSessions": 1
  },
  "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
  },
  "issues": {
    "keyFromBrowsers": true,
    "dailyReportMax": 1,
    "escalateAfter": 1,
    "antiBot": "pow",
    "title": "Update the changelog",
    "prompt": "Update the changelog for the last five commits.",
    "thanks": "…",
    "askEmail": true,
    "accent": "…",
    "captureCrashes": true
  },
  "allowedTools": [
    "…",
    "…"
  ],
  "models": [
    {
      "provider": "claude",
      "model": "claude-sonnet-4-6",
      "effort": "…",
      "thinking": true,
      "fast": true,
      "harness": "native"
    },
    {
      "provider": "claude",
      "model": "claude-haiku-4-6",
      "effort": "…",
      "thinking": true,
      "fast": true,
      "harness": "claude-code"
    }
  ],
  "account": "work",
  "actsAs": "…",
  "senders": {
    "rules": [
      {
        "label": "Nightly changelog",
        "ids": [
          "a1b2c3d4",
          "e5f6a7b8"
        ],
        "groups": [
          "…",
          "…"
        ],
        "actsAs": "…",
        "requireApproval": true
      },
      {
        "label": "Release notes",
        "ids": [
          "a1b2c3d4",
          "e5f6a7b8"
        ],
        "groups": [
          "…",
          "…"
        ],
        "actsAs": "…",
        "requireApproval": true
      }
    ],
    "others": "allow"
  },
  "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
senderobject
labelstring
placeholderstring
hintstring
senderGroupobject
labelstring
placeholderstring
hintstring
mentionLabelstring
starterPromptstring
requiresstring[]
enabledboolean
templatesobject[]
idstring
titlestring
logostring
iconstring
requiresstring[]
triggerobject
when kind is "schedule"shape
cronWhen, in cron notationstring
tzWhich clock the times in the…string
afterSessionsFire only once at least this…integer
when kind is "once"shape
atThe moment it fires, in millisecondsinteger
when kind is "event"shape
dailyMaxHow many webhook calls a day…integer
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 public…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}/rotate-tokenRotate an automation's webhook token or intake key

Mints a new credential for the door this automation opens and retires the old one at once. Every caller has to be handed the new URL; that is the point. Refused for an automation with no door.

What you send

FieldTypeWhere
idrequiredstringaddress

What comes back

FieldType
tokenThe freshly minted credentialstring
Try itanswered in this tab
curl
curl -X POST "$SANDBOX/automations/a1b2c3d4/rotate-token" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.automations.rotateToken({
  "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/senders/{provider}Who has written to a listener source

Everyone whose message reached one of this source's automations, newest first, admitted or not. What the sender rules picker offers by name while storing the id the service vouches for.

What you send

FieldTypeWhere
providerrequiredWhich listener sourcestringaddress

What comes back

FieldType
sendersNewest firstobject[]
idThe sender id the service vouches…string
nameWhat they were called on their…string
groupsThe group ids the service reported…string[]
firstSeenAtWhen they first reached an automation…number
lastSeenAtWhen they last did, in millisecondsnumber
messagesHow many of their messages reached…number
Try itanswered in this tab
curl
curl "$SANDBOX/automations/senders/claude" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.automations.senders({
  "provider": "claude"
});
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
threadWhich inbound thread this belongs to,…string
actsAsWhich persona the approved run speaks…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.