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
| Field | Type |
|---|---|
approvalsThe queue | object[] |
when kind is "post" | shape |
platformWhere it should go | string |
contentThe post itself | string |
titleA title, where the site wants… | string |
targetWhere on the site: a community,… | string |
mediaAnything to attach, as workspace paths | string[] |
actsAsWhose name it acts under | string |
scheduledAtWhen it should happen, in milliseconds | number |
statusWhere it is: proposed by the… | "proposed" | "approved" | "running" | "done" … (5) |
createdAtWhen it was written, in milliseconds | number |
startedAtWhen it started being carried out,… | number |
finishedAtWhen it was done, in milliseconds | number |
resultWhat came back, when something did:… | string |
errorWhy it failed, written as a… | string |
idThe approval's id | string |
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 under | string |
scheduledAtWhen it should happen, in milliseconds | number |
statusWhere it is: proposed by the… | "proposed" | "approved" | "running" | "done" … (5) |
createdAtWhen it was written, in milliseconds | number |
startedAtWhen it started being carried out,… | number |
finishedAtWhen it was done, in milliseconds | number |
resultWhat came back, when something did:… | string |
errorWhy it failed, written as a… | string |
idThe approval's id | string |
invalidFiles that could not be read… | string[] |
curl "$SANDBOX/approvals" \
-H "x-intentic-control: $INTENTIC_TOKEN"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
| Field | Type | Where |
|---|---|---|
when kind is "post" | shape | body |
platformrequiredWhere it should go | string | body |
contentrequiredThe post itself | string | body |
titleA title, where the site wants… | string | body |
targetWhere on the site: a community,… | string | body |
mediaAnything to attach, as workspace paths | string[] | body |
actsAsWhose name it acts under | string | body |
scheduledAtWhen it should happen, in milliseconds | number | body |
statusWhere it is: proposed by the… | "proposed" | "approved" | "running" | "done" … (5) | body |
createdAtWhen it was written, in milliseconds | number | body |
startedAtWhen it started being carried out,… | number | body |
finishedAtWhen it was done, in milliseconds | number | body |
resultWhat came back, when something did:… | string | body |
errorWhy it failed, written as a… | string | body |
idrequiredThe approval's id | string | body |
when kind is "action" | shape | body |
summaryrequiredWhat will happen, in one line:… | string | body |
detailsThe specifics, as Markdown: everything you… | string | body |
instructionsrequiredWhat to do once approved, written… | string | body |
actsAsWhose name it acts under | string | body |
scheduledAtWhen it should happen, in milliseconds | number | body |
statusWhere it is: proposed by the… | "proposed" | "approved" | "running" | "done" … (5) | body |
createdAtWhen it was written, in milliseconds | number | body |
startedAtWhen it started being carried out,… | number | body |
finishedAtWhen it was done, in milliseconds | number | body |
resultWhat came back, when something did:… | string | body |
errorWhy it failed, written as a… | string | body |
idrequiredThe approval's id | string | body |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
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"}'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
| Field | Type | Where |
|---|---|---|
idrequiredWhich approval | string | address |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X DELETE "$SANDBOX/approvals/a1b2c3d4" \
-H "x-intentic-control: $INTENTIC_TOKEN"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
| Field | Type |
|---|---|
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 set | object[] |
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 read | string |
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 settings | string |
locationWhere Claude Code fetches it from,… | string |
dismissedKept off on purpose: no longer… | boolean |
ledgerUnreadableThe record of what was approved… | boolean |
curl "$SANDBOX/approvals/hooks" \
-H "x-intentic-control: $INTENTIC_TOKEN"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
| Field | Type | Where |
|---|---|---|
digestrequiredWhich hook set, by its fingerprint | string | address |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/approvals/hooks/%E2%80%A6/approve" \
-H "x-intentic-control: $INTENTIC_TOKEN"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
| Field | Type | Where |
|---|---|---|
digestrequiredWhich hook set, by its fingerprint | string | address |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/approvals/hooks/%E2%80%A6/dismiss" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.approvals.dismissHooks({
"digest": "…"
});