Layouts API

Layouts endpoints in the Brix REST API: 12 operations (GET, POST, PATCH, DELETE, PUT), with auth, permissions and curl examples.

View as Markdown

Base URL https://api.brixsignage.com. Send Authorization: Bearer $BRIX_API_KEY unless an operation says No auth. The permission chip names what the key must hold. See Authentication and scopes, Errors and rate limits and Pagination.

GET/v1/layouts

Bearer token layout.view

List the workspace's multi-zone layouts, including each layout's name, resolution, and zone count.

ParameterInTypeRequiredDescription
limitqueryintegernoPage size. Omit to get every row; pass it to page by `cursor`.
cursorquerystringnoThe `nextCursor` of the previous page.
countquery"1"noWith `limit`: also return `total`, the number of matching rows.
usableAtquerystringnoLocation id: only rows usable at that location (homed there, at the workspace root, or shared to it).
curl "https://api.brixsignage.com/v1/layouts" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200 Success.

FieldTypeDescription
dataarray of Layout
data[].idstringLayout id.
data[].spaceIdstring
data[].namestring
data[].resolutionobjectDesign canvas size in pixels.
data[].resolution.wnumber
data[].resolution.hnumber
data[].zonesarray of objectZones: geometry, bound content, frame, radius and role. `GET /v1/layouts/{id}/zones` returns the same list.
data[].autoFullscreenForVideoboolean | null
data[].approvalState"draft" | "pending" | "approved" | "rejected"Review state. Editing an approved row returns it to `draft`.
data[].approvedSnapshotstring | nullJSON TEXT of the last approved version (not parsed).
data[].nodeIdstring | null
data[].importSourceIdstring | null
data[].themeany | nullBrand Kit look (`{ source: "brand", mode?, radius? }`), or null for a bare canvas.
data[].createdAtstringISO-8601 timestamp (UTC).
data[].updatedAtstringISO-8601 timestamp (UTC).
data[].deletedAtstring | nullAlways null on these reads: deleted rows are not listed.
data[].usedByScreenCountintegerScreens showing this layout now, directly or through a playlist or schedule.
nextCursorstring | nullPresent when `?limit` was passed. Send it back as `?cursor=` for the next page; null on the last page.
totalintegerTotal matching rows, when the route computes it.

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 403 The token lacks the permission this operation needs (see `x-brix-permission`).

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 5XX Server error. The body carries a `requestId` to quote to support.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

POST/v1/layouts

Bearer token layout.create

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 application/json

FieldTypeRequiredDescription
namestringyes
resolutionobjectnoCanvas size in pixels. Default 1920 x 1080.
resolution.wnumberyes
resolution.hnumberyes
zonesarray of LayoutZonenoThe whole zone list. Default: one full-canvas zone named Main.
zones[].idstringyes
zones[].namestringyes
zones[].xnumberyesLeft edge, in layout pixels.
zones[].ynumberyes
zones[].wnumberyes
zones[].hnumberyes
zones[].lockedbooleanyes
zones[].contentNamestringnoLabel of the bound content. Absent on the zone a new layout starts with.
zones[].contentobject | nullnoWhat the zone plays: a media file, playlist, schedule, app, web link or creative (`canvas`).
zones[].zIndexnumberno
zones[].ownerScope"workspace" | "org_unit" | "location"no
zones[].ownerNodeIdstring | nullno
zones[].frame"bare" | "card" | "accent" | "glass"noPaint style on a themed layout.
zones[].radiusnumbernoCorner radius in layout pixels.
zones[].role"logo"no`logo`: the zone shows the Brand Kit logo instead of content.
autoFullscreenForVideoboolean | nullno
nodeIdstring | nullnoHome location. Default: the caller's own location.
themeobject | nullno
curl -X POST "https://api.brixsignage.com/v1/layouts" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 201 Success.

FieldTypeDescription
dataobject
data.idstringLayout id.
data.spaceIdstring
data.namestring
data.resolutionobjectDesign canvas size in pixels.
data.resolution.wnumber
data.resolution.hnumber
data.zonesarray of objectZones: geometry, bound content, frame, radius and role. `GET /v1/layouts/{id}/zones` returns the same list.
data.autoFullscreenForVideoboolean | null
data.approvalState"draft" | "pending" | "approved" | "rejected"Absent: the create does not set it (it is `draft`).
data.approvedSnapshotstring | null
data.nodeIdstring | null
data.importSourceIdstring | null
data.themeany | null
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).
data.deletedAtstring | nullAlways null on these reads: deleted rows are not listed.

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 403 `not_shared`: zone content that is not usable at the layout's location.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 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.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 5XX Server error. The body carries a `requestId` to quote to support.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

