# Mandate

URL: /business/nouns/mandate · Id: `noun:mandate`

> A Mandate is a standing authorization for an Agent to act for a Party, within Permissions and Limits, until it expires.

A Mandate is a standing authorization for an [Agent](/business/nouns/agent) to act for a [Party](/business/nouns/party), within [Permissions](/business/nouns/permission) and [Limits](/business/nouns/limit), until it expires.

## Properties
| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `expiresAt` | `datetime` | Yes | When it lapses. |
| `limit` | [Limit](/business/nouns/limit) | No | The Limit that bounds it. |
| `verb` | `string` | No | The Verb it covers, as `Noun.verb`. |
| `topics` | `string[]` | No | What it may act on; an Action outside them becomes an Approval. |
| `channels` | list of [Channel](/business/nouns/channel) | No | The Channels it may send through. |
| `status` | `string` | Yes | One of `active`, `paused`, `revoked` or `expired`. |

## Object
```json
{
  "$id": "https://api.sb/tutorloop.com/mandates/mandate_1",
  "$type": "Mandate",
  "expiresAt": "2026-10-22T12:00:00Z",
  "limit": "limit_1",
  "verb": "Example verb",
  "topics": [
    "Example topics"
  ],
  "channels": [
    "channel_1"
  ],
  "status": "active"
}
```

