---
title: "Cancel Classes"
method: POST
path: "/organizations/{org_id}/classes/cancel"
tags: ["organizations", "organizations"]
---

# Cancel Classes

`POST /organizations/{org_id}/classes/cancel`

Call off classes: a whole school day, one section's day, or one class.

WHY THIS EXISTS. There was no way to say "no class today". A coordinator's
only tools were deleting the series, which is permanent and loses the
timetable, or typing an announcement, which tells the students and tells the
PRODUCT nothing. TESI suspended classes on 2026-09-15 and the announcement
was the only trace: the schedule still listed thirteen sections, thirteen
rooms sat waiting, the prescale evaluator still raised the floor for them,
and a student who opened the app saw a normal class day.

HOW IT WORKS, and why there is no new table. Setting the room's status to
"cancelled" is enough on its own, because of two things that were already
true:

  * every "is this room live" query filters status.in_(("scheduled",
    "active")), so a cancelled room drops out of all of them at once —
    including the reminder sweep, which is requirement one;
  * _existing_room() in group_session_service matches on (org, group,
    instant) and does NOT look at status, so the generator sees the
    cancelled room, considers the occurrence done, and will not build
    another one over the top.

THE HORIZON, and what used to be out of reach. Rooms exist only inside the
generator's 8-day window (LOOK_AHEAD_DAYS), so for a while this could only
mark what had already been built — a class further out, or any class the
coverage calendar drew from the timetable alone, had no row to set a status
on and so quietly could not be called off at all. `occurrence_at` closes
that: the room is built in order to be cancelled. It is the same move
`bind_occurrence` already makes when a teacher plans a future class, and it
is safe for the same reason cancelling works at all — `_existing_room()`
ignores status, so the generator will not lay a live room over the top.

Notification is the teacher's, by Nancy's call: this says nothing to anyone.
It removes the reminder and puts a note on the door.

## Path parameters

- `org_id` string, required

## Headers

- `authorization` string, nullable

## Request body

- object

## Response `200`

Successful Response

- unknown

## Other responses

- `422` — Validation Error

## Changes

> 25 revisions in range; 1 not diffed.

- **2026-09-16** `f2ed591742c9` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/fluentea/apis/aurqa-language-learning-platform-refactored/changes/organizations/:org_id/classes/cancel/post.md)

---

[API](https://skmtc.dev/fluentea/apis/aurqa-language-learning-platform-refactored.md) · [All operations](https://skmtc.dev/fluentea/apis/aurqa-language-learning-platform-refactored/llms.txt) · [OpenAPI document](https://skmtc.dev/fluentea/apis/aurqa-language-learning-platform-refactored/revisions/be75c0eba493?raw)
