---
title: "Read Written Photos"
method: POST
path: "/student/drill/attempts/{attempt_id}/written/photos"
tags: ["daily-drill"]
---

# Read Written Photos

`POST /student/drill/attempts/{attempt_id}/written/photos`

## Request

- Base URL: `https://api.excellence-ai.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.excellence-ai.com/student/drill/attempts/{attempt_id}/written/photos`
- Auth: OAuth 2 (password, token URL `api/login`)

« À l'écrit » (EXC-1002): the photos of the sheet, read per question
number. Returns what was read (not whether it is right).

## Path parameters

- `attempt_id` string, required

## Request body

- DrillWrittenPhotosRequest
  - `photos` DrillWrittenPhoto[], required
    - `file_content` string, required: Base64 (JPEG downscaled by the app)
    - `content_type` string, required

## Response `200`

Successful Response

- DrillWrittenStateResponse
  - `attempt_id` string, required
  - `photo_count` integer, required
  - `readings` DrillWrittenReadingResponse[], required
    - `index` integer, required
    - `status` string, required
    - `transcript` string, required
    - `expr` string, nullable, required
    - `unsure` boolean
  - `unread` integer[], required

## Other responses

- `403`: Not authorized for this resource
- `404`: Resource not found
- `409`: Business rule violated
- `422`: Validation Error
- `502`: Upstream LLM returned unusable output

## Changes

> 55 revisions in range; 1 not diffed.

- **2026-10-15** `7925dd21e4d0`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/excellence-ai/apis/excellence-learning/changes/student/drill/attempts/:attempt_id/written/photos/post.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/379e4a57dee8?raw)