GET/v1/layouts/{id}

Bearer token layout.view

Retrieve one layout, including its zone geometry with each zone's content assignment and frame, radius, and role styling, its theme (the Brand Kit look, or null), and its video-fullscreen behaviour.

ParameterInTypeRequiredDescription
idpathstringyesLayout id.
curl "https://api.brixsignage.com/v1/layouts/{id}" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200 Success.

FieldTypeDescription
dataobject
data.idstringLayout id.
data.spaceIdstring
data.namestring
data.resolutionobjectDesign canvas size in pixels.
data.resolution.wnumber
data.resolution.hnumber
data.zonesarray of objectZones: geometry, bound content, frame, radius and role. `GET /v1/layouts/{id}/zones` returns the same list.
data.autoFullscreenForVideoboolean | null
data.approvalState"draft" | "pending" | "approved" | "rejected"Review state. Editing an approved row returns it to `draft`.
data.approvedSnapshotstring | nullJSON TEXT of the last approved version (not parsed).
data.nodeIdstring | null
data.importSourceIdstring | null
data.themeany | nullBrand Kit look (`{ source: "brand", mode?, radius? }`), or null for a bare canvas.
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).
data.deletedAtstring | nullAlways null on these reads: deleted rows are not listed.
data.usedByScreenCountintegerScreens showing this layout now, directly or through a playlist or schedule.
data.requiresApprovalbooleanThe home location requires approval before content airs.

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 403 The token lacks the permission this operation needs (see `x-brix-permission`).

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 404 No such layout in this workspace.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 5XX Server error. The body carries a `requestId` to quote to support.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

PATCH/v1/layouts/{id}

Bearer token layout.edit

Edit a layout's name, resolution, zones, autoFullscreenForVideo, node, or theme. Setting theme to { source: "brand", mode?, radius? } turns the Brand Kit look on, and null turns it off. Zones accept a frame style (bare, card, accent, or glass), a radius, and a role of "logo". An invalid theme, or an unrecognized frame or role, returns 422. **Notes.** - The response is the stored row: it has no usedByScreenCount or requiresApproval (GET has them).

ParameterInTypeRequiredDescription
idpathstringyesLayout id.

Request body application/json

FieldTypeRequiredDescription
namestringno
resolutionobjectnoCanvas size in pixels. Default 1920 x 1080.
resolution.wnumberyes
resolution.hnumberyes
zonesarray of LayoutZonenoThe whole zone list. Default: one full-canvas zone named Main.
zones[].idstringyes
zones[].namestringyes
zones[].xnumberyesLeft edge, in layout pixels.
zones[].ynumberyes
zones[].wnumberyes
zones[].hnumberyes
zones[].lockedbooleanyes
zones[].contentNamestringnoLabel of the bound content. Absent on the zone a new layout starts with.
zones[].contentobject | nullnoWhat the zone plays: a media file, playlist, schedule, app, web link or creative (`canvas`).
zones[].zIndexnumberno
zones[].ownerScope"workspace" | "org_unit" | "location"no
zones[].ownerNodeIdstring | nullno
zones[].frame"bare" | "card" | "accent" | "glass"noPaint style on a themed layout.
zones[].radiusnumbernoCorner radius in layout pixels.
zones[].role"logo"no`logo`: the zone shows the Brand Kit logo instead of content.
autoFullscreenForVideoboolean | nullno
nodeIdstring | nullnoHome location. Default: the caller's own location.
themeobject | nullno
baseUpdatedAtstringnoOptimistic concurrency: the `updatedAt` you read. A stale value is refused with 409 `conflict` and the `current` row.
curl -X PATCH "https://api.brixsignage.com/v1/layouts/{id}" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200 Success.

FieldTypeDescription
dataobject
data.idstringLayout id.
data.spaceIdstring
data.namestring
data.resolutionobjectDesign canvas size in pixels.
data.resolution.wnumber
data.resolution.hnumber
data.zonesarray of objectZones: geometry, bound content, frame, radius and role. `GET /v1/layouts/{id}/zones` returns the same list.
data.autoFullscreenForVideoboolean | null
data.approvalState"draft" | "pending" | "approved" | "rejected"Review state. Editing an approved row returns it to `draft`.
data.approvedSnapshotstring | nullJSON TEXT of the last approved version (not parsed).
data.nodeIdstring | null
data.importSourceIdstring | null
data.themeany | nullBrand Kit look (`{ source: "brand", mode?, radius? }`), or null for a bare canvas.
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).
data.deletedAtstring | nullAlways null on these reads: deleted rows are not listed.

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 403 Moving it to a location where you lack layout.edit, or zone content that is not usable there (`not_shared`).

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 404 No such layout in this workspace.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 409 `conflict`: the row changed since `baseUpdatedAt`; the body carries `current`.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 422 Invalid JSON, a bad theme or zone paint, zone content that does not exist or loops back into this layout.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 5XX Server error. The body carries a `requestId` to quote to support.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

