---
title: "Source Page"
method: GET
path: "/source/{source_id}"
---

# Source Page

`GET /source/{source_id}`

## Request

- Base URL: `https://www.conceptio.app` (the document declares no server; this is the origin it was published from)
- URL: `https://www.conceptio.app/source/{source_id}`
- Auth: none declared

Source catalog page — page 1 plus keyset pagination, BOTH ways.

`before` + `before_id` are the (added_at, id) cursor of the last doc on the
PREVIOUS page: `where source = ? and (added_at, id) < (?, ?)` — O(page)
reads per page, never an offset walk, and the page URLs stay permanent as
new docs land (they only shift the newest boundary, never existing pages).
Deep pages are discovered via rel=next/prev head links — NOT enumerated in
the sitemap (the plan's pagination contract, CONCEPTIO_SEO Phase 2).

The walk itself is capped at SOURCE_MAX_PAGE — 10 pages, the 200 most
recent docs per source — and the depth rides in the cursor as `page=`,
checked BEFORE the corpus opens: a depth-less cursor, a depth without a
cursor, anything past the cap, or a `before=` walk claiming to be the head
all answer 404 — the same absence a cursor past the end gets, describing
nothing about the ceiling it hit. rel=next stops at the cap (the renderer
shares SOURCE_MAX_PAGE, so no served page links past it). Why the ceiling
is server-side: the unbounded chain measured ~16% of all traffic
(access.log, 24 h, 198,635 requests), every cursor URL a unique edge MISS
into origin corpus reads, buying nothing under `noindex`.

`after` + `after_id` are the DOWN-walk's mirror: the FIRST doc on the page
the reader is looking at, so the page served ENDS just above it. That is a
distinct query — strictly NEWER than the boundary, walked in the INVERSE
ordering so the slice keeps the NEAREST rows rather than a far-away tail —
and it is what the `rel=prev` link must point at. (Before 2026-09-13 the
prev link reused `?before=docs[0]`, which asks for rows OLDER than this
page's newest doc: it returned the page the reader was already on minus its
newest row, 19 of 20 rows repeated, and page 1 was unreachable going back.)

## Path parameters

- `source_id` string, required

## Query parameters

- `before` string, nullable
- `before_id` integer, nullable
- `after` string, nullable
- `after_id` integer, nullable
- `page` integer, nullable

## Response `200`

Successful Response

## Other responses

- `422`: Validation Error

## Changes

- **2026-10-19** `eb73efec13b4`: 1 info
  - added the new optional `query` request parameter `page`

[Operation history](https://skmtc.dev/conceptio/apis/conceptio-open-knowledge-api/changes/source/:source_id/get.md)

---

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