mandate
The mandate noun — identity, lifecycle, events, and every capability as an anchored section: 8 capabilities, 0 live, 8 sandbox, 0 declared.
mandate is one of the estate's 317 automotive nouns — a job a car needs done. It carries 8 capabilities: 0 live, 8 sandbox, 0 declared · doors mandate.vin · aggregator.vin.
Identity
| Noun | mandate |
| Pillar | Commerce (facets: 1 data · 7 commerce) |
| Capabilities | 8 — 0 live · 8 sandbox · 0 declared |
| Entities | Mandate |
| Doors | aggregator.vin · mandate.vin |
| SDK | Vin.mandate.* from apis.vin |
| Address | /catalog/mandate#{action} — the anchor IS the wire name minus mandate. |
Lifecycle
Mandate — MandateFSM: 7 states, 7 transitions — Minted · Granted · Presented · Active · Exhausted · Revoked · Expired. Each transition is a past-tense event on the record.
Events
The vocabulary this noun can append to the record — 8 past-tense, versioned event types, each linked to the capability that emits it:
Mandate.activated@1— emitted byactivateMandate.capped@1— emitted bycapMandate.granted@1— emitted bygrant·narrowMandate.narrowed@1— emitted bynarrowMandate.presented@1— emitted bypresentMandate.reauthorized@1— emitted byreauthorizeMandate.revoked@1— emitted byrevokeMandate.subDelegated@1— emitted bynarrow
Discover & read
verify
mandate.verify · GET /mandates/verify · gate key · sandbox · answers Mandate@1
No input — this capability takes no request body.
Door — mandate.vin serves this noun on its two routes: / (the landing) · /5XYP2DHC5MG106068 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
import { mandate } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await mandate.verify()curl 'https://apis.vin/mandates/verify'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "Mandate@1",
"value": {
"principalId": "PRINCIPAL-01",
"agentId": "AGENT-GRANTED-01",
"action": "sign",
"outcome": "granted",
"grantedScopes": [
"sign"
],
"capCents": null,
"remainingCents": null,
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "mandate-rail-sandbox"
}
},
"evidence": {
"principalId": "PRINCIPAL-01",
"agentId": "AGENT-GRANTED-01",
"action": "sign",
"outcome": "granted",
"grantedScopes": [
"sign"
],
"capCents": null,
"remainingCents": null,
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "mandate-rail-sandbox"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "mandate-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Authorize & resolve
revoke
mandate.revoke · POST /mandates/revoke · gate key · sandbox · answers MandateRevoke@1
No input — this capability takes no request body.
Door — mandate.vin serves this noun on its two routes: / (the landing) · /5XYP2DHC5MG106068 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Mandate.revoked@1.
import { mandate } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await mandate.revoke()curl -X POST https://apis.vin/mandates/revoke \
-H 'content-type: application/json' \
-d '{}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "MandateRevoke@1",
"value": {
"mandate": "mandate_da1fd924",
"status": "revoked",
"revokedAt": "2026-08-10T00:00:00.000Z"
},
"evidence": {
"mandate": "mandate_da1fd924",
"status": "revoked",
"revokedAt": "2026-08-10T00:00:00.000Z"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "governance-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}reauthorize
mandate.reauthorize · POST /mandates/reauthorize · gate human · sandbox · answers MandateReauthorize@1
No input — this capability takes no request body.
The gate is a 403 NEEDS_HUMAN — the human verb authorize (credential: principal) · demand side, routed to a named, staffed, priced terminus with a poll rail. Never a dead end. Price: not posted — see /pricing.
Door — mandate.vin serves this noun on its two routes: / (the landing) · /5XYP2DHC5MG106068 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Mandate.reauthorized@1.
import { mandate } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await mandate.reauthorize()curl -X POST https://apis.vin/mandates/reauthorize \
-H 'content-type: application/json' \
-d '{}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "MandateReauthorize@1",
"value": {
"mandate": "mnd_da1fd924",
"status": "active",
"ceiling": {
"amount": "500000",
"currency": "USD"
},
"perAction": {
"amount": "100000",
"currency": "USD"
},
"expiresAt": "2027-08-10T00:00:00Z",
"reauthorizedAt": "2026-08-10T00:00:00.000Z"
},
"evidence": {
"mandate": "mnd_da1fd924",
"status": "active",
"ceiling": {
"amount": "500000",
"currency": "USD"
},
"perAction": {
"amount": "100000",
"currency": "USD"
},
"expiresAt": "2027-08-10T00:00:00Z",
"reauthorizedAt": "2026-08-10T00:00:00.000Z"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "governance-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Lifecycle & state
activate
mandate.activate · POST /mandates/activate · gate key · sandbox · answers Mandate@1
No input — this capability takes no request body.
Door — mandate.vin serves this noun on its two routes: / (the landing) · /5XYP2DHC5MG106068 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Mandate.activated@1.
import { mandate } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await mandate.activate()curl -X POST https://apis.vin/mandates/activate \
-H 'content-type: application/json' \
-d '{}'More actions
cap
mandate.cap · POST /mandates/cap · gate key · sandbox · answers MandateCap@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /5XYP2DHC5MG106068 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Mandate.capped@1.
import { mandate } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await mandate.cap()curl -X POST https://apis.vin/mandates/cap \
-H 'content-type: application/json' \
-d '{}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "MandateCap@1",
"value": {
"mandate": "mandate_e527fe9d",
"subject": "agent_vinsandbox0001",
"scope": "act:settle",
"status": "active",
"ceiling": {
"amount": "250000",
"currency": "USD"
},
"perAction": {
"amount": "50000",
"currency": "USD"
}
},
"evidence": {
"mandate": "mandate_e527fe9d",
"subject": "agent_vinsandbox0001",
"scope": "act:settle",
"status": "active",
"ceiling": {
"amount": "250000",
"currency": "USD"
},
"perAction": {
"amount": "50000",
"currency": "USD"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "governance-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}grant
mandate.grant · POST /mandates/grant · gate human · sandbox · answers Mandate@1
No input — this capability takes no request body.
The gate is a 403 NEEDS_HUMAN — the human verb authorize (credential: principal) · demand side, routed to a named, staffed, priced terminus with a poll rail. Never a dead end. Price: not posted — see /pricing.
Door — mandate.vin serves this noun on its two routes: / (the landing) · /5XYP2DHC5MG106068 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Mandate.granted@1.
import { mandate } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await mandate.grant()curl -X POST https://apis.vin/mandates/grant \
-H 'content-type: application/json' \
-d '{}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "Mandate@1",
"value": {
"principalId": "PRINCIPAL-01",
"agentId": "AGENT-GRANTED-01",
"action": "sign",
"outcome": "granted",
"grantedScopes": [
"sign"
],
"capCents": null,
"remainingCents": null,
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "mandate-rail-sandbox"
}
},
"evidence": {
"principalId": "PRINCIPAL-01",
"agentId": "AGENT-GRANTED-01",
"action": "sign",
"outcome": "granted",
"grantedScopes": [
"sign"
],
"capCents": null,
"remainingCents": null,
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "mandate-rail-sandbox"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "mandate-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}narrow
mandate.narrow · POST /mandates/narrow · gate key · sandbox · answers MandateNarrow@1
No input — this capability takes no request body.
Door — mandate.vin serves this noun on its two routes: / (the landing) · /5XYP2DHC5MG106068 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Mandate.granted@1 · Mandate.narrowed@1 · Mandate.subDelegated@1.
import { mandate } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await mandate.narrow()curl -X POST https://apis.vin/mandates/narrow \
-H 'content-type: application/json' \
-d '{}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "MandateNarrow@1",
"value": {
"mandate": "mandate_da1fd924",
"priorScope": "act:*",
"scope": "act:settle",
"ceiling": {
"amount": "100000",
"currency": "USD"
},
"status": "active"
},
"evidence": {
"mandate": "mandate_da1fd924",
"priorScope": "act:*",
"scope": "act:settle",
"ceiling": {
"amount": "100000",
"currency": "USD"
},
"status": "active"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "governance-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}present
mandate.present · POST /mandates/present · gate key · sandbox · answers MandatePresentation@1
No input — this capability takes no request body.
Door — mandate.vin serves this noun on its two routes: / (the landing) · /5XYP2DHC5MG106068 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Mandate.presented@1.
import { mandate } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await mandate.present()curl -X POST https://apis.vin/mandates/present \
-H 'content-type: application/json' \
-d '{}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "MandatePresentation@1",
"value": {
"mandate": "mandate_da1fd924",
"presentation": "mandatepresentation_063825ae",
"valid": true,
"scope": "act:settle",
"presentedAt": "2026-08-10T00:00:00.000Z"
},
"evidence": {
"mandate": "mandate_da1fd924",
"presentation": "mandatepresentation_063825ae",
"valid": true,
"scope": "act:settle",
"presentedAt": "2026-08-10T00:00:00.000Z"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "governance-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Data model
The record shape behind this noun — one entity, each property an evidence field. See the whole estate model on the data model page.
Mandate
Schema
| Property | Type | Notes |
|---|---|---|
mandateId | id | mnd_ |
principalId | ref→Party | — |
granteeId | ref→Party | agt_ |
ceiling | decimal | — |
perAction | decimal | — |
spentToDate | decimal | — |
expiresAt | datetime | — |
scope | CapabilityName[] | — |
tripwires | EventName[] | — |
status | MandateFSM | — |
parentMandateId | ref→Mandate | sub-delegation, narrows only |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
party | mandate | 1:0..* | grants (principal) |
party | mandate | 1:0..* | holds (grantee) |
mandate | mandate | 1:0..1 | sub-delegates (narrows only) |
mandate | mandate | 1:0..1 | sub-delegates (narrows only) |
ledger | mandate | *:0..1 | authority |
ledger | mandate | *:1 | capability→mandate/connection provenance (which credential ran this leaf) |
Modeled
The noun drawn out — its record shape, its lifecycle, and how it is exercised end to end. 6 diagrams, rendered from the estate model.
Mandate · Class model
Mandate · State machine
Mandate · Sequence
Mandate · Class model
Mandate · State machine
Mandate · Sequence
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.