> ## 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: "",
  payments: "",
  openBanking: "",
  developers: "",
  verifiers: ""
};

<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={null}
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={null}
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={null}
import { listPintTokens } from "@sumvin/sdk";

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

## Revoke a mandate

```ts theme={null}
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).
