---
title: "Get Class Appreciation"
method: GET
path: "/teacher/assignments/{assignment_id}/v2-class-appreciation"
tags: ["v2_evaluations"]
---

# Get Class Appreciation

`GET /teacher/assignments/{assignment_id}/v2-class-appreciation`

Class-wide narrative appreciation. Auto-generated on first visit
AFTER the assignment's due date passes; cached against the class-evals
ETag so subsequent visits short-circuit. `class_id` narrows it to one
class of the devoir, gated on that class's own due date (EXC-909);
without it, every class the teacher has on the devoir. Returns 404 with
an empty body when the assignment is unknown, the class is not one of
the teacher's on it, it is not yet overdue, or there are no sessions to
summarize — the frontend treats them all identically (empty state).
Mirrors the no-annotation return type of `get_class_evaluations` above
so the 304/404 short-circuits don't fight pyright.

## Path parameters

- `assignment_id` string, required

## Query parameters

- `class_id` string, nullable

## Response `200`

Successful Response

- ClassAppreciationResponse
  - `assignment_id` string, required
  - `text` string, required
  - `author_type` 'ai' | 'human', required
  - `generated_at` string, date-time, required

## Other responses

- `400` — Malformed identifier
- `403` — Not authorized for this resource
- `404` — Resource not found
- `422` — Validation Error
- `502` — Upstream LLM returned unusable output

## Changes

> 23 revisions in range; 1 not diffed.

- **2026-09-25** `a8ae0e0c0570` — 1 info
  - added the new optional `query` request parameter `class_id`

[Change history](https://skmtc.dev/excellence-ai/apis/excellence-learning/changes/teacher/assignments/:assignment_id/v2-class-appreciation/get.md)

---

[API](https://skmtc.dev/excellence-ai/apis/excellence-learning.md) · [All operations](https://skmtc.dev/excellence-ai/apis/excellence-learning/llms.txt) · [OpenAPI document](https://skmtc.dev/excellence-ai/apis/excellence-learning/revisions/a8ae0e0c0570?raw)
