A persona records a decision about accounts that already exist: which of them this character speaks for, what a conversation wearing it may do, and what it is told. The kit routes edit the files behind one — its own instructions, and the skills only its conversations reach.
8 calls. Pick one to open it, or use the list on the right.
GET/personasThe characters an agent can wear
Each persona with the connected accounts it speaks for, what a conversation wearing it is allowed to do, and where it works.
What you send
Nothing. Call it as it is.
What comes back
Field
Type
personasThe characters an agent can wear
object[]
idThe persona's id
string
labelWhat to call it on screen
string
capabilitiesWhich connected accounts are its hands
string[]
reposWhich repositories prefer this persona, so…
string[]
powersWhat a conversation wearing it may…
object
filesWhat it may do with files:…
"none" | "read" | "write"
shellWhether it may run commands, and…
boolean
codeWhether it may write and run…
boolean
webWhether it may fetch a page…
boolean
browser
boolean
delegate
boolean
sandbox
boolean
connectors
string[]
computers
string[]
mcp
string[]
workspaceWhere it works
object
startInWhich folder a conversation opens in
string
foldersWhich folders it may touch at…
string[]
systemPromptMode
"intentic" | "claude" | "custom"
connectedWhich accounts are actually connected right…
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.personas.list();
POST/personasCreate or edit a persona
Writes the whole card; sending an id that exists edits it. Nothing is connected, installed or spent by saving one, because a persona only records a decision about accounts that already exist. It is stored as a file you can equally well edit by hand, which is why this writes the card whole rather than patching a field: a round trip through a screen should leave a change a reviewer recognises.
What you send
Field
Type
Where
idrequiredThe persona's id
string
body
labelWhat to call it on screen
string
body
capabilitiesrequiredWhich connected accounts are its hands
Takes away the character, never the accounts: every login it named stays connected. Its own prompt and skills go with it, since a folder nothing can reach is worse than deleting what somebody just asked to delete. Anything still pointed at it goes quiet rather than falling back to speaking as everyone.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.personas.remove({ "id": "a1b2c3d4"});
GET/personas/{id}/kitWhat one persona carries
The instructions this persona is given and the skills only its conversations can reach. A different question from what the agent knows generally, with a different answer.
What you send
Field
Type
Where
idrequiredWhich persona
string
address
What comes back
Field
Type
promptWhat this persona is told, on…
string
skillsSkills only this persona's conversations can…
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.personas.kit({ "id": "a1b2c3d4"});
POST/personas/{id}/promptWrite a persona's instructions
Sets what this persona is told. Saving an empty one removes it entirely rather than storing a blank, so the persona simply falls back to the sandbox's own instructions.
What you send
Field
Type
Where
idrequiredWhich persona
string
address
promptrequiredWhat to tell this persona
string
body
What comes back
Field
Type
okAlways true
true
Try itanswered in this tab
curl
curl -X POST "$SANDBOX/personas/a1b2c3d4/prompt" \ -H "x-intentic-control: $INTENTIC_TOKEN" \ -H "content-type: application/json" \ -d '{"prompt":"Update the changelog for the last five commits."}'
TypeScript
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.personas.savePrompt({ "id": "a1b2c3d4", "prompt": "Update the changelog for the last five commits."});
GET/personas/{id}/skills/readRead one of a persona's skills
The full text of a single skill belonging to this persona.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.personas.readSkill({ "id": "a1b2c3d4", "name": "nightly changelog"});
POST/personas/{id}/skillsWrite one of a persona's skills
Creates or replaces a skill by name. There is nothing to switch on: a persona's skill is available exactly when that persona is worn, which is what belonging to it has to mean.
What you send
Field
Type
Where
idrequiredWhich persona
string
address
namerequiredWhat to call it
string
body
descriptionrequiredWhat it is for, which is…
string
body
bodyrequiredThe skill itself
string
body
What comes back
Field
Type
okAlways true
true
Try itanswered in this tab
curl
curl -X POST "$SANDBOX/personas/a1b2c3d4/skills" \ -H "x-intentic-control: $INTENTIC_TOKEN" \ -H "content-type: application/json" \ -d '{"name":"nightly changelog","description":"Runs every night and opens a pull request when anything changed.","body":"…"}'
TypeScript
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.personas.saveSkill({ "id": "a1b2c3d4", "name": "nightly changelog", "description": "Runs every night and opens a pull request when anything changed.", "body": "…"});
POST/personas/{id}/skills/removeDelete one of a persona's skills
Removes a single skill from this persona and leaves the rest of its kit alone.