DELETE/v1/layouts/{id}

Bearer token layout.delete

Delete a layout. This fails with 409 content_shared if the layout is actively shared into other spaces; pass ?force=true to delete it anyway.

ParameterInTypeRequiredDescription
idpathstringyesLayout id.
forcequery"true"noDelete even when it is shared into other places; the shares go with it.
curl -X DELETE "https://api.brixsignage.com/v1/layouts/{id}" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200 Success.

FieldTypeDescription
dataobject
data.idstring
data.deletedtrue
data.sharesRemovedintegerShares removed with it.

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 403 The token lacks the permission this operation needs (see `x-brix-permission`).

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 404 No such layout in this workspace.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 409 `content_shared`: it is shared into other places; `shareCount`, `crossSpaceShares`, `contentShares` say where. Repeat with `?force=true` to delete it and those shares.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 5XX Server error. The body carries a `requestId` to quote to support.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

POST/v1/layouts/{id}/restore

Bearer token layout.delete

Restore a deleted layout so it returns to the layout library.

ParameterInTypeRequiredDescription
idpathstringyesLayout id.
curl -X POST "https://api.brixsignage.com/v1/layouts/{id}/restore" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200 Success.

FieldTypeDescription
dataobject
data.idstring
data.restoredtrue

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 403 The token lacks the permission this operation needs (see `x-brix-permission`).

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 404 No such layout in this workspace, or it was purged.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 409 `not_deleted`: the layout is not in the recycle bin.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 5XX Server error. The body carries a `requestId` to quote to support.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

GET/v1/layouts/{id}/thumbnail

Bearer token layout.view

Retrieve a preview image of a layout, showing each zone at its real position filled with a still of its content. The same image is used everywhere the layout is previewed. Add ?fresh=1 to regenerate it after an edit.

ParameterInTypeRequiredDescription
idpathstringyesLayout id.
freshquery"1"noSkip the cached image and draw it again.
curl "https://api.brixsignage.com/v1/layouts/{id}/thumbnail" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 403 The token lacks the permission this operation needs (see `x-brix-permission`).

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 404 No such layout in this workspace.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 5XX Server error. The body carries a `requestId` to quote to support.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

GET/v1/layouts/{id}/zones

Bearer token layout.view

List a layout's zones, including the content attached to each one.

ParameterInTypeRequiredDescription
idpathstringyesLayout id.
curl "https://api.brixsignage.com/v1/layouts/{id}/zones" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200 Success.

FieldTypeDescription
dataarray of LayoutZone
data[].idstring
data[].namestring
data[].xnumberLeft edge, in layout pixels.
data[].ynumber
data[].wnumber
data[].hnumber
data[].lockedboolean
data[].contentNamestringLabel of the bound content. Absent on the zone a new layout starts with.
data[].contentobject | nullWhat the zone plays: a media file, playlist, schedule, app, web link or creative (`canvas`).
data[].zIndexnumber
data[].ownerScope"workspace" | "org_unit" | "location"
data[].ownerNodeIdstring | null
data[].frame"bare" | "card" | "accent" | "glass"Paint style on a themed layout.
data[].radiusnumberCorner radius in layout pixels.
data[].role"logo"`logo`: the zone shows the Brand Kit logo instead of content.

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 403 The token lacks the permission this operation needs (see `x-brix-permission`).

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 404 No such layout in this workspace.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 5XX Server error. The body carries a `requestId` to quote to support.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

POST/v1/layouts/{id}/zones

Bearer token layout.edit

Add one zone to a layout, specifying its geometry, the content attached to it, and, on a themed layout, its frame (bare, card, accent, or glass), radius, and role. A zone with role "logo" does not need content of its own. **Notes.** - Editing zones returns an approved layout to draft where approval is required.

ParameterInTypeRequiredDescription
idpathstringyesLayout id.

Request body application/json

FieldTypeRequiredDescription
namestringnoDefault `Zone <n>`.
xnumbernoDefault 0.
ynumbernoDefault 0.
wnumbernoDefault 480.
hnumbernoDefault 270.
lockedbooleanno
contentNamestringno
contentobject | nullnoWhat the zone plays. It must exist in this workspace, be usable at the layout's location, and not contain this layout.
ownerScope"workspace" | "org_unit" | "location"no
ownerNodeIdstring | nullno
frame"bare" | "card" | "accent" | "glass"no
radiusnumberno
role"logo"no
curl -X POST "https://api.brixsignage.com/v1/layouts/{id}/zones" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 201 Success.

