---
title: "Save (replace) the caller's widget Home layout."
method: PUT
path: "/v1/me/home-layout"
tags: ["dashboards"]
---

# Save (replace) the caller's widget Home layout.

`PUT /v1/me/home-layout`

## Request

- Base URL: `http://localhost:8080`
- URL: `http://localhost:8080/v1/me/home-layout`
- Auth: one of:
  - API key in cookie `dvt_session`
  - HTTP bearer

Upserts the caller's layout. Body is at most 32 KiB; `version` must be 1; 1-64
widgets with unique ids; unknown fields are rejected (a response-only `updatedAt`
is ignored). The normalized document is stored and returned.

## Request body

- HomeLayout
  - `version` 1, required
  - `widgets` HomeLayoutWidget[], required
    - `id` string, required: Unique within the layout.
    - `kind` 'pin' | 'favorites' | 'recent' | 'popular' | 'mine' | 'all' | 'activity', required
    - `visible` boolean, required
    - `order` integer, required
    - `w` integer, required: Grid columns (of 12).
    - `h` integer, required: Rows; 0 = auto.
  - `updatedAt` string, date-time: Response only; ignored on input.

## Response `200`

The stored layout.

- HomeLayoutStoredEnvelope
  - `data` HomeLayout, required
    - `version` 1, required
    - `widgets` HomeLayoutWidget[], required
      - `id` string, required: Unique within the layout.
      - `kind` 'pin' | 'favorites' | 'recent' | 'popular' | 'mine' | 'all' | 'activity', required
      - `visible` boolean, required
      - `order` integer, required
      - `w` integer, required: Grid columns (of 12).
      - `h` integer, required: Rows; 0 = auto.
    - `updatedAt` string, date-time: Response only; ignored on input.
  - `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.

---

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