---
title: "Confirm reads from a shelf scan"
method: POST
path: "/api/photo/shelf/reads"
tags: ["photo"]
---

# Confirm reads from a shelf scan

`POST /api/photo/shelf/reads`

## Request

- Base URL: `https://leafle.org` (the document declares no server; this is the origin it was published from)
- URL: `https://leafle.org/api/photo/shelf/reads`
- Auth: HTTP bearer

**Access: write token.**

Send the scan's books and the reader's answer about which they have read. Matching owned books are upgraded to reading history; the response lists the upgraded titles.

## Request body

- ShelfReadsIn
  - `answer` string, required
  - `books` ShelfBookRef[]
    - `title` string, required
    - `author` string
  - `reader_id` integer, nullable

## Response `200`

Successful Response

- ShelfReadsResult: POST /api/photo/shelf/reads — which owned books were upgraded to reads.
  - `upgraded` integer, required
  - `titles` string[], required

## Other responses

- `401`: Missing or unusable credential.
- `403`: Insufficient token scope or the reader is outside your account.
- `422`: Validation Error
- `429`: Request or usage limit reached. Wait before retrying.
- `503`: Capacity is unavailable or the service is restarting. Honour Retry-After when present.

---

[API](https://skmtc.dev/leafle/apis/leafle-api.md) · [All operations](https://skmtc.dev/leafle/apis/leafle-api/llms.txt) · [OpenAPI document](https://skmtc.dev/leafle/apis/leafle-api/revisions/f2e56cb74495?raw)
