intentic
Create your workspace
Agent setup

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

FieldType
personasThe characters an agent can wearobject[]
idThe persona's idstring
labelWhat to call it on screenstring
capabilitiesWhich connected accounts are its handsstring[]
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
browserboolean
delegateboolean
sandboxboolean
connectorsstring[]
computersstring[]
mcpstring[]
workspaceWhere it worksobject
startInWhich folder a conversation opens instring
foldersWhich folders it may touch at…string[]
systemPromptMode"intentic" | "claude" | "custom"
connectedWhich accounts are actually connected right…string[]
Try itanswered in this tab
curl
curl "$SANDBOX/personas" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
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

FieldTypeWhere
idrequiredThe persona's idstringbody
labelWhat to call it on screenstringbody
capabilitiesrequiredWhich connected accounts are its handsstring[]body
reposWhich repositories prefer this persona, so…string[]body
powersWhat a conversation wearing it may…objectbody
filesWhat it may do with files:…"none" | "read" | "write"body
shellWhether it may run commands, and…booleanbody
codeWhether it may write and run…booleanbody
webWhether it may fetch a page…booleanbody
browserbooleanbody
delegatebooleanbody
sandboxbooleanbody
connectorsstring[]body
computersstring[]body
mcpstring[]body
workspaceWhere it worksobjectbody
startInWhich folder a conversation opens instringbody
foldersWhich folders it may touch at…string[]body
systemPromptMode"intentic" | "claude" | "custom"body

What comes back

FieldType
okAlways truetrue
Try itanswered in this tab
curl
curl -X POST "$SANDBOX/personas" \
  -H "x-intentic-control: $INTENTIC_TOKEN" \
  -H "content-type: application/json" \
  -d '{"id":"a1b2c3d4","label":"Nightly changelog","capabilities":["…","…"],"repos":["root","site"],"powers":{"files":"none","shell":true,"code":true,"web":true,"browser":true,"delegate":true,"sandbox":true,"connectors":["…","…"],"computers":["…","…"],"mcp":["…","…"]},"workspace":{"startIn":"…","folders":["…","…"]},"systemPromptMode":"intentic"}'
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.personas.save({
  "id": "a1b2c3d4",
  "label": "Nightly changelog",
  "capabilities": [
    "",
    ""
  ],
  "repos": [
    "root",
    "site"
  ],
  "powers": {
    "files": "none",
    "shell": true,
    "code": true,
    "web": true,
    "browser": true,
    "delegate": true,
    "sandbox": true,
    "connectors": [
      "",
      ""
    ],
    "computers": [
      "",
      ""
    ],
    "mcp": [
      "",
      ""
    ]
  },
  "workspace": {
    "startIn": "",
    "folders": [
      "",
      ""
    ]
  },
  "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

FieldTypeWhere
idrequiredWhich personastringaddress

What comes back

FieldType
okAlways truetrue
Try itanswered in this tab
curl
curl -X DELETE "$SANDBOX/personas/a1b2c3d4" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
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

FieldTypeWhere
idrequiredWhich personastringaddress

What comes back

FieldType
promptWhat this persona is told, on…string
skillsSkills only this persona's conversations can…object[]
nameThe skill's namestring
descriptionWhat it is forstring
Try itanswered in this tab
curl
curl "$SANDBOX/personas/a1b2c3d4/kit" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
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

FieldTypeWhere
idrequiredWhich personastringaddress
promptrequiredWhat to tell this personastringbody

What comes back

FieldType
okAlways truetrue
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.

What you send

FieldTypeWhere
idrequiredWhich personastringaddress
namerequiredWhich skillstringquery

What comes back

FieldType
nameThe skill's namestring
descriptionWhat it is forstring
bodyThe skill itself, in fullstring
Try itanswered in this tab
curl
curl "$SANDBOX/personas/a1b2c3d4/skills/read?name=nightly%20changelog" \
  -H "x-intentic-control: $INTENTIC_TOKEN"
TypeScript
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

FieldTypeWhere
idrequiredWhich personastringaddress
namerequiredWhat to call itstringbody
descriptionrequiredWhat it is for, which is…stringbody
bodyrequiredThe skill itselfstringbody

What comes back

FieldType
okAlways truetrue
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.

What you send

FieldTypeWhere
idrequiredWhich personastringaddress
namerequiredWhich skillstringbody

What comes back

FieldType
okAlways truetrue
Try itanswered in this tab
curl
curl -X POST "$SANDBOX/personas/a1b2c3d4/skills/remove" \
  -H "x-intentic-control: $INTENTIC_TOKEN" \
  -H "content-type: application/json" \
  -d '{"name":"nightly changelog"}'
TypeScript
import { sandbox } from "@intentic/sandbox-client";

const result = await sandbox.personas.removeSkill({
  "id": "a1b2c3d4",
  "name": "nightly changelog"
});
More in Agent setup

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