# Read a mandate

`GET /functions/v1/mandate-get`

One function, two shapes: a single mandate with its last 100 consumptions, or a list by effective status. Expiry is decided at read time, never by a cron.

| Query | Returns |
| --- | --- |
| ?id=<mandate_id> | One mandate plus its last 100 consumptions — the statement, free |
| ?status=active|consumed|exhausted|expired|revoked | A list by effective status |

```
curl "https://api.sidaxis.com/functions/v1/mandate-get?id=mdt_a91f3c" \
  -H "x-sidaxis-api-key: sk_live_..." \
  -H "x-sidaxis-timestamp: 1789564930" \
  -H "x-sidaxis-nonce: 8fa0c31b77"
```

## Authorisation on every read

Unknown and unauthorised answer identically — `404 not_found` — so nobody can probe for existence.

## Effective status

`expires_at` compared against the server clock at read time is the authority, so a mandate reads `expired` even before the tidy-up job runs. `stored_status` shows the untouched row when it differs. Expiry never depends on a cron.

200:

```
{
  "mandate_id": "mdt_a91f3c",
  "status": "active",
  "stored_status": "active",
  "scopes": ["payment"],
  "ceiling": { "kind": "amount", "amount": 50000, "currency": "USD", "period": "daily" },
  "remaining": 31100,
  "period_resets_at": "2026-09-17T03:00:00Z",
  "assurance_level": "face_voice_doc",
  "agent_display_name": "Your travel assistant",
  "expires_at": "2026-12-31T23:59:59Z",
  "consumptions": [
    { "consumption_id": "cns_5b7e21", "amount": 18900, "action_ref": "booking-88213",
      "created_at": "2026-09-16T12:01:42Z" }
  ]
}
```

## No pagination

There is no cursor pagination on this endpoint: no `cursor`, no `next_cursor`, no `has_more`. A single read returns the list by status and the last 100 consumptions. Cursor pagination is on the [roadmap](/roadmap).
