REST API
October 2026 v1 migration
Update integrations written against the earlier v1 API.
October 2026 changes to v1
This release changed v1 itself, because few integrations depended on it yet. It did not add /api/v2. Clients written against the earlier v1 need these updates:
- Reference fields are named
subjectId,parentIdandtermId, and timestamps arecreatedAtandupdatedAt. Path parameters have matching names such as{taskId}and{setId}; the URLs are the same. cursortakes only the opaquenextCursorvalue from a previous page. A row id is rejected with 400invalid_query.- Date fields accept only strings. A number or boolean returns 400
invalid_request. - Unknown fields in a request body or query string return 400 that names the field. Before, they were ignored.
- An unknown or foreign
subjectIdonPOST /tasksreturns 400invalid_request, where it was 404. AfolderIdonPOST /notesthat is not one of the user's folders also returns 400. - A set, note or recording id in a request body that isn't the user's returns 400
invalid_requestwithdetails.fieldanddetails.reason(unknown-set,unknown-noteorunknown-recording), not 404. This coverssourceSetIdsandsourceNoteIdsonPOST /tests,noteIdonPOST /sets/generate, and astart_generationaction that names a recording onPOST /copilot/messages/{messageId}/actions. A 404 on those endpoints means the path's own resource is missing. - Copilot messages page with
cursorandnextCursor, notbeforeandnextBefore. Conversations use the same opaque cursor. GET /jobs/{jobId}andPOST /jobs/{jobId}/cancelcheck the job's kind against the key's scopes (see Jobs). Acopilot:usekey reads and cancels its copilot jobs and reads, applies and discards the generations they start. Atests:vieworfiles:viewkey reads the jobs of its domain. A key with no scope for a kind gets 403.POST /testsrequires a bodyrequestIdand creates no test when it is refused with 402 or 429. Before, a 402 left afailedtest.- Study set generation's
resulthassetIdandtermCount, notstudySetId. insert-endon a generation refuses a note that would pass 200,000 visible characters.- Terms, definitions, hints and teacher names have length caps, listed under study sets and subjects.
- A task's
typemust be one of the user's task types; an unknown one returns 400unknown-task-typeunless the request sendscreateType: true. Before, any text was stored as the type. - A task's
dueDateor recurrenceendsAtsent asYYYY-MM-DDis the start of that day in the user's time zone, not UTC midnight.