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 API specification notes

Reference scope#

Base URL: https://handwrites.io. This edition contains the 30 documented /api/v1/orgs operations used with class organisations. They are shared routes, so list results and shared enums may also describe teams. Send kind: "class" when creating an ordinary class and validate the selected organisation's kind in your application.
The full upstream OpenAPI 3.1 document is available at /api/v1/openapi.json. This edition is a curated subset, not another server version. Document CRUD, content, files, audio, settings, OAuth and personal identity are covered in Regular Accounts. Live collaboration has a separate socket contract.
No public API to provision a school, import the school student roster, reset student passwords, perform school closure or create an organisation developer token is represented in this subset. Those supported app/staff workflows are described in the school guide. Do not copy the app's private session endpoints into a third-party SDK.

Authentication and authorisation#

Send Authorization: Bearer <credential> on every operation in this edition. JSON request bodies need Content-Type: application/json. The public wrapper does not read app cookies and does not provide authenticated cross-origin browser CORS; keep integration credentials on a backend.
Use the identity guide to distinguish customer credentials, student app sessions, managed member keys and organisation tokens. A scope is necessary but not sufficient. The service checks membership, class role, ownership where relevant, effective policy, selected-document limits and required plan features. For example, orgs:manage does not let a co-teacher rename a class or turn a student into a teacher.
Student-pool session JWTs are not configured as public /api/v1 credentials. Managed student keys can carry supported scopes but cannot request orgs:manage; their identity remains the student. Current-source organisation admin tokens may carry orgs:manage, but remain the class principal, not a human owner. OAuth is allowed only when effective API and third-party policy permit it.

Errors, retries and one-time secrets#

Errors normally use {"error":{"code":"…","message":"…"}}. Keep Request-Id for diagnostics without logging the credential or returned secret.
StatusExpected client behavior
400Correct schema, role, parameter or content type. Class roles are limited even when the shared enum lists team roles.
401Obtain a valid credential; stop retrying a revoked/expired token.
402Seat capacity or plan feature may be required; show the appropriate administrator action.
403Scope, role, owner, policy, school protection or credential-kind restriction; do not try alternate endpoints to bypass it. Some managed-token plan failures also use 403.
404Missing or inaccessible organisation/member/token/invitation; do not infer another school's existence.
409Existing membership or request conflict; reconcile current state. Honor Retry-After for idempotency-in-progress.
422Limit reached or idempotency mismatch; repair the request.
429Respect Retry-After and back off; observe returned usage limits.
5xxPreserve user intent. Retry only when the operation is safe or has supported idempotency.
The public operations supporting Idempotency-Key here are ordinary organisation creation, direct member addition and invitation creation. Use a new UUID for a logical action and reuse it only for the identical retry with the same credential, method, URL and body. Stored successful JSON responses last 24 hours; mismatched reuse is rejected. Do not assume all writes support it.
Managed-token issuance has no public idempotency wrapper. Its secret is shown once. If an issuance outcome is uncertain, inspect token metadata and deliberately revoke/reissue as needed rather than blindly issuing duplicates. Never put a returned student secret in request logs.
Default limits inherited from the public wrapper are 20,000 daily requests per credential/account, with per-instance burst controls of about 120 requests and 10/second refill. Effective policy may restrict features, but the stored dailyRequests policy value is not currently used by that public request counter. Monthly audio policy is a separate control. Use Handwrite-Requests-Limit, Handwrite-Requests-Remaining and returned retry information instead of treating these defaults as a guaranteed allocation.

Lists and usage#

GET /orgs and the membership/invitation lists return their documented collections; do not invent cursor parameters for them. Class capacity is capped at 5,000 members and a person at 100 organisations, with plan seats applying below those ceilings. Pending invitations also consume relevant seat capacity.
The organisation document list supports limit, cursor and since. Follow opaque cursors until null. Normal lists omit deleted records; incremental lists include tombstones while retained, and are oldest-first. Advance a sync checkpoint only after processing every page. The document API's retention and revision rules are in the Regular Accounts specification.
Usage dates and daily boundaries are UTC. The live-usage route returns a recent HTTP snapshot, supports ETag/If-None-Match and can return 304 without a body. It is not a streaming protocol. Daily usage can return JSON or CSV; handle the declared content type. Other successful 204 responses are also empty.

Schema and deployment boundaries#

The imported schema preserves the upstream contract. Runtime validators additionally enforce cross-field rules, class role applicability, valid policy keys and managed-token permission caps. For policy writes, rules is a complete replacement object; it is not merge-patch. Always combine schema validation with the operation README and server response.
The public schema matched the live endpoint on 2026-10-26. Notes about organisation developer controls reflect current source, including uncommitted work, and are not a release announcement. Classroom portal DNS, student authentication, speech authorizer wiring and authenticated writes were not verified in this documentation task.
Modified at 2026-10-26 13:24:24
Previous
Start here — Classroom for developers
Next
Classroom socket specification notes
Built with