---
title: "Verify proposed actions against a mandate"
method: POST
path: "/v1/verify"
---

# Verify proposed actions against a mandate

`POST /v1/verify`

## Request

- Base URL: `https://agentmandate-api.com`
- URL: `https://agentmandate-api.com/v1/verify`
- Auth: HTTP bearer

Deny-by-default: an action matching no grant is denied. Returns a receipt per action with the decision, the grant that decided it, every violation (not just the first) and a digest that pins the evaluation. Send one "action" or up to 500 in "actions" — billing is one unit per action verified.

## Request body

- object
  - `mandate` object, required: The object returned by POST /v1/mandates — claims plus signature.
  - `action` object
    - `agent` string: The agent presenting the mandate. Checked against mandate.agent — supply it, since a mandate is a bearer document and this is what stops a leaked one being replayed by another agent.
    - `action` string, required: Concrete dotted action name. A wildcard is a grant, not an action.
    - `resource` string
    - `amountMinor` integer: Integer minor units. Requires currency.
    - `currency` string
    - `priorSpendMinor` integer: Spend already made under this mandate. You track it; the mandate is stateless.
    - `priorCount` integer: Times this action has already been taken under this mandate.
    - `approvalToken` string
    - `at` string, date-time: Evaluation instant. Supply it to make a decision reproducible.
  - `actions` object[]
    - `agent` string: The agent presenting the mandate. Checked against mandate.agent — supply it, since a mandate is a bearer document and this is what stops a leaked one being replayed by another agent.
    - `action` string, required: Concrete dotted action name. A wildcard is a grant, not an action.
    - `resource` string
    - `amountMinor` integer: Integer minor units. Requires currency.
    - `currency` string
    - `priorSpendMinor` integer: Spend already made under this mandate. You track it; the mandate is stateless.
    - `priorCount` integer: Times this action has already been taken under this mandate.
    - `approvalToken` string
    - `at` string, date-time: Evaluation instant. Supply it to make a decision reproducible.

## Response `200`

Success

- object
  - `count` integer
  - `receipts` object[]
    - `decision` 'allow' | 'deny' | 'requires_approval'
    - `mandateId` string
    - `agent` string
    - `principal` string
    - `action` string
    - `matchedGrant` object: The grant that authorized the action, or null.
    - `matchedGrantIndex` integer
    - `violations` object[]: Every reason, not just the first — an approval queue needs the whole picture.
      - `code` string
      - `detail` string
      - `grantIndex` integer
    - `remainingSpendMinor` integer: Headroom under the total cap after this action, or null when uncapped.
    - `evaluatedAt` string, date-time
    - `digest` string: SHA-256 over the decision inputs. Pins an audit entry to exactly this evaluation.

## Other responses

- `400`: Deterministic error. Branch on `code`; quote `requestId` when reporting a problem.
- `401`: Deterministic error. Branch on `code`; quote `requestId` when reporting a problem.
- `429`: Deterministic error. Branch on `code`; quote `requestId` when reporting a problem.
- `500`: Deterministic error. Branch on `code`; quote `requestId` when reporting a problem.

---

[API](https://skmtc.dev/agentmandate-api/apis/agent-mandate.md) · [All operations](https://skmtc.dev/agentmandate-api/apis/agent-mandate/llms.txt) · [OpenAPI document](https://skmtc.dev/agentmandate-api/apis/agent-mandate/revisions/463fe122c4d8?raw)