## Relationships
- <a id="rel-authorizes"></a>A Mandate **authorizes** one [Agent](/business/nouns/agent): a Mandate lets an [Agent](/business/nouns/agent) act without asking each time, within its [Permissions](/business/nouns/permission) and [Limits](/business/nouns/limit), until it expires or is revoked. `authorizes`, inverse [`mandates`](/business/nouns/agent#rel-mandates).
- <a id="rel-funds"></a>A Mandate **funds** many [Cards](/business/nouns/card): a Mandate funds the [Cards](/business/nouns/card) that spend under it; pausing it freezes them and revoking it closes them. `funds`, inverse [`fundedBy`](/business/nouns/card#rel-funded-by).
- <a id="rel-issued-by"></a>A Mandate **is issued by** one [Party](/business/nouns/party): the [Party](/business/nouns/party) who grants a Mandate is its principal: the [Agent](/business/nouns/agent) acts for them, and each [Action](/business/nouns/action) records them as `for`. `issuedBy`, inverse [`issues`](/business/nouns/party#rel-issues).

## Lifecycle

| State | Meaning | Moves to |
| --- | --- | --- |
| `active` (first) | The Agent calls the Mandate’s Verb without asking each time, within its Limit. | `paused` by [Mandate.pause](/business/nouns/mandate/pause); `revoked` by [Mandate.revoke](/business/nouns/mandate/revoke); `expired` on [`Mandate.expired`](/business/nouns/mandate#mandateexpired) when the Mandate reaches its `expiresAt` |
| `paused` | New Actions under it are refused, and its scope and Limit wait unchanged for the resume. | `active` by [Mandate.resume](/business/nouns/mandate/resume); `revoked` by [Mandate.revoke](/business/nouns/mandate/revoke); `expired` on [`Mandate.expired`](/business/nouns/mandate#mandateexpired) when the Mandate reaches its `expiresAt` |
| `revoked` | Ended early: new Actions under it are refused, running ones finish, and its record stays. | None: it ends here. |
| `expired` | It reached its `expiresAt`, so new Actions under it are refused; its record stays. | None: it ends here. |

## Verbs
| Verb | Description | Subject | Event | Class |
| --- | --- | --- | --- | --- |
| [Mandate.authorize](/business/nouns/mandate/authorize) | Authorize grants an Agent a standing Mandate to perform a Verb within a Limit, without asking each time. | [Treasurer](/agents/finance/treasurer) | [`Mandate.authorized`](/business/events/Mandate.authorized) | One-way (money): `send`, `do` |
| [Mandate.pause](/business/nouns/mandate/pause) | Pause stops every new Action under a Mandate at once and keeps its scope, so it can resume unchanged. | [Treasurer](/agents/finance/treasurer) | [`Mandate.paused`](/business/events/Mandate.paused) | None. |
| [Mandate.resume](/business/nouns/mandate/resume) | Resume restarts a paused Mandate with its scope, Limits and approval rule unchanged. | [Party](/business/nouns/party) | [`Mandate.resumed`](/business/events/Mandate.resumed) | None. |
| [Mandate.revoke](/business/nouns/mandate/revoke) | Revoke ends a Mandate at once, so new Actions under it are refused and running ones finish. | [Security Engineer](/agents/engineering/security-engineer) | [`Mandate.revoked`](/business/events/Mandate.revoked) | None. |
| [Mandate.spend](/business/nouns/mandate/spend) | Spend pays an outside party for a Startup with a single-use card, within a Mandate and its Limit. | [Treasurer](/agents/finance/treasurer) | [`Mandate.spent`](/business/events/Mandate.spent) | One-way (money): `send`, `do` |
| <a id="create"></a>[Mandate.create](/business/nouns/mandate/create) | Creates a Mandate. Inherited from [Noun](/business/nouns/noun). | None. | `Mandate.created` | Two-way: `try`, `send`, `do` |
| <a id="get"></a>[Mandate.get](/business/nouns/mandate/get) | Returns one Mandate by id. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="list"></a>[Mandate.list](/business/nouns/mandate/list) | Returns Mandates, newest first, one page at a time. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="update"></a>[Mandate.update](/business/nouns/mandate/update) | Changes the given properties of a Mandate. Inherited from [Noun](/business/nouns/noun). | None. | `Mandate.updated` | Two-way: `try`, `send`, `do` |
| <a id="delete"></a>[Mandate.delete](/business/nouns/mandate/delete) | Deletes a Mandate; its history is kept. Inherited from [Noun](/business/nouns/noun). | None. | `Mandate.deleted` | One-way: `send`, `do` |

## Events
Events no Verb emits. Each Verb’s Event is in the Verbs table above; every Event is delivered in the same shape.

### Mandate.expired
A Mandate reached its `expiresAt`, so the Agent asks again before each Action it covered. Raised by a clock.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | `string` | Yes | `Mandate.expired`. |
| `at` | `datetime` | Yes | When it happened. |
| `seq` | `integer` | No | Its position in the namespace, one more than the Event before; any seq is a cursor into the history. |
| `data` | `json` | Yes | The Thing as the Action left it. |
| `data.mandate` | [Mandate](/business/nouns/mandate) | Yes | The Mandate as the change left it. |
| `data.mandate.expiresAt` | `datetime` | Yes | When it lapses. |
| `data.mandate.limit` | [Limit](/business/nouns/limit) | No | The Limit that bounds it. |
| `data.mandate.verb` | `string` | No | The Verb it covers, as `Noun.verb`. |
| `data.mandate.topics` | `string[]` | No | What it may act on; an Action outside them becomes an Approval. |
| `data.mandate.channels` | list of [Channel](/business/nouns/channel) | No | The Channels it may send through. |
| `data.mandate.status` | `string` | Yes | One of `active`, `paused`, `revoked` or `expired`. |
| `data.previous.status` | `string` | Yes | The `status` before this Event: `active`. |

```json
{
  "$id": "https://api.sb/tutorloop.com/events/event_1",
  "$type": "Event",
  "name": "Mandate.expired",
  "at": "2026-10-22T12:00:00Z",
  "data": {
    "mandate": {
      "$id": "https://api.sb/tutorloop.com/mandates/mandate_1",
      "$type": "Mandate",
      "expiresAt": "2026-10-22T12:00:00Z",
      "limit": "limit_1",
      "verb": "Example verb",
      "topics": [
        "Example topics"
      ],
      "channels": [
        "channel_1"
      ],
      "status": "expired"
    },
    "previous": {
      "status": "active"
    }
  },
  "seq": 1
}
```

## Permissions
Which Access level may call each Verb. One-way Verbs wait their delay window.

| Operation | `owner` | `admin` | `member` | `viewer` |
| --- | --- | --- | --- | --- |
| `Mandate.create` | Yes | Yes | No | No |
| `Mandate.get` | Yes | Yes | Yes | Yes |
| `Mandate.list` | Yes | Yes | Yes | Yes |
| `Mandate.update` | Yes | Yes | No | No |
| `Mandate.delete` | Yes | Yes | No | No |
| `Mandate.authorize` | Yes | No | No | No |
| `Mandate.pause` | Yes | Yes | No | No |
| `Mandate.resume` | Yes | Yes | No | No |
| `Mandate.revoke` | Yes | Yes | No | No |
| `Mandate.spend` | Yes | No | No | No |

## Call it

**Ask**

```text
Authorize the latest mandate with an agent and a limit.
```

**API**

```bash
curl -X POST https://api.sb/ledgerlark.com/mandates/authorize \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"agent":"agent_1","verb":"Example verb","limit":"limit_1"}'
```

```json
{
  "api": "https://api.sb/ledgerlark.com",
  "mandate": {
    "$id": "https://api.sb/ledgerlark.com/mandates/mandate_1",
    "$type": "Mandate",
    "expiresAt": "2026-10-22T12:00:00Z",
    "status": "active"
  },
  "action": {
    "$id": "https://api.sb/ledgerlark.com/actions/action_1",
    "operation": "Mandate.authorize",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/ledgerlark.com/actions/action_1"
  }
}
```

**SDK**

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

const mandate = await $.Mandate.authorize({ agent: 'agent_1', verb: 'Example verb', limit: 'limit_1' })
```

**CLI**

```bash
npx startup-builder do Mandate.authorize --json '{"agent":"agent_1","verb":"Example verb","limit":"limit_1"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Mandate.authorize({ agent: 'agent_1', verb: 'Example verb', limit: 'limit_1' })"
  }
}
```

## Example
A dental group gives its purchasing Agent a Mandate to buy reminder bundles up to $300 a month for 12 months. A $500 bundle exceeds its `limit`, so the Agent asks the group first.