1. Handwrite Classroom
Handwrite Classroom
  • Handwrite Regular Accounts
    • Schemas
      • Error
      • Principal
      • Role
      • Access
      • ContentType
      • Language
      • FileRef
      • Document
      • Tombstone
      • DocumentPage
      • CreateDocument
      • UpdateDocument
      • FileInfo
      • CommitUpload
      • Upload
      • DownloadLink
      • Extracted
      • ExtractionFailed
      • CommittedDocument
      • ExtractedDocument
      • SearchHit
      • SearchPage
      • Export
      • Permission
      • Share
      • ChangeRole
      • Invitation
      • Permissions
      • ReceivedInvitation
      • AcceptedInvitation
      • Me
      • WebhookEventType
      • Webhook
      • CreateWebhook
      • CreatedWebhook
      • WebhookDelivery
      • AudioFormat
      • Speech
      • WordTiming
      • SpeechMarks
      • AudioLink
      • Voice
      • Quota
      • SettingEntry
      • Settings
      • SettingsPatch
      • PatchedSettings
      • OAuthToken
      • OAuthError
  • Handwrite Team
    • Schemas
      • Error
      • Principal
      • Access
      • ContentType
      • Language
      • FileRef
      • Document
      • Tombstone
      • DocumentPage
      • OrgKind
      • OrgRole
      • Organisation
      • CreateOrganisation
      • RenameOrganisation
      • Member
      • AddMember
      • ChangeMember
      • InviteMember
      • OrgInvitation
      • ReceivedOrgInvitation
  • Handwrite Classroom
    • Start here — Classroom for developers
    • Classroom API specification notes
    • Classroom socket specification notes
    • Classroom live socket — README
    • Classroom identities, credentials and roles
    • School and student workflows
    • Classroom policy and data-use notes
    • Class setup
      • README — GET /api/v1/orgs
      • README — POST /api/v1/orgs
      • README — GET /api/v1/orgs/{id}
      • README — PATCH /api/v1/orgs/{id}
      • README — DELETE /api/v1/orgs/{id}
      • Class setup API — README
      • Choose a class from the returned organisations
      • Create an ordinary class
      • Read the selected class
      • Rename a class
      • Delete an ordinary class
    • Invitations
      • README — GET /api/v1/orgs/invitations
      • README — POST /api/v1/orgs/invitations/{inviteId}/accept
      • README — POST /api/v1/orgs/invitations/{inviteId}/decline
      • README — GET /api/v1/orgs/{id}/invitations
      • README — POST /api/v1/orgs/{id}/invitations
      • README — DELETE /api/v1/orgs/{id}/invitations/{inviteId}
      • Invitations API — README
      • Read invitations to the signed-in person
      • Accept a class invitation
      • Decline a class invitation
      • List pending class invitations
      • Invite a person by email
      • Cancel a pending invitation
    • People
      • README — GET /api/v1/orgs/{id}/members
      • README — POST /api/v1/orgs/{id}/members
      • README — PATCH /api/v1/orgs/{id}/members/{principal}
      • README — DELETE /api/v1/orgs/{id}/members/{principal}
      • README — POST /api/v1/orgs/{id}/leave
      • People API — README
      • Read the visible membership roster
      • Add an existing person to a class
      • Change a class member role
      • Remove an ordinary class membership
      • Leave an ordinary class
    • Documents
      • README — GET /api/v1/orgs/{id}/documents
      • Documents API — README
      • List class-owned documents
    • Plan and usage
      • README — GET /api/v1/orgs/{id}/billing
      • README — GET /api/v1/orgs/{id}/usage
      • README — GET /api/v1/orgs/{id}/usage/live
      • README — GET /api/v1/orgs/{id}/members/{principal}/usage
      • README — GET /api/v1/orgs/{id}/insights
      • Plan and usage API — README
      • Read classroom plan and seat information
      • Read classroom usage totals
      • Read the recent classroom activity window
      • Read one member usage
      • Read classroom collaboration insights
    • Policies
      • README — GET /api/v1/orgs/{id}/policies
      • README — PUT /api/v1/orgs/{id}/policies
      • README — GET /api/v1/orgs/{id}/members/{principal}/policy
      • README — PUT /api/v1/orgs/{id}/members/{principal}/policy
      • README — DELETE /api/v1/orgs/{id}/members/{principal}/policy
      • Policies API — README
      • Read class-wide policy
      • Replace class-wide policy rules
      • Read one member policy
      • Replace one member policy override
      • Clear one member override
    • Managed tokens
      • README — GET /api/v1/orgs/{id}/members/{principal}/tokens
      • README — POST /api/v1/orgs/{id}/members/{principal}/tokens
      • README — DELETE /api/v1/orgs/{id}/members/{principal}/tokens/{tokenId}
      • Managed tokens API — README
      • List tokens issued to a member
      • Issue a managed student token
      • Revoke a managed token
    • Schemas
      • Error
      • Principal
      • Access
      • ContentType
      • Language
      • FileRef
      • Document
      • Tombstone
      • DocumentPage
      • OrgKind
      • OrgRole
      • Organisation
      • CreateOrganisation
      • RenameOrganisation
      • Member
      • AddMember
      • ChangeMember
      • InviteMember
      • OrgInvitation
      • ReceivedOrgInvitation
  1. Handwrite Classroom

