---
title: "Get Student Evaluation"
method: GET
path: "/sessions/{session_id}/exercises/{exercise_id}/v2-evaluation"
tags: ["v2_evaluations"]
---

# Get Student Evaluation

`GET /sessions/{session_id}/exercises/{exercise_id}/v2-evaluation`

## Path parameters

- `session_id` string, required
- `exercise_id` string, required

## Response `200`

Successful Response

- StudentEvaluationResponse — Returned for the student v2-evaluation GET. `latest_evaluation` is optional — the rubric still travels back even when the student hasn't submitted yet, so frontend surfaces can compute assignment-level totals over the full set of rubric'd exercises. Multimodal attempts additionally expose the submitted photos (bounding boxes inside the evaluation reference them by index), the grading status, and — V3 variant — the LLM transcription of the copy.
  - `session_id` string, required
  - `exercise_id` string, required
  - `submission_attempt_index` integer, nullable, required
  - `latest_evaluation` RubricEvaluationResponse, required
    - `rubric_id` string, required
    - `author_type` 'ai' | 'human', required
    - `author_model` string, nullable
    - `feedback` string, required
    - `questions` RubricQuestionEvaluation[], required
      - `skill_outcomes` SkillOutcome[], required
        - `savoir_faire_id` string, required
        - `outcome` 'correct' | 'partial' | 'wrong' | 'unanswered', required
        - `note` string, required
        - `evidence` EvidenceSpan[], required
          - `excerpt` string, required
          - `span` TextSpan, required — Resolved char offsets into a `SubmissionAttempt.solution_blocks[i].transcribed_text`. Backend computes start/end at write time.
            - `block_id` string, required
            - `start` integer, required
            - `end` integer, required
      - `criterion_outcomes` CriterionOutcome[], required
        - `criterion_index` integer, required
        - `outcome` 'correct' | 'partial' | 'wrong' | 'unanswered', required
        - `note` string, required
        - `evidence` EvidenceSpan[], required
          - `excerpt` string, required
          - `span` TextSpan, required — Resolved char offsets into a `SubmissionAttempt.solution_blocks[i].transcribed_text`. Backend computes start/end at write time.
            - `block_id` string, required
            - `start` integer, required
            - `end` integer, required
      - `errors` FlaggedError[], required
        - `description` string, required
        - `evidence` EvidenceSpan[], required
          - `excerpt` string, required
          - `span` TextSpan, required — Resolved char offsets into a `SubmissionAttempt.solution_blocks[i].transcribed_text`. Backend computes start/end at write time.
            - `block_id` string, required
            - `start` integer, required
            - `end` integer, required
        - `categories` ErrorCategory[], nullable
    - `question_zones` QuestionZone[], required
      - `question_indexes` integer[], required
      - `boxes` PhotoBBox[], required
        - `photo_index` integer, required
        - `x` number, required
        - `y` number, required
        - `width` number, required
        - `height` number, required
    - `computed_grade` number, required
    - `max_grade` number, required
    - `evaluated_at` string, date-time, required
  - `rubric` RubricResponse, required — Minimal: drops `exercise_id` (lives in the URL) and `exercise_collection` / `created_at` (frontend doesn't read them today). `author` is flattened to a Literal to avoid leaking prompt ids / user ids.
    - `id` string, required
    - `questions` RubricQuestion[], required
      - `question_text` string, required
      - `skills` SkillRef[], required
        - `savoir_faire_id` string, required
        - `name` string, required
        - `description` string, required
      - `criteria` string[], required
    - `author_type` 'ai' | 'human', required
  - `submission_photo_urls` string[]
  - `grading_status` 'processing' | 'graded' | 'error' | 'rejected', nullable
  - `transcription` string, nullable

## Other responses

- `400` — Malformed identifier
- `403` — Not authorized for this resource
- `404` — Resource not found
- `422` — Validation Error

## Changes

> 15 revisions in range; 1 not diffed.

- **2026-09-07** `0ccba2913cca` — 1 info
  - added the optional property `latest_evaluation/anyOf[subschema #1: RubricEvaluationResponse]/author_model` to the response with the `200` status
- **2026-09-03** `ef67479ed898` — 1 info
  - added the optional property `latest_evaluation/anyOf[subschema #1: RubricEvaluationResponse]/questions/items/errors/items/categories` to the response with the `200` status

[Change history](https://skmtc.dev/excellence-ai/apis/excellence-learning/changes/sessions/:session_id/exercises/:exercise_id/v2-evaluation/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/86793aa823ea?raw)
