# Revoke a mandate

`POST /functions/v1/mandate-revoke`

Immediate, never cached, terminal, and it needs no cooperation from the agent holding the mandate.

```
{ "mandate_id": "mdt_a91f3c", "reason": "no longer travelling" }
```

200:

```
{
  "revoked": true,
  "already_revoked": false,
  "mandate_id": "mdt_a91f3c",
  "status": "revoked",
  "revoked_at": "2026-09-16T12:40:11Z"
}
```

## Three properties

- **Immediate and never cached** — the next action fails, with no window.
- **Terminal** — revoked never returns to active.
- **No cooperation** — revocation does not ask the holder for anything.

## Who may call it

The granting human, the issuing merchant, or the service role — **not** the agent holding the mandate. Repeat calls answer `already_revoked: true` rather than failing.

## What the person sees

The revocation screen names the agent with `agent_display_name` and `agent_descriptor`, falling back to `granted_to` when they were not declared.

A `mandate.revoked` webhook follows, delivered by the outbox worker within a minute. See [webhooks](/webhooks).
