---
title: "Update Page"
method: PATCH
path: "/api/v1/pages/{page_id}"
tags: ["pages"]
---

# Update Page

`PATCH /api/v1/pages/{page_id}`

Merge-update a page's sheet_number / sheet_title (e.g. user rename).

Only the fields present in the PATCH body are written, each stamped
source='user' so a later Step-3 auto re-run won't overwrite the edit.

## Path parameters

- `page_id` string, uuid, required

## Request body

- UpdatePageRequest — Partial update of a page's display metadata (merge semantics). Only the fields PRESENT in the request body are written; omitted fields are left untouched (the server reads `model_fields_set`). A field set to `null` clears that column. Each field that is provided is marked `source='user'` so a later auto re-run (Step-3 sheet naming, ADR-0060) never overwrites a manual edit. Number and title are independent — editing the title leaves an extracted number intact.
  - `sheet_number` string, nullable
  - `sheet_title` string, nullable

## Response `200`

Successful Response

- PageDetail — Page + derived fields for the editor. `current_extraction_id` is `None` if the page hasn't been parsed yet; `text_element_count` is the number of text elements produced by that current extraction (zero if unparsed).
  - `id` string, uuid, required
  - `drawing_id` string, uuid, required
  - `page_number` integer, required
  - `sheet_number` string, nullable
  - `sheet_title` string, nullable
  - `width` string, required
  - `height` string, required
  - `view_x0` number, nullable, required
  - `view_y0` number, nullable, required
  - `view_x1` number, nullable, required
  - `view_y1` number, nullable, required
  - `user_unit` number, required
  - `rotate` integer, required
  - `scale` string, nullable
  - `scale_ratio` string, nullable
  - `calibration` CalibrationDataOutput — User-entered calibration tuple, the shape stored in pages.calibration JSONB.
    - `drawing_distance` string, required
    - `drawing_units` 'in' | 'ft' | 'mm' | 'cm' | 'm', required
    - `actual_distance` string, required
    - `actual_units` 'in' | 'ft' | 'mm' | 'cm' | 'm', required
    - `source` 'standard' | 'manual' | 'calibrate', required
    - `description` string, required
  - `scale_source` 'autoset' | 'user' | 'import', nullable
  - `synthetic` boolean
  - `scale_suggestion` PageScaleSuggestion — What the autoset detector read off this sheet, and how much we trust it. Present whenever the current `page_scale_results` row carries exactly one distinct real (non-NTS, ratio-bearing) candidate. Absent when the sheet states no scale AND when it states several — presenting one of several as "the sheet's scale" would be worse than showing nothing (RUD-315). `ratio` is ADR-0024 canonical form (real inches per PDF point). `measured_ratio` is populated only for `contradicted`, and carries whichever evidence disagreed with the notation: the mean implied ratio of the persisted witnesses when geometry contradicted it (ADR-0144), or the VLM's independently read notation when the two readers disagreed (RUD-353). Geometry takes precedence — a witness-backed contradiction always reports the witnesses.
    - `state` 'verified' | 'contradicted' | 'unverified', required
    - `notation` string, required
    - `ratio` string, required
    - `measured_ratio` string, nullable
  - `scale_read_count` integer
  - `has_takeoff` boolean, required
  - `has_note` boolean, required
  - `markup_count` integer, required
  - `open_markup_count` integer, required
  - `current_extraction_id` string, uuid, nullable
  - `sheet_number_source` 'vlm' | 'user', nullable
  - `sheet_title_source` 'vlm' | 'user', nullable
  - `text_element_count` integer

## Other responses

- `4XX` — Client Error
- `5XX` — Server Error

---

[API](https://skmtc.dev/rudus/apis/rudus-api.md) · [All operations](https://skmtc.dev/rudus/apis/rudus-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/rudus/rudus-api/revisions/f149124a4d80/schema)
