Personas
Named characters an agent can wear: the accounts it speaks for and what it is told
On this page(8 sections)
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[] |
briefWhat this persona is for, in… | 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[] |
devices | string[] |
mcp | string[] |
extensionsWhich extensions' own agent tools and… | string[] |
workspaceWhere it works | object |
startInWhich folder a conversation opens in | string |
foldersWhich folders it may touch at… | string[] |
contextWhich part of the workspace a… | object |
reposWhich nested repositories a conversation on… | string[] |
briefingWhich of the notes the sandbox… | object |
omitWhich of the notes the sandbox… | "map" | "context" | "skills" | "search" … (9)[] |
modelsWhich models a conversation wearing it… | object[] |
providerWhich provider serves this work | string |
modelWhich of its models | string |
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" |
systemPromptMode | "intentic" | "claude" | "custom" |
connectedWhich accounts are actually connected right… | string[] |
curl "$SANDBOX/personas" \
-H "x-intentic-control: $INTENTIC_TOKEN"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 | string[] | body |
briefWhat this persona is for, in… | string | body |
powersWhat a conversation wearing it may… | object | body |
filesWhat it may do with files:… | "none" | "read" | "write" | body |
shellWhether it may run commands, and… | boolean | body |
codeWhether it may write and run… | boolean | body |
webWhether it may fetch a page… | boolean | body |
browser | boolean | body |
delegate | boolean | body |
sandbox | boolean | body |
connectors | string[] | body |
devices | string[] | body |
mcp | string[] | body |
extensionsWhich extensions' own agent tools and… | string[] | body |
workspaceWhere it works | object | body |
startInWhich folder a conversation opens in | string | body |
foldersWhich folders it may touch at… | string[] | body |
contextWhich part of the workspace a… | object | body |
reposrequiredWhich nested repositories a conversation on… | string[] | body |
briefingWhich of the notes the sandbox… | object | body |
omitrequiredWhich of the notes the sandbox… | "map" | "context" | "skills" | "search" … (9)[] | body |
modelsWhich models a conversation wearing it… | object[] | body |
providerrequiredWhich provider serves this work | string | body |
modelrequiredWhich of its models | string | body |
effortHow hard this model should think,… | string | body |
thinkingWhether this model reasons before it… | boolean | body |
fastAsk for this model's work at… | boolean | body |
harnessWhich agentic loop runs it | "native" | "claude-code" | body |
systemPromptMode | "intentic" | "claude" | "custom" | body |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/personas" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"id":"a1b2c3d4","label":"Nightly changelog","capabilities":["…","…"],"brief":"…","powers":{"files":"none","shell":true,"code":true,"web":true,"browser":true,"delegate":true,"sandbox":true,"connectors":["…","…"],"devices":["…","…"],"mcp":["…","…"],"extensions":["ts","md"]},"workspace":{"startIn":"…","folders":["…","…"]},"context":{"repos":["root","site"]},"briefing":{"omit":["map","context"]},"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"}],"systemPromptMode":"intentic"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.personas.save({
"id": "a1b2c3d4",
"label": "Nightly changelog",
"capabilities": [
"…",
"…"
],
"brief": "…",
"powers": {
"files": "none",
"shell": true,
"code": true,
"web": true,
"browser": true,
"delegate": true,
"sandbox": true,
"connectors": [
"…",
"…"
],
"devices": [
"…",
"…"
],
"mcp": [
"…",
"…"
],
"extensions": [
"ts",
"md"
]
},
"workspace": {
"startIn": "…",
"folders": [
"…",
"…"
]
},
"context": {
"repos": [
"root",
"site"
]
},
"briefing": {
"omit": [
"map",
"context"
]
},
"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"
}
],
"systemPromptMode": "intentic"
});DELETE/personas/{id}Delete a persona
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.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich persona | string | address |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X DELETE "$SANDBOX/personas/a1b2c3d4" \
-H "x-intentic-control: $INTENTIC_TOKEN"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… | object[] |
nameThe skill's name | string |
descriptionWhat it is for | string |
curl "$SANDBOX/personas/a1b2c3d4/kit" \
-H "x-intentic-control: $INTENTIC_TOKEN"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 |
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."}'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.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich persona | string | address |
namerequiredWhich skill | string | query |
What comes back
| Field | Type |
|---|---|
nameThe skill's name | string |
descriptionWhat it is for | string |
bodyThe skill itself, in full | string |
curl "$SANDBOX/personas/a1b2c3d4/skills/read?name=nightly%20changelog" \
-H "x-intentic-control: $INTENTIC_TOKEN"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 |
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":"…"}'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.
What you send
| Field | Type | Where |
|---|---|---|
idrequiredWhich persona | string | address |
namerequiredWhich skill | string | body |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/personas/a1b2c3d4/skills/remove" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"nightly changelog"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.personas.removeSkill({
"id": "a1b2c3d4",
"name": "nightly changelog"
});