# Hire an agent for a role

URL: /agents/hire-an-agent-for-a-role · Id: `guide:hire-an-agent-for-a-role`

> Every seat already has an agent: set how much it does without asking, see what it did, or change who fills the seat.

Every [Role](/business/nouns/role) starts with an [Agent](/business/nouns/agent) in it, so your support seat already answers customers. Decide what it does alone and what it brings to you first, then check its work.

**Before it runs**

- You leave the chat: Never: it all happens in the chat.
- First question at Idea: “Should it draft and wait for you, or answer on its own and ask before refunds?”
- First question at Live: “Review last week before you change what it does alone?”

## What you get
- 1 support agent in the Customer Lead seat from day one, with its own name and email address at your domain (Agent)
- 1 setting for what it does alone: routine replies on its own, anything one-way drafted for you first (Role)
- 1 list of everything it did this week, newest first (Action)
- 5 tools: only what the support seat may use (Permission)
- 3 seats it hands work to: billing for refunds, privacy for data requests, the Product Lead for bugs (Role)
- 1 memory of every customer it has talked to, kept in your business (Memory)
- 1 request to you for anything over its limits (Approval)

## Your agent does
**For agents**

- Guide: `guide:hire-an-agent-for-a-role`, status `live`. Page: [/agents/hire-an-agent-for-a-role.md](/agents/hire-an-agent-for-a-role.md).
- Approval: none. Run it when the founder asks.
- Leaves the chat: never.
- Run: call the steps in order, each through the API, SDK, CLI or MCP tab below; a later step passes the `$id` an earlier one returns. Each value marked example is the sample business’s: pass the founder’s own.

| Step | Verb | Inputs (type, required, this guide’s value) | Returns |
| --- | --- | --- | --- |
| 1 | [`Role.update`](/business/nouns/role/update) (`verb:Role.update`) | `id` string, required: example `"customer-lead"`; `name` string: example `"Customer Lead"`; `autonomy` json: example `{"default":"supervised","byClass":{"high":"assist"}}` | `role` Role |
| 2 | [`Action.list`](/business/nouns/action/list) (`verb:Action.list`) | `limit` integer: example `50`; `where` string: example `"by = \"agent_customer_lead\" and createdAt >= \"2026-10-16\""`; `sort` string: example `"-createdAt"` | `actions` Action[] |

Returns: the last call answers with `actions`:

```json
{
  "api": "https://api.sb/leaseline.app",
  "$type": "Action",
  "actions": [
    {
      "$id": "https://api.sb/leaseline.app/actions/action_1",
      "$type": "Action",
      "by": "agent_customer_lead"
    }
  ],
  "meta": {
    "limit": 50,
    "after": "cursor_2"
  },
  "links": {
    "self": "https://api.sb/leaseline.app/actions?limit=50",
    "next": "https://api.sb/leaseline.app/actions?after=cursor_2"
  }
}
```

Next: offer “It drafts, I send, for the first two weeks”, or “Let it refund up to $50 without asking”.

Calls: `Role.update` → `Action.list`

Ask:

```text
Hire an agent to answer my customers.
Take support off my plate.
I am done doing support, hand it to an agent.
```

API:

```bash
# 1. Role.update
curl -X PATCH https://api.sb/leaseline.app/roles/customer-lead \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Customer Lead","autonomy":{"default":"supervised","byClass":{"high":"assist"}}}'

# 2. Action.list
curl "https://api.sb/leaseline.app/actions?limit=50&where=by%20%3D%20%22agent_customer_lead%22%20and%20createdAt%20%3E%3D%20%222026-10-16%22&sort=-createdAt" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
```

SDK:

```ts
import { $ } from 'startup-builder'

await $.Role.update({ id: 'customer-lead', name: 'Customer Lead', autonomy: { default: 'supervised', byClass: { high: 'assist' } } })
await $.Action.list({ limit: 50, where: 'by = "agent_customer_lead" and createdAt >= "2026-10-16"', sort: '-createdAt' })
```

CLI:

```bash
npx startup-builder do Role.update --json '{"id":"customer-lead","name":"Customer Lead","autonomy":{"default":"supervised","byClass":{"high":"assist"}}}'
npx startup-builder do Action.list --json '{"limit":50,"where":"by = \"agent_customer_lead\" and createdAt >= \"2026-10-16\"","sort":"-createdAt"}'
```

MCP:

```json
{
  "name": "do",
  "arguments": {
    "code": "await $.Role.update({ id: 'customer-lead', name: 'Customer Lead', autonomy: { default: 'supervised', byClass: { high: 'assist' } } })\nreturn await $.Action.list({ limit: 50, where: 'by = \"agent_customer_lead\" and createdAt >= \"2026-10-16\"', sort: '-createdAt' })"
  }
}
```

## Change it
- It drafts, I send, for the first two weeks.
- Let it refund up to $50 without asking.
- Show me what it did yesterday.
- I will run support myself for now.
- Swap in a support agent built for property managers.

## Under the hood
- Systems: [Workforce](/systems/workforce), [Mailboxes](/systems/mailboxes), [Work queue](/agents/work-queue)
- Nouns: [Role](/business/nouns/role), [Agent](/business/nouns/agent), [Worker](/business/nouns/worker), [Action](/business/nouns/action), [Permission](/business/nouns/permission), [Mailbox](/business/nouns/mailbox)
- Events: `Role.updated`