---
title: "LEARN ledge-reads catalog (PG-backed, JSON fallback)"
method: GET
path: "/api/learn/ledge-reads"
tags: ["Education"]
---

# LEARN ledge-reads catalog (PG-backed, JSON fallback)

`GET /api/learn/ledge-reads`

## Request

- Base URL: `https://www.oxfordledge.com` (the document declares no server; this is the origin it was published from)
- URL: `https://www.oxfordledge.com/api/learn/ledge-reads`
- Auth: none declared

Return the recommended-reading catalog as `{books: [...]}`.

Mirrors `static/data/recommended-reading.json` shape so the
pre-PR0 frontend `fetch('/static/data/recommended-reading.json')`
callers can swap fetch URLs without rewriting renderers.

Falls back to the JSON file when PG returns empty.

## Response `200`

Successful Response

- LearnDataLedgeReadsResponse: `GET /api/learn/ledge-reads` response. Top-level shape matches `static/data/recommended-reading.json` — `books[]` is required. Each book dict carries the catalog fields (`isbn`, `title`, `author`, `year`, `category`, `level`, `goodreads`, `oneLiner`, `summary`, `tags`, `asin`) plus the v94 editorial additions (`editorial_note`, `pairs_with`, `pairs_with_path_id`, `is_editors_desk`) when PG is the source.
  - `books` unknown[], required
    - unknown

## Other responses

- `500`: Internal Server Error

---

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