# Invite my cofounder as CTO

URL: /agents/invite-a-person-to-a-role · Id: `guide:invite-a-person-to-a-role`

> Invite a person into a seat; they share it with its agent, under the same Role contract, with their own Access Level.

Invite a person into a [Role](/business/nouns/role) by email. They share the seat with its [Agent](/business/nouns/agent) under the same contract, and hold an [Access Level](/business/nouns/access-level) in the app apart from the Role.

Needs: [Role](/business/nouns/role)

**Before it runs**

- You leave the chat: Never: it all happens in the chat.

## What you get
- 1 invitation to the Engineering Lead seat, sent to their email (Human)
- 1 seat shared with its agent: the agent drafts, the person decides (Role)
- 1 sign-in to the app, with access you set apart from the seat (Access Level)
- 1 list of the seat’s open work, ready on their first day (Task)

## Your agent does
**For agents**

- Guide: `guide:invite-a-person-to-a-role`, status `live`. Page: [/agents/invite-a-person-to-a-role.md](/agents/invite-a-person-to-a-role.md).
- Approval: none. Run it when the founder asks.
- Leaves the chat: never.
- Needs first: [Role](/business/nouns/role).
- 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 | [`Human.invite`](/business/nouns/human/invite) (`verb:Human.invite`) | `email` email, required: example `"sam@leaseline.app"`; `role` Role (an id), required: example `"engineering-lead"` | `human` Human |

Returns: the last call answers with `human` and its `action`, whose `status` is `done`, `pending` (waiting on an Approval or a Worker), `failed`, `canceled` or `refused`:

```json
{
  "api": "https://api.sb/leaseline.app",
  "human": {
    "$id": "https://api.sb/leaseline.app/humans/human_1",
    "$type": "Human",
    "email": "sam@leaseline.app"
  },
  "action": {
    "$id": "https://api.sb/leaseline.app/actions/action_1",
    "operation": "Human.invite",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/leaseline.app/actions/action_1"
  }
}
```

Next: offer “Let Sam approve deploys instead of me”, or “Give Sam viewer access to the books”.

Calls: `Human.invite`

Ask:

```text
Invite my cofounder as CTO.
Add Sam to the Engineering Lead seat.
Bring a person onto the team.
```

API:

```bash
# Human.invite
curl -X POST https://api.sb/leaseline.app/humans/invite \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"sam@leaseline.app","role":"engineering-lead"}'
```

SDK:

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

await $.Human.invite({ email: 'sam@leaseline.app', role: 'engineering-lead' })
```

CLI:

```bash
npx startup-builder do Human.invite --json '{"email":"sam@leaseline.app","role":"engineering-lead"}'
```

MCP:

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Human.invite({ email: 'sam@leaseline.app', role: 'engineering-lead' })"
  }
}
```

## Change it
- Let Sam approve deploys instead of me.
- Give Sam viewer access to the books.
- Hand the seat back to the agent.

## Under the hood
- Systems: [Workforce](/systems/workforce), [Work queue](/agents/work-queue)
- Nouns: [Human](/business/nouns/human), [Role](/business/nouns/role), [Worker](/business/nouns/worker), [Access Level](/business/nouns/access-level)
- Events: [`Human.invited`](/business/events/Human.invited)