| name | Yes | Human-readable name for the key. Example: 'Home Assistant', 'CI Pipeline'. | |
| scope | No | Scope for the key: 'content_only' (send content, list displays) or 'admin' (full management). | content_only |
| org_id | No | Optional organization ID. If set, the key acts on behalf of this organization. | |
| permissions | No | Granular permission flag: 'read', 'write', or 'read_write' (default). Applied on top of 'scope' — e.g. a content_only read-only key cannot PUT data slots. Matched against HTTP verb: GET requires read, PUT/POST/PATCH/DELETE require write. | read_write |
| access_token | No | Optional bearer token; prefer session_request_id. | |
| capabilities | No | Optional JSON array of fine-grained capability flags this key may exercise. Allowed values: 'slot.read' (list/get slots), 'slot.write' (put/delete slots), 'display.read' (list/get displays, read content), 'display.send' (send_html/send_url/broadcast/clear/set_idle), 'display.manage' (rename/delete/lock/configure/license/pair/claim/create). Omit or pass [] for no capability restriction. Capabilities narrow — never expand — the key's rights; they combine with scope, permissions, and resource whitelists. | |
| expires_in_days | No | Optional expiration in days. If not set, the key never expires. | |
| allowed_slot_slugs | No | Optional JSON array of data-slot slugs this key may touch (max 64). When set, every data-slot request must target one of these slugs. Omit or pass [] for no slug restriction. Example: ['sensor-lobby', 'sensor-garage']. | |
| session_request_id | No | Session handle from create_auth_session; pass it on every authenticated call. | |
| allowed_display_ids | No | Optional JSON array of display profile IDs this key may touch (max 64). When set, every display request must target one of these IDs. Omit or pass [] for no display restriction. Example: ['ABCD1234','EFGH5678']. | |