intentic
Download the app
Download the app
Ship and share

Approvals

Things the agent has prepared, waiting for you to say yes

On this page(6 sections)

The owner's side of the queue: posts to publish, actions to carry out. The agent writes the files directly; this is the inbox, the one call that covers approving, editing and retrying, and the deletion that is a rejection.

GET/approvalsThings waiting for your yes

Everything an agent has prepared and would like to do: posts to publish, actions to carry out. Nothing here has happened yet.

What you send

Nothing. Call it as it is.

What comes back

FieldType
approvalsThe queueobject[]
when kind is "post"shape
platformWhere it should gostring
contentThe post itselfstring
titleA title, where the site wants…string
targetWhere on the site: a community,…string
mediaAnything to attach, as workspace pathsstring[]
actsAsWhose name it acts understring
scheduledAtWhen it should happen, in millisecondsnumber
statusWhere it is: proposed by the…"proposed" | "approved" | "running" | "done" … (5)
createdAtWhen it was written, in millisecondsnumber
startedAtWhen it started being carried out,…number
finishedAtWhen it was done, in millisecondsnumber
resultWhat came back, when something did:…string
errorWhy it failed, written as a…string
idThe approval's idstring
when kind is "action"shape
summaryWhat will happen, in one line:…string
detailsThe specifics, as Markdown: everything you…string
instructionsWhat to do once approved, written…string
actsAsWhose name it acts understring
scheduledAtWhen it should happen, in millisecondsnumber
statusWhere it is: proposed by the…"proposed" | "approved" | "running" | "done" … (5)
createdAtWhen it was written, in millisecondsnumber
startedAtWhen it started being carried out,…number
finishedAtWhen it was done, in millisecondsnumber
resultWhat came back, when something did:…string
errorWhy it failed, written as a…string
idThe approval's idstring
invalidFiles that could not be read…string[]
Try itanswered in this tab
curl
curl "$SANDBOX/approvals" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.approvals.list();
POST/approvalsApprove, edit or retry one

All three are the same act with a different field changed, so they share one call. Send the item back as you want it.

What you send

FieldTypeWhere
when kind is "post"shapebody
platformrequiredWhere it should gostringbody
contentrequiredThe post itselfstringbody
titleA title, where the site wants…stringbody
targetWhere on the site: a community,…stringbody
mediaAnything to attach, as workspace pathsstring[]body
actsAsWhose name it acts understringbody
scheduledAtWhen it should happen, in millisecondsnumberbody
statusWhere it is: proposed by the…"proposed" | "approved" | "running" | "done" … (5)body
createdAtWhen it was written, in millisecondsnumberbody
startedAtWhen it started being carried out,…numberbody
finishedAtWhen it was done, in millisecondsnumberbody
resultWhat came back, when something did:…stringbody
errorWhy it failed, written as a…stringbody
idrequiredThe approval's idstringbody
when kind is "action"shapebody
summaryrequiredWhat will happen, in one line:…stringbody
detailsThe specifics, as Markdown: everything you…stringbody
instructionsrequiredWhat to do once approved, written…stringbody
actsAsWhose name it acts understringbody
scheduledAtWhen it should happen, in millisecondsnumberbody
statusWhere it is: proposed by the…"proposed" | "approved" | "running" | "done" … (5)body
createdAtWhen it was written, in millisecondsnumberbody
startedAtWhen it started being carried out,…numberbody
finishedAtWhen it was done, in millisecondsnumberbody
resultWhat came back, when something did:…stringbody
errorWhy it failed, written as a…stringbody
idrequiredThe approval's idstringbody

What comes back

