Use Handwrite Cloud to build tools that read, search, edit, share and speak a person's documents. This documentation covers regular accounts. Team administration, classroom management, staff administration and internal service APIs have separate documentation areas.
For a private server-side integration, create a token with only the permissions your task needs. Save the value when shown and keep it in your server's secret store.
3.
For an app used by other people, register an OAuth app and use authorization code with PKCE. Each user authorizes their own account; do not distribute your personal API key.
4.
Check the identity, then work on a document the user has chosen.
The first call returns principal and key; the second needs documents:read. A personal integration should see a user: principal. API keys authorize API calls; they do not create an interactive account sign-in session.
Identify the authenticated principal and show the user's effective policy and usage.
Documents
A document library, editor, search tool, incremental sync or export.
Files
Upload original files, download them and extract readable text.
Sharing
Owner-controlled sharing and an invitation inbox.
Audio
Read-aloud, word highlighting, voice selection and downloadable speech.
Settings
Sync reading preferences across supported devices.
Webhooks
React to document and permission changes on your server.
OAuth
Let each person connect their own Handwrite account.
Meta
Fetch the full machine-readable OpenAPI description.
Each HTTP operation has an API reference and a separate README with its purpose, authentication, example, responses and integration notes. Read API specification notes for shared behavior and Socket specification notes before building collaborative editing.
Account connection and document selection are separate actions. Connecting an account should not silently import every document. Let the user choose documents, or explicitly opt into library sync, and retain the chosen IDs. A fine-grained token can be restricted to chosen documents; handle access being removed later.The API represents Handwrite Cloud data. Signing in does not grant direct access to a device's local files or its iCloud library. Show what your integration actually imported or synced; do not promise that every local or iCloud document appears in the Cloud API. Read app settings through the settings API; a stored preference does not mean every device supports the same feature.Use a backend for a web integration: authenticated REST endpoints do not provide cross-origin browser CORS access. Never put a personal API key or confidential OAuth client secret into a distributed mobile app, browser bundle or URL. A public OAuth client uses PKCE and has no client secret. Store user tokens in appropriate secure storage and clear account-specific caches on disconnect.Treat document text and uploaded files as user content. Ask before sharing, exporting or sending text for cloud speech. Show permission failures, quota exhaustion and sync conflicts as actionable states. Keep a local edit until the server has acknowledged it; never replace a newer document after a conflict without user reconciliation.
Use a dedicated test account with disposable documents for write tests. An operator-issued app: test identity is isolated: it can only call GET /api/v1/me and GET /api/v1/voices, expires within 30 days and cannot exercise a user's library. It is not a general integration token or a substitute for OAuth consent.Keep Request-Id when reporting API failures. Exclude tokens, signed download URLs, uploaded bytes and document text from diagnostics. The examples use placeholders, not working credentials. Authenticated calls and device behavior must be tested with your own authorized test account.The reference was checked against the deployed OpenAPI description on 2026-10-26. The full description also includes organisation operations; this Regular Accounts edition omits those management routes.
The published OpenAPI still lists personal webhook registration. Current working-tree code instead rejects new personal receivers with 403 webhooks_moved; new receivers belong to teams/classes and are managed by an administrator in the organisation Developer tab. Existing personal receivers continue to receive events in that code. Deployment of this change and live runtime behavior were not verified here. Treat the registration reference as the published contract, not proof that new personal registration is available. The Team and Classroom editions describe the organisation workflow.