---
title: "Restore a page to a prior version."
method: POST
path: "/v1/dashboards/{id}/pages/{pageId}/restore"
tags: ["dashboards"]
---

# Restore a page to a prior version.

`POST /v1/dashboards/{id}/pages/{pageId}/restore`

## Request

- Base URL: `http://localhost:8080`
- URL: `http://localhost:8080/v1/dashboards/{id}/pages/{pageId}/restore`
- Auth: one of:
  - API key in cookie `dvt_session`
  - HTTP bearer

Reverts the page's arrangement (layout) and metadata to the chosen revision. Restore is
a forward edit — a new revision is written and the page's version increments — so history
stays append-only. The promoted element coordinates are re-synced from the restored
layout; element content (panel JSON) is untouched, as element histories are independent.
A new dashboard revision is written so GET /v1/dashboards/{id} stays consistent.

## Query parameters

- `reason` string

## Request body

- RestoreRequest
  - `version` integer, required: The prior version to restore (from GET .../revisions).
  - `reason` string: Optional provenance note (the "why") recorded on the new revision the restore writes (DVT-1658). Max 280 characters.

## Response `200`

Page restored; returns the new page header.

- PageEnvelope
  - `data` Page, required: A single dashboard page header — identity and metadata plus the optimistic-concurrency version. Arrangement (layout) and membership live in the page's stored fields; this view is what page revision/restore operations return.
    - `pageId` string, uuid, required: Durable UUID primary key.
    - `slug` string, required: Readable, dashboard-scoped reference (the authored page id), e.g. "overview".
    - `dashboardId` string, uuid, required
    - `title` string
    - `kind` 'page' | 'modal' | 'popup' | 'drilldown', required
    - `isHidden` boolean, required
    - `position` integer, required: Ordering among sibling pages.
    - `version` integer, required
  - `meta` Meta, required: Response metadata.
    - `requestId` string, required: Correlates with the X-Request-Id header.
    - `total` integer: Item count, present on collection responses.
    - `nextCursor` string, nullable: Opaque keyset-pagination cursor, present on paginated responses (e.g. GET /v1/dashboards) when more rows exist beyond this page. Pass it back as the `cursor` query param to fetch the next page; absent or null on the last page.
    - `roleResolveDegraded` boolean: Snowflake mode only (DVT-2260), on GET /v1/dashboards: present and true when the caller's live Snowflake role resolution failed or was unavailable — role-shared dashboards may be missing from this page. Omitted (not merely false) whenever resolution succeeded or the role-share arm does not apply (off snowflake mode, an org admin/owner, or off the ingress listener).

## Other responses

- `400`: Malformed request.
- `401`: Missing, invalid, or expired session.
- `404`: Resource does not exist.
- `422`: The spec failed JSON Schema validation. `fields` lists each violation.

---

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