Classroom identities, credentials and roles

Choose the identity deliberately#

IdentityWhat it representsImportant limits
Human customer accountA teacher, co-teacher, billing person or ordinary class memberAPI key/OAuth scopes and current class role both apply. OAuth additionally needs effective third-party-app policy.
School student app sessionA school-managed student in the separate student poolUsed by the Classroom app's opted-in session routes. It cannot manage developer keys, OAuth consent, billing or the school roster.
Managed member tokenA fine-grained key owned by one student, issued by the classActs as that student, not the teacher or class. The public issue schema rejects orgs:manage; 1–30 day expiry; only the organisation manages it.
Organisation user tokenThe class:<orgId> principal at user levelStudent-tier standing for organisation administration; document/permission scopes and at most orgs:read. This does not cap its own class-document access at viewer. No speech or live-room identity.
Organisation admin tokenThe same class principal at admin levelMay carry orgs:manage and teacher-tier standing. It does not inherit a human owner's identity; organisation-owner checks still compare the actual owner field.
Isolated app test tokenAn operator-created app: test principalCan only verify /me and list /voices; it cannot access any classroom.
Managed member tokens and organisation tokens are different products. The former are user-owned and cannot request organisation management. The latter are organisation-owned and have user/admin levels in the current working tree. Do not describe both as an unrestricted “school API key.”
The public /api/v1 wrapper accepts configured customer-pool session JWTs, API keys and Handwrite OAuth access tokens. It does not configure the student-pool JWT verifier. Do not copy a Classroom browser token into a public API request and expect it to authenticate. An authorised managed student key is a separate public-API credential; the student app uses session-aware routes.
Organisation tokens are currently created through the signed-in organisation Developer tab, not another public API key. The source requires a plan with the developer feature, current membership, the developerAccess policy and the creator's current standing. Class students never gain the Developer tab, even under everyone; billing does not gain it either. A teacher can create admin-level tokens. Co-teachers can create user-level tokens only when the policy permits managers. The current code caps token authority after role changes and refuses tokens whose creator loses access. These developer controls are source-verified; release/deployment is not established here.
Individual-document checks grant owner access when the document owner equals the token's own class: principal. Even a user-level org token can therefore create, edit, share or delete class-owned documents when its scopes, selected-document restrictions and effective policy permit; selected-document tokens cannot create new documents. The organisation listing calculates its access label from the token's role, so that label can differ from the individual-document ownership result. Do not apply the human student row below to an organisation service token.
Staff API-block enforcement is also a separate release check for these new org-owned tokens: their current authentication path omits the common staff-block gate used by member credentials. Do not treat a staff suspension as proof that every service token has stopped; verify token revocation or developerAccess: off when a complete stop is needed.

Classroom role matrix#

These are human membership-role permissions, not substitutes for token scopes, entitlement or resource access. Organisation-owned tokens use the separate document ownership behavior described above.
ActionTeacherCo-teacherBillingStudent
Read classYesYesYesYes
Rename classYesNoNoNo
Delete ordinary classOwning teacher onlyNoNoNo
Read visible membershipsFull rosterFull rosterFull rosterTeachers, co-teachers and self
Read membership emails when storedYesYesYesNo
Manage membershipsValid non-owner targets/rolesStudent tier onlyNoSelf-leave only if allowed and credential has scope
Create class-owned documentsYesYesNoNo
Baseline class-document accessOwnerOwnerViewerViewer
Read class policiesYesYesYesOwn effective policy only
Change class-wide policiesYesNoNoNo
Change member overridesYesStudent targets onlyNoNo
Issue/revoke managed student tokensYesNoYesNo
List managed-token administrationYesYesYesNo
Read billingYesNoYesNo
Read member usageYesYesYesOwn view
Read collaboration insightsFullFullNoOwn share
Erase school student through StudentsYesNoNoNo
A classroom has no developer role, although a school plan can include a developer feature. The class has one owner field; other teachers are admin tier but do not become the owner. The shared owner role value is a team ownership-transfer mechanism, not a class role.
A student can edit a document only when its actual access allows it, such as an explicit personal editor grant. Joining a live session does not automatically upgrade viewer access. Teacher/co-teacher owner-level access to class documents does not grant blanket access to students' unrelated personal documents.
Source basis: http.ts, console.ts, portal.ts, org-roles.ts, org-permissions.ts, managed-tokens.ts, policy-schemas.ts and developer.ts.
Modified at 2026-10-26 13:24:24
Previous
Classroom live socket — README
Next
School and student workflows
Built with