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

School and student workflows

This page explains how an outside integration fits around Handwrite's school app. These are signed-in app and staff workflows. The private /api/org/**, /api/auth/student/** and /api/internal/** handlers are not part of the supported public integration reference.

Ordinary classes and provisioned schools#

Creating an ordinary kind: "class" organisation makes its human creator the owning teacher. A staff-provisioned school additionally has a School record, a school code and managed students in a separate sign-in pool. Buying a plan called school for an ordinary class does not by itself create that School record or student accounts.
Schools apply through support@handwrites.io or the school-setup contact topic. Authorised Handwrite staff approve the request. The approved school receives a code in the form HW-XXXX-XXXX; its admin is linked to an existing eligible verified customer account or receives a teacher invitation. The intended administrator accepts that invitation using their own customer account. The provision service itself does not send the approval email; the staff support workflow sends the reply.

Roster and temporary passwords#

Teachers and co-teachers with members.manage use the Students tab at the school's signed-in management page. They add a student or preview/import a roster. Generic public membership creation does not create the associated student-pool account. Student deletion needs data.erase, held by teachers rather than co-teachers.
The current app supports CSV headers email,given_name,family_name with optional class, at most 200 rows and 1 MB per file. Preview validates before commit; a committed batch is all-or-nothing within that batch. A large school uses several separately reviewed files. Do not place roster data in URLs, error trackers or sample requests.
Temporary passwords are returned only to the authorised management action and are configured for seven days. The student changes the temporary password on first use. Cognito student creation suppresses provider email; the school distributes login instructions through its approved channel. A reset is another school management action, not an outside developer password API.
App-level add/import/reset actions implement idempotency for recovering their own response, including the temporary password. This does not mean every public /api/v1 write accepts an idempotency key. In particular, public managed-token issuance has no idempotency wrapper.

Student sign-in and boundaries#

A student signs in on the Classroom host with school code or exact school name, school email and password. The backend checks active school, student record and student membership. Unknown school, incorrect credentials and disabled students intentionally receive the same sign-in failure behavior. Do not build an integration that probes this form to discover school codes or student membership.
The separate student-pool identity does not contain student email or display name; the app loads display information from the roster. School student accounts are distinct from customer accounts with the same address. Do not merge them by email or assume that the same address at two schools denotes one shared identity.
Students cannot use the customer purchase, developer-key or OAuth consent controls. School-wide suspension blocks the student app and initiates pool disable/sign-out work. A student's own disabled state remains separate when the school is resumed. Do not infer public API credential state from a successful or failed browser sign-in; API credentials also have their own policy, expiry and revocation checks.

Departure and closure#

Remove a school student through the Students workflow so membership, student account and cloud-data cleanup remain coordinated. The generic public member removal route refuses school students. It is not a substitute for student account erasure.
School closure is a support/staff workflow, not DELETE /api/v1/orgs/{id}. It disables access and performs resumable cleanup; an accepted first step is not proof every student has been erased. An ordinary class owner can delete their own ordinary class through the public API. Your integration should disconnect and remove cached data according to the selected action rather than silently invoke deletion.

Verification boundary#

These flows are checked against source. Student-pool configuration, Classroom-host deployment, mail delivery, external Voices authorizer support and a complete student login have not been verified by this documentation task. The 2026-10-26 provider snapshot found no Classroom portal DNS or CloudFront alias. Coordinate a disposable test school with the operator before live acceptance testing.
Modified at 2026-10-26 13:14:15
Previous
Classroom identities, credentials and roles
Next
Classroom policy and data-use notes
Built with