Skip to content

Scopes

The typed catalogue contains exactly 23 scopes: 14 club and 9 federation. A route requires every scope declared on it. Missing scope metadata is a server wiring error and fails closed; /v1/me and /v1/club/profile explicitly require a valid signature but no business scope. /health alone is public.

Club scopes

ScopeSurface
club.contacts.readMasked contact lists, timelines and households
club.contacts.read_piiUnmasked contact profile; audited
club.contacts.writeContact and household writes
club.compliance.readCompliance, signing state, templates, consent and restrictions
club.compliance.read_filesShort-lived signed file URLs; audited
club.compliance.writeSigning-request create/preview/actions and renewal
club.safety.readIncident summaries, restrictions and credentials
club.safety.read_sensitiveFull incident detail; audited
club.safety.writeIncident, witness and staff-credential writes
club.billing.readInvoices, intakes and products; read-only
club.messages.readMessages, recipients and templates; read-only
club.coaches.readCoach admission cards and credentials
club.coaches.writeCoach invite/suspend/resume/revoke
club.federations.readClub federation memberships and sharing posture

Federation scopes

ScopeSurface
federation.members.readMember clubs and governance view
federation.aggregate.readAggregate compliance/enrolment/overview
federation.people.readFederation people registry
federation.people.writeRegister/correct/activate/deactivate people
federation.audit.readFederation audit feed
federation.safety.readFederation-level incidents/removals; sensitive detail audited
federation.compliance.readFederation credentials/compliance view
federation.memberships.readMembership applications and memberships
federation.rules.readSharing rules and consent states

A grant request is the workspace catalog intersected with the human issuer's existing Academy permissions. Subscription restrictions are explicitly deferred; package, status, module, rate and free-form JSON values are not entitlement evidence. Five club scopes are reserved to the current club's actual OWNER: club.compliance.read_files, club.safety.read_sensitive, club.coaches.read, club.coaches.write, and club.federations.read. OWNER evidence is resolved independently from an active, non-deleted Role(type=STAFF, subtype=OWNER) row for the issuer and exact target club tenant. ADMIN, a custom wildcard holder, and an OWNER of another club cannot grant them; * is never interpreted as a role. A matching OWNER can grant all 14 club scopes, while a non-OWNER wildcard remains limited to the 9 ordinary club scopes. Broad safety scopes require both the incident/removal module and the independently configurable credential-register module. Federation people, safety and compliance access still requires explicit staff-matrix evidence; federation admin and * do not supply it.

The same server-owned grant list gates catalog display, create, and update. A key receives only its persisted scopes and exact workspace binding; it does not inherit OWNER. Losing OWNER does not silently revoke an existing key: non-OWNER managers may strictly reduce it, but may not re-submit an equal ungrantable set, replace one owner-only scope with another, or add one. Rotation preserves rather than expands the persisted scopes.

The Academy control-plane .../partner/credentials/scopes response retains top-level scopes as the grantable list and adds groups as the full workspace catalog in stable order. Groups contain localization keys only, no wildcard or per-item grantable flag. Group labels use partner.scopeGroup.<group-id>.label; each scope uses partner.scope.<scope>.label and partner.scope.<scope>.description. UI descriptions must make PII, file, sensitive safety and audited access explicit. A future server-only subscription ceiling must use [] when enabled evidence is missing; the ceiling is not accepted from request DTOs.