---
title: "Automations · intentic sandbox API"
description: "Work the sandbox starts on its own, and the approvals it parks waiting for you. Every route in the automations group of the intentic sandbox API, with its input, its answer and a playground."
url: "https://intentic.dev/api/automations/"
---

Agents

# Automations

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

**On this page (9 sections)**

- [Things that wake an agent on their own](#automations-list)
- [Create or edit an automation](#automations-upsert)
- [What can trigger an automation here](#automations-catalog)
- [Turn an automation on or off](#automations-setEnabled)
- [Delete an automation](#automations-remove)
- [Fire an automation by hand](#automations-run)
- [Automations waiting for a yes](#automations-pendingList)
- [Let a held automation run](#automations-approve)
- [Drop a held automation](#automations-reject)

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`/automations` Things 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

| Field | Type |
| --- | --- |
| `automations` | object[] |
| `id` The automation's id | string |
| `trigger` What sets it off: a schedule,… | object |
| `when kind is "schedule"` | shape |
| `cron` When, in cron notation | string |
| `when kind is "event"` | shape |
| `token` The credential a caller presents | string |
| `when kind is "listener"` | shape |
| `provider` Which service to listen to | string |
| `channelId` Narrow it to one channel or… | string |
| `eventType` Narrow it to one kind of… | string |
| `mentioned` Only when the agent is actually… | boolean |
| `branch` Narrow it to one branch, for… | string |
| `allowedOrigins` Which websites may reach the chat… | string[] |
| `when kind is "workspace"` | shape |
| `event` Which happening | "turn.settled" | "agent.landed" | "deps.broken" | "deps.fixed" |
| `repo` Narrow it to one repository | string |
| `guard` A command run before the wake… | string |
| `prompt` What the woken agent is told | string |
| `webchat` Settings for the public chat widget,… | object |
| `access` Who may write to it | "public" | "google" |
| `requireName` Ask a visitor for a name… | boolean |
| `antiBot` How to keep bots out: a… | "turnstile" | "pow" |
| `turnstileSiteKey` The public half of those keys,… | string |
| `turnstileSecret` The private half, which the sandbox… | string |
| `googleClientId` The site's own sign-in client id | string |
| `title` | string |
| `greeting` | string |
| `accent` | string |
| `position` | "top-right" | "top-left" | "bottom-right" | "bottom-left" |
| `dailyMessageMax` | integer |
| `conversationMessageMax` | integer |
| `sessionTtlMinutes` | integer |
| `allowedTools` Narrow the woken turn to these… | string[] |
| `agent` Which provider serves the wake | string |
| `account` Which account pays for it | string |
| `actsAs` Which persona it speaks as | string |
| `harness` Which agentic loop runs it | "native" | "claude-code" |
| `model` Which model runs it | string |
| `requireApproval` Hold every fire for a person… | boolean |
| `holdForSeconds` Hold each fire this long before… | number |
| `chore` This automation is a maintenance job,… | boolean |
| `enabled` Whether it fires at all | boolean |
| `runs` | object[] |
| `at` | number |
| `outcome` | "completed" | "skipped" | "error" | "interrupted" |
| `detail` | string |
| `conversationId` | string |
| `nextRun` | number |

Try it answered in this tab

curl

```bash
curl "$SANDBOX/automations" \
 -H "x-intentic-control: $INTENTIC_TOKEN"
```

TypeScript

```typescript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.automations.list();
```

**POST`/automations` Create or edit an automation**

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

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `id` required The automation's id | string | body |
| `trigger` required What sets it off: a schedule,… | object | body |
| `when kind is "schedule"` | shape | body |
| `cron` required When, in cron notation | string | body |
| `when kind is "event"` | shape | body |
| `token` The credential a caller presents | string | body |
| `when kind is "listener"` | shape | body |
| `provider` required Which service to listen to | string | body |
| `channelId` Narrow it to one channel or… | string | body |
| `eventType` Narrow it to one kind of… | string | body |
| `mentioned` Only when the agent is actually… | boolean | body |
| `branch` Narrow it to one branch, for… | string | body |
| `allowedOrigins` Which websites may reach the chat… | string[] | body |
| `when kind is "workspace"` | shape | body |
| `event` required Which happening | "turn.settled" | "agent.landed" | "deps.broken" | "deps.fixed" | body |
| `repo` Narrow it to one repository | string | body |
| `guard` A command run before the wake… | string | body |
| `prompt` required What the woken agent is told | string | body |
| `webchat` Settings for the public chat widget,… | object | body |
| `access` Who may write to it | "public" | "google" | body |
| `requireName` Ask a visitor for a name… | boolean | body |
| `antiBot` How to keep bots out: a… | "turnstile" | "pow" | body |
| `turnstileSiteKey` The public half of those keys,… | string | body |
| `turnstileSecret` The private half, which the sandbox… | string | body |
| `googleClientId` The site's own sign-in client id | string | body |
| `title` | string | body |
| `greeting` | string | body |
| `accent` | string | body |
| `position` | "top-right" | "top-left" | "bottom-right" | "bottom-left" | body |
| `dailyMessageMax` | integer | body |
| `conversationMessageMax` | integer | body |
| `sessionTtlMinutes` | integer | body |
| `allowedTools` Narrow the woken turn to these… | string[] | body |
| `agent` Which provider serves the wake | string | body |
| `account` Which account pays for it | string | body |
| `actsAs` Which persona it speaks as | string | body |
| `harness` Which agentic loop runs it | "native" | "claude-code" | body |
| `model` Which model runs it | string | body |
| `requireApproval` Hold every fire for a person… | boolean | body |
| `holdForSeconds` Hold each fire this long before… | number | body |
| `chore` This automation is a maintenance job,… | boolean | body |
| `enabled` required Whether it fires at all | boolean | body |

### What comes back

| Field | Type |
| --- | --- |
| `ok` Always true | true |

Try it answered in this tab

curl

```bash
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

```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/catalog` What 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

| Field | Type |
| --- | --- |
| `sources` | object[] |
| `provider` | string |
| `label` | string |
| `logo` | string |
| `icon` | string |
| `events` | object[] |
| `value` | string |
| `label` | string |
| `channel` | object |
| `label` | string |
| `placeholder` | string |
| `hint` | string |
| `branchField` | object |
| `label` | string |
| `placeholder` | string |
| `hint` | string |
| `mentionLabel` | string |
| `starterPrompt` | string |
| `requires` | string[] |
| `enabled` | boolean |
| `templates` | object[] |
| `id` | string |
| `title` | string |
| `logo` | string |
| `icon` | string |
| `requires` | string[] |
| `trigger` | object |
| `when kind is "schedule"` | shape |
| `cron` When, in cron notation | string |
| `when kind is "event"` | shape |
| `token` The credential a caller presents | string |
| `when kind is "listener"` | shape |
| `provider` Which service to listen to | string |
| `channelId` Narrow it to one channel or… | string |
| `eventType` Narrow it to one kind of… | string |
| `mentioned` Only when the agent is actually… | boolean |
| `branch` Narrow it to one branch, for… | string |
| `allowedOrigins` Which websites may reach the chat… | string[] |
| `when kind is "workspace"` | shape |
| `event` Which happening | "turn.settled" | "agent.landed" | "deps.broken" | "deps.fixed" |
| `repo` Narrow it to one repository | string |
| `guard` | string |
| `holdForSeconds` | integer |
| `prompt` | string |
| `note` | string |
| `setup` | string |
| `description` | string |
| `offer` | "create" | "configure" |
| `chore` | boolean |

Try it answered in this tab

curl

```bash
curl "$SANDBOX/automations/catalog" \
 -H "x-intentic-control: $INTENTIC_TOKEN"
```

TypeScript

```typescript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.automations.catalog();
```

**POST`/automations/{id}/enabled` Turn 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

| Field | Type | Where |
| --- | --- | --- |
| `id` required | string | address |
| `enabled` required | boolean | body |

### What comes back

| Field | Type |
| --- | --- |
| `ok` Always true | true |

Try it answered in this tab

curl

```bash
curl -X POST "$SANDBOX/automations/a1b2c3d4/enabled" \
 -H "x-intentic-control: $INTENTIC_TOKEN" \
 -H "content-type: application/json" \
 -d '{"enabled":true}'
```

TypeScript

```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

| Field | Type | Where |
| --- | --- | --- |
| `id` required | string | address |

### What comes back

| Field | Type |
| --- | --- |
| `ok` Always true | true |

Try it answered in this tab

curl

```bash
curl -X DELETE "$SANDBOX/automations/a1b2c3d4" \
 -H "x-intentic-control: $INTENTIC_TOKEN"
```

TypeScript

```typescript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.automations.remove({
 "id": "a1b2c3d4"
});
```

**POST`/automations/{id}/run` Fire 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

| Field | Type | Where |
| --- | --- | --- |
| `id` required | string | address |

### What comes back

| Field | Type |
| --- | --- |
| `ok` Always true | true |

Try it answered in this tab

curl

```bash
curl -X POST "$SANDBOX/automations/a1b2c3d4/run" \
 -H "x-intentic-control: $INTENTIC_TOKEN"
```

TypeScript

```typescript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.automations.run({
 "id": "a1b2c3d4"
});
```

**GET`/automations/pending` Automations 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

| Field | Type |
| --- | --- |
| `approvals` Everything waiting for a yes | object[] |
| `id` This waiting item's own id, which… | string |
| `automationId` Which automation it came from | string |
| `payload` What set it off, kept whole… | string |
| `origin` Where the message came from, kept… | object |
| `automationId` | string |
| `provider` | string |
| `channelId` | string |
| `author` | string |
| `title` What the conversation would be called | string |
| `conversationId` The thread this belongs to, when… | string |
| `sessionId` The provider session that thread last… | string |
| `createdAt` When it started waiting, in milliseconds | number |
| `autoRunAt` When it goes ahead on its… | number |

Try it answered in this tab

curl

```bash
curl "$SANDBOX/automations/pending" \
 -H "x-intentic-control: $INTENTIC_TOKEN"
```

TypeScript

```typescript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.automations.pendingList();
```

**POST`/automations/pending/{id}/approve` Let a held automation run**

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

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `id` required Which waiting item | string | address |

### What comes back

| Field | Type |
| --- | --- |
| `ok` Always true | true |

Try it answered in this tab

curl

```bash
curl -X POST "$SANDBOX/automations/pending/a1b2c3d4/approve" \
 -H "x-intentic-control: $INTENTIC_TOKEN"
```

TypeScript

```typescript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.automations.approve({
 "id": "a1b2c3d4"
});
```

**POST`/automations/pending/{id}/reject` Drop a held automation**

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

### What you send

| Field | Type | Where |
| --- | --- | --- |
| `id` required Which waiting item | string | address |

### What comes back

| Field | Type |
| --- | --- |
| `ok` Always true | true |

Try it answered in this tab

curl

```bash
curl -X POST "$SANDBOX/automations/pending/a1b2c3d4/reject" \
 -H "x-intentic-control: $INTENTIC_TOKEN"
```

TypeScript

```typescript
import { sandbox } from "@intentic/sandbox-client";

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

More in Agents

[Previous ← Loops](https://intentic.dev/api/loops/)
