Skip to main content
POST
Create an agent

Authorizations

Authorization
string
header
required

Personal Access Token. Send as Authorization: Bearer hq_pat_....

Body

application/json
display_name
string
required
slug
string
required
aliases
string[]
avatar_url
string | null

Optional avatar URL - absolute https URL only. Use the /v1/agents/{id}/avatar upload endpoint to host a file in Trove and get back a URL to put here.

cautions
string[]
description
string | null
enabled_mcp_slugs
string[] | null
enabled_skill_slugs
string[] | null

Initial enabled subsets. Pass None (default) for "all installed" - the empty-row convention in agent_skills_enabled / agent_mcp_enabled means "all the tenant has installed".

instructions
string | null

Per-agent system-prompt instructions - what the agent does, scope, tone. NULL/empty = platform-baseline behavior only.

languages
string[]
model
string | null

Optional model slug for this agent (must belong to runtime_profile). Omitted/empty = the runtime's platform default. Billing C.

runtime_profile
string
tone
string | null

Personality knobs - structured-rendering into the system prompt. See agents_api::validate_tone / validate_verbosity / normalise_cautions / normalise_languages for the rules.

verbosity
string | null

Response

The created agent

aliases
string[]
required
cautions
string[]
required

Free-form short phrases the agent should avoid talking about. Composed as "Be careful around: X, Y, Z" in the system prompt. Empty = no caution block.

created_at
string<date-time>
required
delivery_mode
string
required
display_name
string
required
id
string<uuid>
required
instructions_is_default
boolean
required

True iff instructions is still the platform-seeded value (admin hasn't customised or tailored yet). The admin UI uses this to surface a "your agent is still on the default - click Tailor" banner. Any PATCH that writes instructions flips this false; the seed migrations set it true on creation.

is_default
boolean
required
languages
string[]
required

BCP-47 language codes. The first is the default; subsequent entries are explicit fallbacks. Empty = no language pin (LLM follows the user's language).

runtime_profile
string
required
slug
string
required
status
string
required
avatar_url
string | null

Absolute URL of the avatar shown next to this agent's messages. NULL = use the Slack app's default icon for now (fine for legacy single-agent tenants).

description
string | null
instructions
string | null

Admin-editable system-prompt for this agent. NULL = use the platform baseline only (the legacy generalist behaviour). Plumbed through to router_client::compose_system_prompt which sandwiches it between the Slack-formatting baseline and the identity-pin footer.

model
string | null

Selected model slug (e.g. claude-opus-4-8). NULL = the runtime's platform default. Must belong to runtime_profile (billing C).

tone
string | null

One of formal | friendly | direct | casual (or NULL = unset → no tone pin in the system prompt). Orthogonal to role; admin choice, not inferrable from "you're a CFO".

verbosity
string | null

One of concise | balanced | detailed (or NULL = unset). Drives a canonical "Default to brief / balanced / detailed responses" sentence in the system prompt.