FieldTypeDescription
dataobject
data.idstringLayout id.
data.zonesarray of LayoutZoneEvery zone, in paint order.
data.zones[].idstring
data.zones[].namestring
data.zones[].xnumberLeft edge, in layout pixels.
data.zones[].ynumber
data.zones[].wnumber
data.zones[].hnumber
data.zones[].lockedboolean
data.zones[].contentNamestringLabel of the bound content. Absent on the zone a new layout starts with.
data.zones[].contentobject | nullWhat the zone plays: a media file, playlist, schedule, app, web link or creative (`canvas`).
data.zones[].zIndexnumber
data.zones[].ownerScope"workspace" | "org_unit" | "location"
data.zones[].ownerNodeIdstring | null
data.zones[].frame"bare" | "card" | "accent" | "glass"Paint style on a themed layout.
data.zones[].radiusnumberCorner radius in layout pixels.
data.zones[].role"logo"`logo`: the zone shows the Brand Kit logo instead of content.
data.zoneLayoutZoneA zone. Open: a whole-array write (`PUT /v1/layouts/{id}/zones` with `zones`, or `PATCH /v1/layouts/{id}`) stores each zone as sent, so other keys come back too.
data.zone.idstring
data.zone.namestring
data.zone.xnumberLeft edge, in layout pixels.
data.zone.ynumber
data.zone.wnumber
data.zone.hnumber
data.zone.lockedboolean
data.zone.contentNamestringLabel of the bound content. Absent on the zone a new layout starts with.
data.zone.contentobject | nullWhat the zone plays: a media file, playlist, schedule, app, web link or creative (`canvas`).
data.zone.zIndexnumber
data.zone.ownerScope"workspace" | "org_unit" | "location"
data.zone.ownerNodeIdstring | null
data.zone.frame"bare" | "card" | "accent" | "glass"Paint style on a themed layout.
data.zone.radiusnumberCorner radius in layout pixels.
data.zone.role"logo"`logo`: the zone shows the Brand Kit logo instead of content.

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 403 `not_shared`: the content is not usable at the layout's location.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 404 No such layout (or zone) in this workspace.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 409 `conflict`: the layout changed during the write three times running; retry.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 422 A bad frame, radius or role, content that does not exist, or zone content that plays this layout again (a loop).

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 5XX Server error. The body carries a `requestId` to quote to support.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

PUT/v1/layouts/{id}/zones

Bearer token layout.edit

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.

ParameterInTypeRequiredDescription
idpathstringyesLayout id.
curl -X PUT "https://api.brixsignage.com/v1/layouts/{id}/zones" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200 Success.

FieldTypeDescription
dataobject
data.idstringLayout id.
data.zonesarray of LayoutZoneEvery zone, in paint order.
data.zones[].idstring
data.zones[].namestring
data.zones[].xnumberLeft edge, in layout pixels.
data.zones[].ynumber
data.zones[].wnumber
data.zones[].hnumber
data.zones[].lockedboolean
data.zones[].contentNamestringLabel of the bound content. Absent on the zone a new layout starts with.
data.zones[].contentobject | nullWhat the zone plays: a media file, playlist, schedule, app, web link or creative (`canvas`).
data.zones[].zIndexnumber
data.zones[].ownerScope"workspace" | "org_unit" | "location"
data.zones[].ownerNodeIdstring | null
data.zones[].frame"bare" | "card" | "accent" | "glass"Paint style on a themed layout.
data.zones[].radiusnumberCorner radius in layout pixels.
data.zones[].role"logo"`logo`: the zone shows the Brand Kit logo instead of content.

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 403 `not_shared`: the content is not usable at the layout's location.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 404 No such layout (or zone) in this workspace.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 409 `conflict`: the layout changed during the write three times running; retry.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 422 `zoneIds` that are not every zone exactly once, neither `zones` nor `zoneIds`, or a bad or looping zone.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 5XX Server error. The body carries a `requestId` to quote to support.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

PATCH/v1/layouts/{id}/zones/{zoneId}

Bearer token layout.edit

Edit one zone's geometry, attached content, or, on a themed layout, its frame, radius, or role. Send null for any of those to clear it. Rejects a change that would create a loop back into the same layout.

ParameterInTypeRequiredDescription
idpathstringyesLayout id.
zoneIdpathstringyesZone id.

Request body application/json