FieldType
okAlways truetrue
Try itanswered in this tab
curl
curl -X POST "$SANDBOX/approvals" \
  -H "x-intentic-control: $INTENTIC_TOKEN" \
  -H "content-type: application/json" \
  -d '{"kind":"post","platform":"…","content":"export const start = () => listen(PORT);\n","title":"Update the changelog","target":"…","media":["…","…"],"actsAs":"…","scheduledAt":1,"status":"proposed","createdAt":1,"startedAt":1,"finishedAt":1,"result":"…","error":"The repository has no remote configured.","id":"a1b2c3d4"}'
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.approvals.upsert({
  "kind": "post",
  "platform": "…",
  "content": "export const start = () => listen(PORT);\n",
  "title": "Update the changelog",
  "target": "…",
  "media": [
    "…",
    "…"
  ],
  "actsAs": "…",
  "scheduledAt": 1,
  "status": "proposed",
  "createdAt": 1,
  "startedAt": 1,
  "finishedAt": 1,
  "result": "…",
  "error": "The repository has no remote configured.",
  "id": "a1b2c3d4"
});
DELETE/approvals/{id}Reject one

Throws it away undone.

What you send

FieldTypeWhere
idrequiredWhich approvalstringaddress

What comes back

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

const result = await sandbox.approvals.remove({
  "id": "a1b2c3d4"
});
GET/approvals/hooksHooks waiting for your yes

Hook sets a turn found in Claude Code's settings files, in a skill's or subagent's definition, or in a plugin the turn loads that the sandbox does not ship (its hooks and its hooks module, code that runs inside Claude Code), that nobody has approved in that exact form. Until one is approved, turns in this workspace run with every hook switched off; the sandbox's own safeguards are not hooks of this kind and keep working.

What you send

Nothing. Call it as it is.

What comes back

FieldType
requestsHook sets waiting for a yes,…object[]
digestThe set's fingerprint: every hook as…string
seenAtWhen a turn first found this…number
conversationIdThe conversation whose turn found it,…string
hooksEvery hook in the setobject[]
sourceWhose configuration declares it: the sandbox's…"user" | "project" | "plugin"
pluginThe plugin that declares it, by…string
declaredInThe skill, subagent or command whose…string
eventWhen it runs, in Claude Code's…string
matcherWhich tools it is limited to,…string
typeWhat kind of hook it is:…string
runExactly what it runs: the command…string
scriptsThe files those hooks run by…object[]
pathA file one of the hooks…string
sha256Its contents when the hooks were…string
pluginsThe plugins whose hooks or modules…object[]
nameThe plugin, as the sandbox lists…string
fromWhat brought it into the turn:…"plugin" | "extension" | "persona" | "skills" … (5)
sourceWhich settings enable it or hold…"user" | "project"
dirWhere its files were readstring
moduleIts hooks module, code that runs…object
pathThe plugin's hooks module, as its…string
hooksThe moments it acts on, in…string[]
callsWhat it reaches for while it…string[]
unreadableWhy the sandbox could not tell…string
marketplacesPlugin marketplaces Claude Code's settings add,…object[]
sourceWhose settings add it: the sandbox's…"user" | "project"
nameThe marketplace's name in those settingsstring
locationWhere Claude Code fetches it from,…string
dismissedKept off on purpose: no longer…boolean
ledgerUnreadableThe record of what was approved…boolean
Try itanswered in this tab
curl
curl "$SANDBOX/approvals/hooks" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.approvals.hookRequests();
POST/approvals/hooks/{digest}/approveLet a hook set run

Approves exactly this set, commands and the bytes of the files they run, plugin modules included, from the next turn on. Any later change to either is a new set and asks again. Owner and maintainers only, and never through a token a program holds.

What you send

FieldTypeWhere
digestrequiredWhich hook set, by its fingerprintstringaddress

What comes back

FieldType
okAlways truetrue
Try itanswered in this tab
curl
curl -X POST "$SANDBOX/approvals/hooks/%E2%80%A6/approve" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.approvals.approveHooks({
  "digest": "…"
});
POST/approvals/hooks/{digest}/dismissKeep a hook set off without being asked again

Takes the set off the list. Its hooks stay switched off; a change to them is a new set, which asks again.

What you send

FieldTypeWhere
digestrequiredWhich hook set, by its fingerprintstringaddress

What comes back

FieldType
okAlways truetrue
Try itanswered in this tab
curl
curl -X POST "$SANDBOX/approvals/hooks/%E2%80%A6/dismiss" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.approvals.dismissHooks({
  "digest": "…"
});
More in Ship and share

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