# Field names

The vocabulary source of truth: the field names the engine accepts, what changed from the earlier documentation, and the two rules that never bend.

## Was / is

| Earlier documentation | The engine | Note |
| --- | --- | --- |
| scope | scopes | An array, on issuance |
| until | expires_at | Mandatory on issuance |
| data_release | data_share | One of the eight canonical scopes |
| ceiling.period: once|day|month|year | ceiling.period: lifetime|daily|weekly|monthly | The bucket is computed server-side |
| ceiling.amount: 200 | ceiling.amount: 4000 | Integer, minor unit — never a decimal |
| counterparty_not_permitted | constraint_violated | One refusal reason for all constraints |
| facetoken | removed | The identifier is the auth.users UUID minted by the engine |

## Accepted on mandate-issue

| Field | Type | Means |
| --- | --- | --- |
| granted_by | uuid | The human who authorises |
| granted_to | string | An opaque machine identifier — never the label a person reads |
| granted_to_kind | enum | What kind of holder it is |
| agent_display_name | string ≤64 | The readable name shown on authorisation, revocation and receipts |
| agent_descriptor | string ≤140 | One line saying what the agent does |
| scopes | array | Exact match, no wildcard, no dot-notation |
| constraints | object | merchant_allowlist, category_allowlist, country_allowlist |
| ceiling | object | kind: amount|count|both|none, amount, currency, count, period |
| expires_at | timestamp | Mandatory |
| step_up_of | uuid | The mandate this one steps up from |
| proof.capture_id | string | A live capture no older than five minutes |

## Two immutables

- Money is always an integer in the minor unit, in and out. `4000` is forty dollars; a float is refused with `AMOUNT_INVALID`.
- Recurrence lives in `ceiling.period` and nowhere else. There is no recurring scope, and no dot-notation in a scope.

- The eight scopes: https://docs.sidaxis.com/mandates/scopes
- Issue a mandate: https://docs.sidaxis.com/mandates/issue
