---
title: "Replace a layout's zones"
method: PUT
path: "/v1/layouts/{id}/zones"
tags: ["layouts"]
---

# Replace a layout's zones

`PUT /v1/layouts/{id}/zones`

## Request

- Base URL: `https://api.brixsignage.com`
- URL: `https://api.brixsignage.com/v1/layouts/{id}/zones`
- Auth: HTTP bearer

Replace a layout's entire set of zones in one call. Send every zone you want to keep, including each zone's frame, radius, and role on a themed layout; a zone sent without those becomes a plain, unframed zone.

Send `zones` to replace the whole list, or `zoneIds` (every current zone id, once) to reorder it.

**Notes.**
- `zones` is stored as sent: keys the API does not know are kept and returned.

## Path parameters

- `id` string, required

## Request body

- union
  - object
    - `zones` LayoutZone[], required: The new zone list, stored as sent.
      - `id` string, required
      - `name` string, required
      - `x` number, required: Left edge, in layout pixels.
      - `y` number, required
      - `w` number, required
      - `h` number, required
      - `locked` boolean, required
      - `contentName` string: Label of the bound content. Absent on the zone a new layout starts with.
      - `content` object, nullable: What the zone plays: a media file, playlist, schedule, app, web link or creative (`canvas`).
        - `kind` 'media' | 'playlist' | 'schedule' | 'app' | 'link' | 'canvas', required
        - `id` string, required
        - `name` string, required
      - `zIndex` number
      - `ownerScope` 'workspace' | 'org_unit' | 'location'
      - `ownerNodeId` string, nullable
      - `frame` 'bare' | 'card' | 'accent' | 'glass': Paint style on a themed layout.
      - `radius` number: Corner radius in layout pixels.
      - `role` 'logo': `logo`: the zone shows the Brand Kit logo instead of content.
  - object
    - `zoneIds` string[], required: Every current zone id, in the new paint order.

## Response `200`

Success.

- object
  - `data` object, required
    - `id` string, required: Layout id.
    - `zones` LayoutZone[], required: Every zone, in paint order.
      - `id` string, required
      - `name` string, required
      - `x` number, required: Left edge, in layout pixels.
      - `y` number, required
      - `w` number, required
      - `h` number, required
      - `locked` boolean, required
      - `contentName` string: Label of the bound content. Absent on the zone a new layout starts with.
      - `content` object, nullable: What the zone plays: a media file, playlist, schedule, app, web link or creative (`canvas`).
        - `kind` 'media' | 'playlist' | 'schedule' | 'app' | 'link' | 'canvas', required
        - `id` string, required
        - `name` string, required
      - `zIndex` number
      - `ownerScope` 'workspace' | 'org_unit' | 'location'
      - `ownerNodeId` string, nullable
      - `frame` 'bare' | 'card' | 'accent' | 'glass': Paint style on a themed layout.
      - `radius` number: Corner radius in layout pixels.
      - `role` 'logo': `logo`: the zone shows the Brand Kit logo instead of content.

## Other responses

- `401`: Missing, expired or revoked bearer token.
- `403`: `not_shared`: the content is not usable at the layout's location.
- `404`: No such layout (or zone) in this workspace.
- `409`: `conflict`: the layout changed during the write three times running; retry.
- `422`: `zoneIds` that are not every zone exactly once, neither `zones` nor `zoneIds`, or a bad or looping zone.
- `5XX`: Server error. The body carries a `requestId` to quote to support.

---

[API](https://skmtc.dev/brixsignage/apis/brix-api.md) · [All operations](https://skmtc.dev/brixsignage/apis/brix-api/llms.txt) · [OpenAPI document](https://skmtc.dev/brixsignage/apis/brix-api/revisions/02fd3665dc7d?raw)
