---
title: "Create a layout"
method: POST
path: "/v1/layouts"
tags: ["layouts"]
---

# Create a layout

`POST /v1/layouts`

## Request

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

Create a multi-zone layout with a `name` and optional `resolution`, `zones`, `autoFullscreenForVideo`, `nodeId`, and `theme`. Setting `theme` to `{ source: "brand", mode?, radius? }` paints the layout using the workspace Brand Kit; omit it or set it to `null` for a plain canvas. Each zone can also carry a frame style (bare, card, accent, or glass), a corner radius in pixels, and a role of "logo" for a zone that shows the Brand Kit logo without needing its own content.

**Notes.**
- The 201 body is the row as written, not re-read from the database, so columns the create does not set (for example `lastSnapshotAt`) are absent rather than null. `GET` returns every column.
- The 201 body has no `usedByScreenCount`.

## Request body

- object
  - `name` string, required
  - `resolution` object: Canvas size in pixels. Default 1920 x 1080.
    - `w` number, required
    - `h` number, required
  - `zones` LayoutZone[]: The whole zone list. Default: one full-canvas zone named Main.
    - `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.
  - `autoFullscreenForVideo` boolean, nullable
  - `nodeId` string, nullable: Home location. Default: the caller's own location.
  - `theme` object, nullable: Paint the layout in the workspace Brand Kit. `null` = a plain canvas.
    - `source` 'brand', required
    - `mode` 'dark' | 'light'
    - `radius` number
    - `wash` 'corner' | 'none'

## Response `201`

Success.

- object
  - `data` object, required
    - `id` string, required: Layout id.
    - `spaceId` string, required
    - `name` string, required
    - `resolution` object, required: Design canvas size in pixels.
      - `w` number, required
      - `h` number, required
    - `zones` object[], required: Zones: geometry, bound content, frame, radius and role. `GET /v1/layouts/{id}/zones` returns the same list.
    - `autoFullscreenForVideo` boolean, nullable
    - `approvalState` 'draft' | 'pending' | 'approved' | 'rejected': Absent: the create does not set it (it is `draft`).
    - `approvedSnapshot` string, nullable
    - `nodeId` string, nullable
    - `importSourceId` string, nullable
    - `theme` unknown
    - `createdAt` string, required: ISO-8601 timestamp (UTC).
    - `updatedAt` string, required: ISO-8601 timestamp (UTC).
    - `deletedAt` string, nullable, required: ISO-8601 timestamp (UTC).

## Other responses

- `401`: Missing, expired or revoked bearer token.
- `403`: `not_shared`: zone content that is not usable at the layout's location.
- `422`: Missing name, invalid JSON, a bad theme or zone paint, zone content that does not exist or loops, or a location outside this workspace.
- `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/7c2741bcdb16?raw)
