Mandate
A Mandate is a standing authorization for an Agent to act for a Party, within Permissions and Limits, until it expires.
Properties
| Property | Type | Required | Description |
|---|---|---|---|
expiresAt | datetime | required | When it lapses. |
limit | Limit | The Limit that bounds it. | |
verb | string | The Verb it covers, as Noun.verb. | |
topics | string[] | What it may act on; an Action outside them becomes an Approval. | |
channels | list of Channel | The Channels it may send through. | |
status | string | required | One of active, paused, revoked or expired. |
Object
{
"$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 Mandate authorizes one Agent: a Mandate lets an Agent act without asking each time, within its Permissions and Limits, until it expires or is revoked.
authorizes, inversemandates. - A Mandate funds many Cards: a Mandate funds the Cards that spend under it; pausing it freezes them and revoking it closes them.
funds, inversefundedBy. - A Mandate is issued by one Party: the Party who grants a Mandate is its principal: the Agent acts for them, and each Action records them as
for.issuedBy, inverseissues.
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; revoked by Mandate.revoke; expired on Mandate.expired 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; revoked by Mandate.revoke; expired on Mandate.expired 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
createCreates a Mandate.POST /{namespace}/mandatesgetReturns one Mandate by id.GET /{namespace}/mandates/{id}listReturns Mandates, newest first, one page at a time.GET /{namespace}/mandatesupdateChanges the given properties of a Mandate.PATCH /{namespace}/mandates/{id}deleteDeletes a Mandate; its history is kept.DELETE /{namespace}/mandates/{id}authorizeAuthorize grants an Agent a standing Mandate to perform a Verb within a Limit, without asking each time.POST /{namespace}/mandates/authorizepausePause stops every new Action under a Mandate at once and keeps its scope, so it can resume unchanged.POST /{namespace}/mandates/{mandate}/pauseresumeResume restarts a paused Mandate with its scope, Limits and approval rule unchanged.POST /{namespace}/mandates/{mandate}/resumerevokeRevoke ends a Mandate at once, so new Actions under it are refused and running ones finish.POST /{namespace}/mandates/{mandate}/revokespendSpend pays an outside party for a Startup with a single-use card, within a Mandate and its Limit.POST /{namespace}/mandates/{mandate}/spend
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 | required | Mandate.expired. |
at | datetime | required | When it happened. |
seq | integer | Its position in the namespace, one more than the Event before; any seq is a cursor into the history. | |
data | json | required | The Thing as the Action left it. |
data.mandate | Mandate | required | The Mandate as the change left it. |
data.mandate.expiresAt | datetime | required | When it lapses. |
data.mandate.limit | Limit | The Limit that bounds it. | |
data.mandate.verb | string | The Verb it covers, as Noun.verb. | |
data.mandate.topics | string[] | What it may act on; an Action outside them becomes an Approval. | |
data.mandate.channels | list of Channel | The Channels it may send through. | |
data.mandate.status | string | required | One of active, paused, revoked or expired. |
data.previous.status | string | required | The status before this Event: active. |
{
"$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
Authorize the latest mandate with an agent and a limit.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.