FieldTypeRequiredDescription
namestringnoDefault `Zone <n>`.
xnumbernoDefault 0.
ynumbernoDefault 0.
wnumbernoDefault 480.
hnumbernoDefault 270.
lockedbooleanno
contentNamestringno
contentobject | nullnoWhat the zone plays. It must exist in this workspace, be usable at the layout's location, and not contain this layout.
ownerScope"workspace" | "org_unit" | "location"no
ownerNodeIdstring | nullno
frame"bare" | "card" | "accent" | "glass" | nullno`null` removes it.
radiusnumber | nullno`null` removes it.
role"logo" | nullno`null` removes it.
curl -X PATCH "https://api.brixsignage.com/v1/layouts/{id}/zones/{zoneId}" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200 Success.

FieldTypeDescription
dataobject
data.idstringLayout id.
data.zonesarray of LayoutZoneEvery zone, in paint order.
data.zones[].idstring
data.zones[].namestring
data.zones[].xnumberLeft edge, in layout pixels.
data.zones[].ynumber
data.zones[].wnumber
data.zones[].hnumber
data.zones[].lockedboolean
data.zones[].contentNamestringLabel of the bound content. Absent on the zone a new layout starts with.
data.zones[].contentobject | nullWhat the zone plays: a media file, playlist, schedule, app, web link or creative (`canvas`).
data.zones[].zIndexnumber
data.zones[].ownerScope"workspace" | "org_unit" | "location"
data.zones[].ownerNodeIdstring | null
data.zones[].frame"bare" | "card" | "accent" | "glass"Paint style on a themed layout.
data.zones[].radiusnumberCorner radius in layout pixels.
data.zones[].role"logo"`logo`: the zone shows the Brand Kit logo instead of content.
data.zoneLayoutZoneA zone. Open: a whole-array write (`PUT /v1/layouts/{id}/zones` with `zones`, or `PATCH /v1/layouts/{id}`) stores each zone as sent, so other keys come back too.
data.zone.idstring
data.zone.namestring
data.zone.xnumberLeft edge, in layout pixels.
data.zone.ynumber
data.zone.wnumber
data.zone.hnumber
data.zone.lockedboolean
data.zone.contentNamestringLabel of the bound content. Absent on the zone a new layout starts with.
data.zone.contentobject | nullWhat the zone plays: a media file, playlist, schedule, app, web link or creative (`canvas`).
data.zone.zIndexnumber
data.zone.ownerScope"workspace" | "org_unit" | "location"
data.zone.ownerNodeIdstring | null
data.zone.frame"bare" | "card" | "accent" | "glass"Paint style on a themed layout.
data.zone.radiusnumberCorner radius in layout pixels.
data.zone.role"logo"`logo`: the zone shows the Brand Kit logo instead of content.

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 403 `not_shared`: the content is not usable at the layout's location.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 404 No such layout (or zone) in this workspace.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 409 `conflict`: the layout changed during the write three times running; retry.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 422 A bad frame, radius or role, content that does not exist, or zone content that plays this layout again (a loop).

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 5XX Server error. The body carries a `requestId` to quote to support.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

DELETE/v1/layouts/{id}/zones/{zoneId}

Bearer token layout.edit

Remove one zone from a layout.

ParameterInTypeRequiredDescription
idpathstringyesLayout id.
zoneIdpathstringyesZone id.
curl -X DELETE "https://api.brixsignage.com/v1/layouts/{id}/zones/{zoneId}" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200 Success.

FieldTypeDescription
dataobject
data.idstringLayout id.
data.zonesarray of LayoutZoneEvery zone, in paint order.
data.zones[].idstring
data.zones[].namestring
data.zones[].xnumberLeft edge, in layout pixels.
data.zones[].ynumber
data.zones[].wnumber
data.zones[].hnumber
data.zones[].lockedboolean
data.zones[].contentNamestringLabel of the bound content. Absent on the zone a new layout starts with.
data.zones[].contentobject | nullWhat the zone plays: a media file, playlist, schedule, app, web link or creative (`canvas`).
data.zones[].zIndexnumber
data.zones[].ownerScope"workspace" | "org_unit" | "location"
data.zones[].ownerNodeIdstring | null
data.zones[].frame"bare" | "card" | "accent" | "glass"Paint style on a themed layout.
data.zones[].radiusnumberCorner radius in layout pixels.
data.zones[].role"logo"`logo`: the zone shows the Brand Kit logo instead of content.

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 403 The token lacks the permission this operation needs (see `x-brix-permission`).

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 404 No such layout or zone in this workspace.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 409 `conflict`: the layout changed during the write three times running; retry.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 5XX Server error. The body carries a `requestId` to quote to support.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.