Scopes
What a key may do is decided entirely by the scopes on that key. There is no second permission layer underneath.
A call whose key lacks the scope is refused with 403 INSUFFICIENT_SCOPE, and the message names the scope that is missing. Give a key the narrowest set that does its job: a key that only reads cannot delete a meeting, whatever else goes wrong.
Four scopes are marked sensitive and are never part of a preset. Whoever creates the key has to select them deliberately.
employees:read1 endpointemployees:writeSensitive1 endpointmeetings:deleteSensitive1 endpointmeetings:read2 endpointsmeetings:write4 endpointsminutes:read1 endpointprojects:read1 endpointprojects:writeSensitive2 endpointstemplates:read1 endpointtranscript:read1 endpointusage:read1 endpointvocabulary:read1 endpointvocabulary:writeSensitive2 endpointsAn invalid request is refused before the scope is checked
Request validation runs first, so a call with both a broken body and a missing scope answers
400 INVALID_REQUEST, not 403 INSUFFICIENT_SCOPE. Fix the body, then read the status again.