---
title: "Document Proof Pdf"
method: GET
path: "/api/document/{doc_id}/proof.pdf"
---

# Document Proof Pdf

`GET /api/document/{doc_id}/proof.pdf`

## 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/api/document/{doc_id}/proof.pdf`
- Auth: none declared

The same evidence package, rendered as a downloadable PDF (Pro).

ONE route declares both methods on purpose: two routes side by side on one
path do not coexist the way they read, because `_grant_head_to_get_routes()`
and Starlette's first-full-match ordering left the cheap HEAD unreachable
and a link-checker paid for the rendering half (measured 2026-09-16 on
`/sitemap-models-{n}.xml`).

Gated on tier: `public` is refused before any database read, because the
roadmap sells this artifact at Pro while the JSON proof stays open to a
signed-in caller.  A `pro` API KEY is already refused one layer down, in
`_enforce_dev_gate` inside `_rate_limit` - browser-tier keys do not spend
on programmatic surfaces - so this gate is what stops the *signed-in*
public caller, and it costs nothing to refuse.  The refusal splits 401/403
the way `_enforce_search_trial` does for the JSON sibling: no credential is
an identity problem (401), a credentialed free-tier caller is a tier
problem (403).  Telling a keyless client to upgrade teaches it the wrong
next move.

## Path parameters

- `doc_id` integer, required

## Query parameters

- `q` string, nullable

## Headers

- `authorization` string, nullable
- `x-api-key` string, nullable
- `x-license-key` string, nullable
- `x-principal` string, nullable

## Response `200`

Successful Response

## Other responses

- `422`: Validation Error

---

[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)
