> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sumvin.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Read and revoke Stamped Mandates

> List a person's Stamped Mandates, read one in full, see who it was issued to, and revoke it.

export const waitlists = {
  earlyAccess: "https://sumvin.com/?interest=early_access&utm_source=docs&utm_medium=banner&utm_campaign=early_access#waitlist",
  payments: "https://sumvin.com/?interest=payments&utm_source=docs&utm_medium=banner&utm_campaign=payments#waitlist",
  openBanking: "https://sumvin.com/?interest=open_banking&utm_source=docs&utm_medium=banner&utm_campaign=open_banking#waitlist",
  developers: "https://sumvin.com/developers?interest=cli,agent_plugin&utm_source=docs&utm_medium=banner&utm_campaign=developers#access",
  verifiers: "https://sumvin.com/developers?interest=verifiers&utm_source=docs&utm_medium=banner&utm_campaign=verifiers#access"
};

<Note>
  **Private preview:** this is rolling out and may not be available on your account yet.{waitlists.earlyAccess ? <> <a href={waitlists.earlyAccess}>Request early access →</a></> : null}
</Note>

<Warning>
  **First-party only today.** These calls need a personal access token, which isn't yet open to third-party apps. See [Sign in](/sdk/agents/sign-in).
</Warning>

A [Stamped Mandate](/concepts/stamped-mandates) is a signed authorisation for what an agent may do. The SDK's functions still carry the older wire name, `pint`: `listPints` lists Stamped Mandates.

Every call below reads or changes the signed-in person's own mandates. Nobody else's are visible.

## List mandates

Mandates are listed per wallet, so `listPints` needs the address of the wallet the person's mandates belong to. Get it from `listWallets`: it is the person's primary account wallet.

```ts theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
import { listPints, listWallets, unwrap } from "@sumvin/sdk";

const { wallets } = unwrap(await listWallets({ client, query: { is_eoa: false } }));
const wallet = wallets.find((w) => w.is_primary);
if (!wallet) throw new Error("This account has no primary wallet yet.");

const page = unwrap(await listPints({ client, query: { wallet: wallet.address } }));
for (const { pint } of page.data) {
  console.log(pint.id, pint.status, pint.scopes);
}
```

A person's account wallet is created after they finish [verification](/get-started/first/verify). Until then, `listWallets` succeeds but returns no account wallet, so they have no mandates to list. The wallet is created in the background, so it may not appear straight after verification; check again later.

| Query | Default | Values |
| - | - | - |
| `wallet` | required | The wallet address. |
| `status` | `active` | `pending`, `active`, `consumed`, `revoked`, `expired`. See [States](/concepts/mandates/verification#states). |
| `sort` | `created_at` | `created_at` or `expires_at`. |
| `order` | `desc` | `asc` or `desc`. |
| `limit` | `20` | 1 to 50. |
| `cursor` | none | The `cursor` from the previous page, when `has_more` is `true`. |

## Read one mandate

```ts theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
import { getPint } from "@sumvin/sdk";

const { pint } = unwrap(await getPint({ client, path: { pint_id: mandateId } }));
```

`mandateId` is the mandate identifier, such as `sr:us:pint:3f9c2a7e5b1d4c8e9a6f0b2d7e4c1a58`. You can only read your own.

To show what a mandate allows in plain numbers, use the [ceiling reader](/sdk/verify/reading-scopes). The scopes themselves are described in [Scopes](/concepts/mandates/scopes).

## See who it was issued to

A mandate can be issued as a token to more than one party. `listPintTokens` lists each one: who it is addressed to, when it was issued, when it expires, and whether it was revoked.

```ts theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
import { listPintTokens } from "@sumvin/sdk";

const tokens = unwrap(await listPintTokens({ client, path: { pint_id: mandateId } }));
```

## Revoke a mandate

```ts theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
import { revokePint } from "@sumvin/sdk";

const { error } = await revokePint({ client, path: { pint_id: mandateId } });
```

Revoking is immediate and can't be undone. Every token issued against the mandate stops working with it. Revoking one that is already revoked returns `409` with its current state.

## Requesting a new mandate

A new mandate is always approved by the person, with their passkey, in their own browser. Ask for one through the [MCP connector](/guides/set-limits) or the [CLI](/reference/cli/pint).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.