Playlists API

Playlists endpoints in the Brix REST API: 13 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/playlists

Bearer token playlist.view

List every playlist in the workspace, including its items and a summary of its dayparting rules. Every playlist you can see, each with its items. Not paginated.

curl "https://api.brixsignage.com/v1/playlists" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200 Success.

FieldTypeDescription
dataarray of Playlist
data[].idstringPlaylist id.
data[].spaceIdstring
data[].namestring
data[].descriptionstring
data[].shuffleboolean
data[].fullscreenboolean
data[].startsAtstring | nullPlays only from this date (YYYY-MM-DD) or time, stored as sent.
data[].expiresAtstring | nullStops after this date (YYYY-MM-DD) or time, stored as sent.
data[].approvalState"draft" | "pending" | "approved" | "rejected"Only `approved` content airs where the location requires approval.
data[].nodeIdstring | nullHome location; null = workspace root.
data[].createdAtstringISO-8601 timestamp (UTC).
data[].updatedAtstringISO-8601 timestamp (UTC).
data[].deletedAtstring | null
data[].fit"contain" | "cover" | "fill" | "blur-fill" | null
data[].approvedSnapshotstring | nullInternal: the approved version, as stored JSON text.
data[].importSourceIdstring | null
data[].recalledAtstring | null
data[].recalledBystring | null
data[].usedByScreenCountinteger
data[].usedByScreensarray of objectUp to 12 screens playing it.
data[].usedByScreens[].idstring
data[].usedByScreens[].namestring
data[].allocationsarray of PlaylistAllocation
data[].allocations[].idstring
data[].allocations[].labelstring
data[].allocations[].ownerKind"user" | "group" | "org-unit"
data[].allocations[].ownerIdstring
data[].allocations[].ownerNamestring
data[].allocations[].kind"percent" | "every-nth" | "daypart"
data[].allocations[].valueinteger
data[].allocations[].endValueintegerAbsent (not null) when unset.
data[].allocations[].colorClassstring
data[].allocations[].fillSpaceIdstring | null
data[].allocations[].fillPlaylistIdstring | null
data[].allocations[].unfilledBehavior"collapse" | "filler" | "holding"
data[].allocations[].fillerRefKind"media" | "playlist" | "app" | "layout" | null
data[].allocations[].fillerRefIdstring | null
data[].allocations[].requiresApprovalboolean
data[].itemsarray of PlaylistItem
data[].items[].idstringPlaylist item id.
data[].items[].refKind"media" | "app" | "layout" | "playlist"
data[].items[].refIdstringThe media / app instance / layout / playlist id.
data[].items[].namestring
data[].items[].thumbnailUrlstringEmpty string when there is none.
data[].items[].kindstringThe media kind for media items; `app`, `layout` or `playlist` otherwise.
data[].items[].nestedItemCountinteger | nullNested playlists only: its top-level item count.
data[].items[].durationMode"fixed" | "full" | "live" | "loop" | "manual"
data[].items[].durationSecondsintegerDwell in seconds for `fixed`.
data[].items[].loopCountinteger
data[].items[].loopDurationMsinteger | null
data[].items[].mediaDurationSecnumber | null
data[].items[].fit"contain" | "cover" | "fill" | "blur-fill" | nullThe item's own fit; null = inherit.
data[].items[].assetFit"contain" | "cover" | "fill" | "blur-fill" | null
data[].items[].assetStartsAtstring | null
data[].items[].assetExpiresAtstring | null
data[].items[].assetActiveboolean | null
data[].items[].fullscreenboolean
data[].items[].withheld"expired" | "archived" | "not-yet" | nullWhy a media item is not airing now, or null.
data[].items[].allocationIdstring | null
data[].items[].positioninteger
data[].sharedIntruePresent when the playlist is outside your locations and was shared in.

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/playlists

Bearer token playlist.create

Create a playlist with a name and an optional nodeId and other fields. Safe to retry with an idempotency key, to protect against duplicate creation from a double-click. Creates an empty playlist. Add items with POST /v1/playlists/{id}/items. Send an Idempotency-Key header to make a retry safe. **Notes.** - The create response is the new row plus empty items and allocations; it omits fit, usedByScreenCount, usedByScreens and the other columns that GET returns.

Request body application/json

FieldTypeRequiredDescription
namestringyes
descriptionstringno
shufflebooleanno
fullscreenbooleanno
startsAtstringnoYYYY-MM-DD or ISO-8601.
expiresAtstringnoYYYY-MM-DD or ISO-8601.
nodeIdstringnoHome location; defaults to your own.
curl -X POST "https://api.brixsignage.com/v1/playlists" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Lunch menu","description":"Weekday 11:00-14:00","shuffle":false}'

Response 201 Success.

FieldTypeDescription
dataPlaylistCreatedA new, empty playlist.
data.idstringPlaylist id.
data.spaceIdstring
data.namestring
data.descriptionstring
data.shuffleboolean
data.fullscreenboolean
data.startsAtstring | nullPlays only from this date (YYYY-MM-DD) or time, stored as sent.
data.expiresAtstring | nullStops after this date (YYYY-MM-DD) or time, stored as sent.
data.approvalState"draft" | "pending" | "approved" | "rejected"Only `approved` content airs where the location requires approval.
data.nodeIdstring | nullHome location; null = workspace root.
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).
data.deletedAtstring | null
data.itemsarray of PlaylistItem
data.items[].idstringPlaylist item id.
data.items[].refKind"media" | "app" | "layout" | "playlist"
data.items[].refIdstringThe media / app instance / layout / playlist id.
data.items[].namestring
data.items[].thumbnailUrlstringEmpty string when there is none.
data.items[].kindstringThe media kind for media items; `app`, `layout` or `playlist` otherwise.
data.items[].nestedItemCountinteger | nullNested playlists only: its top-level item count.
data.items[].durationMode"fixed" | "full" | "live" | "loop" | "manual"
data.items[].durationSecondsintegerDwell in seconds for `fixed`.
data.items[].loopCountinteger
data.items[].loopDurationMsinteger | null
data.items[].mediaDurationSecnumber | null
data.items[].fit"contain" | "cover" | "fill" | "blur-fill" | nullThe item's own fit; null = inherit.
data.items[].assetFit"contain" | "cover" | "fill" | "blur-fill" | null
data.items[].assetStartsAtstring | null
data.items[].assetExpiresAtstring | null
data.items[].assetActiveboolean | null
data.items[].fullscreenboolean
data.items[].withheld"expired" | "archived" | "not-yet" | nullWhy a media item is not airing now, or null.
data.items[].allocationIdstring | null
data.items[].positioninteger
data.allocationsarray of PlaylistAllocation
data.allocations[].idstring
data.allocations[].labelstring
data.allocations[].ownerKind"user" | "group" | "org-unit"
data.allocations[].ownerIdstring
data.allocations[].ownerNamestring
data.allocations[].kind"percent" | "every-nth" | "daypart"
data.allocations[].valueinteger
data.allocations[].endValueintegerAbsent (not null) when unset.
data.allocations[].colorClassstring
data.allocations[].fillSpaceIdstring | null
data.allocations[].fillPlaylistIdstring | null
data.allocations[].unfilledBehavior"collapse" | "filler" | "holding"
data.allocations[].fillerRefKind"media" | "playlist" | "app" | "layout" | null
data.allocations[].fillerRefIdstring | null
data.allocations[].requiresApprovalboolean
{
  "data": {
    "id": "pl_4d5e6f7a8b9c0d1e",
    "spaceId": "space_1a2b3c4d5e6f7a8b",
    "name": "Lunch menu",
    "description": "Weekday 11:00-14:00",
    "shuffle": false,
    "fullscreen": false,
    "startsAt": null,
    "expiresAt": null,
    "approvalState": "approved",
    "nodeId": null,
    "createdAt": "2026-09-28T09:00:00.000Z",
    "updatedAt": "2026-09-28T09:00:00.000Z",
    "deletedAt": null,
    "items": [],
    "allocations": []
  }
}

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 422 Missing name, an unparsable date, or an unknown 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 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/playlists/{id}

Bearer token playlist.view

Retrieve one playlist with its ordered items, including each item's reference kind and id, duration, and rules.

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

Response 200 Success.

FieldTypeDescription
dataPlaylistDetail
data.idstringPlaylist id.
data.spaceIdstring
data.namestring
data.descriptionstring
data.shuffleboolean
data.fullscreenboolean
data.startsAtstring | nullPlays only from this date (YYYY-MM-DD) or time, stored as sent.
data.expiresAtstring | nullStops after this date (YYYY-MM-DD) or time, stored as sent.
data.approvalState"draft" | "pending" | "approved" | "rejected"Only `approved` content airs where the location requires approval.
data.nodeIdstring | nullHome location; null = workspace root.
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).
data.deletedAtstring | null
data.fit"contain" | "cover" | "fill" | "blur-fill" | null
data.approvedSnapshotstring | nullInternal: the approved version, as stored JSON text.
data.importSourceIdstring | null
data.recalledAtstring | null
data.recalledBystring | null
data.usedByScreenCountinteger
data.usedByScreensarray of objectUp to 12 screens playing it.
data.usedByScreens[].idstring
data.usedByScreens[].namestring
data.allocationsarray of PlaylistAllocation
data.allocations[].idstring
data.allocations[].labelstring
data.allocations[].ownerKind"user" | "group" | "org-unit"
data.allocations[].ownerIdstring
data.allocations[].ownerNamestring
data.allocations[].kind"percent" | "every-nth" | "daypart"
data.allocations[].valueinteger
data.allocations[].endValueintegerAbsent (not null) when unset.
data.allocations[].colorClassstring
data.allocations[].fillSpaceIdstring | null
data.allocations[].fillPlaylistIdstring | null
data.allocations[].unfilledBehavior"collapse" | "filler" | "holding"
data.allocations[].fillerRefKind"media" | "playlist" | "app" | "layout" | null
data.allocations[].fillerRefIdstring | null
data.allocations[].requiresApprovalboolean
data.itemsarray of PlaylistItem
data.items[].idstringPlaylist item id.
data.items[].refKind"media" | "app" | "layout" | "playlist"
data.items[].refIdstringThe media / app instance / layout / playlist id.
data.items[].namestring
data.items[].thumbnailUrlstringEmpty string when there is none.
data.items[].kindstringThe media kind for media items; `app`, `layout` or `playlist` otherwise.
data.items[].nestedItemCountinteger | nullNested playlists only: its top-level item count.
data.items[].durationMode"fixed" | "full" | "live" | "loop" | "manual"
data.items[].durationSecondsintegerDwell in seconds for `fixed`.
data.items[].loopCountinteger
data.items[].loopDurationMsinteger | null
data.items[].mediaDurationSecnumber | null
data.items[].fit"contain" | "cover" | "fill" | "blur-fill" | nullThe item's own fit; null = inherit.
data.items[].assetFit"contain" | "cover" | "fill" | "blur-fill" | null
data.items[].assetStartsAtstring | null
data.items[].assetExpiresAtstring | null
data.items[].assetActiveboolean | null
data.items[].fullscreenboolean
data.items[].withheld"expired" | "archived" | "not-yet" | nullWhy a media item is not airing now, or null.
data.items[].allocationIdstring | null
data.items[].positioninteger
data.sharedIntruePresent when the playlist is outside your locations and was shared in.
data.requiresApprovalbooleanThe home location requires approval before content airs.
data.resolvedItemCountintegerItem count with nested playlists expanded.
data.resolvedDurationSecnumberRuntime in seconds with nested playlists expanded.

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 playlist 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/playlists/{id}

Bearer token playlist.edit

Edit a playlist's own fields, such as name, node, shuffle, and transition settings. Items are managed through the separate /items routes. Send only the fields to change. A playback change to an approved playlist returns it to draft where approval is required. **Notes.** - Fields of the wrong type are ignored rather than refused (for example name: 5).

ParameterInTypeRequiredDescription
idpathstringyesPlaylist id.

Request body application/json

FieldTypeRequiredDescription
namestringno
descriptionstringno
shufflebooleanno
fullscreenbooleanno
fit"contain" | "cover" | "fill" | "blur-fill" | nullno
startsAtstring | nullno
expiresAtstring | nullno
nodeIdstring | nullnoMove to another location (needs playlist.edit there).
baseUpdatedAtstringnoThe `updatedAt` your edit is based on; a stale value answers 409 with `current`.
curl -X PATCH "https://api.brixsignage.com/v1/playlists/{id}" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200 Success.

FieldTypeDescription
dataPlaylistA playlist with its ordered items.
data.idstringPlaylist id.
data.spaceIdstring
data.namestring
data.descriptionstring
data.shuffleboolean
data.fullscreenboolean
data.startsAtstring | nullPlays only from this date (YYYY-MM-DD) or time, stored as sent.
data.expiresAtstring | nullStops after this date (YYYY-MM-DD) or time, stored as sent.
data.approvalState"draft" | "pending" | "approved" | "rejected"Only `approved` content airs where the location requires approval.
data.nodeIdstring | nullHome location; null = workspace root.
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).
data.deletedAtstring | null
data.fit"contain" | "cover" | "fill" | "blur-fill" | null
data.approvedSnapshotstring | nullInternal: the approved version, as stored JSON text.
data.importSourceIdstring | null
data.recalledAtstring | null
data.recalledBystring | null
data.usedByScreenCountinteger
data.usedByScreensarray of objectUp to 12 screens playing it.
data.usedByScreens[].idstring
data.usedByScreens[].namestring
data.allocationsarray of PlaylistAllocation
data.allocations[].idstring
data.allocations[].labelstring
data.allocations[].ownerKind"user" | "group" | "org-unit"
data.allocations[].ownerIdstring
data.allocations[].ownerNamestring
data.allocations[].kind"percent" | "every-nth" | "daypart"
data.allocations[].valueinteger
data.allocations[].endValueintegerAbsent (not null) when unset.
data.allocations[].colorClassstring
data.allocations[].fillSpaceIdstring | null
data.allocations[].fillPlaylistIdstring | null
data.allocations[].unfilledBehavior"collapse" | "filler" | "holding"
data.allocations[].fillerRefKind"media" | "playlist" | "app" | "layout" | null
data.allocations[].fillerRefIdstring | null
data.allocations[].requiresApprovalboolean
data.itemsarray of PlaylistItem
data.items[].idstringPlaylist item id.
data.items[].refKind"media" | "app" | "layout" | "playlist"
data.items[].refIdstringThe media / app instance / layout / playlist id.
data.items[].namestring
data.items[].thumbnailUrlstringEmpty string when there is none.
data.items[].kindstringThe media kind for media items; `app`, `layout` or `playlist` otherwise.
data.items[].nestedItemCountinteger | nullNested playlists only: its top-level item count.
data.items[].durationMode"fixed" | "full" | "live" | "loop" | "manual"
data.items[].durationSecondsintegerDwell in seconds for `fixed`.
data.items[].loopCountinteger
data.items[].loopDurationMsinteger | null
data.items[].mediaDurationSecnumber | null
data.items[].fit"contain" | "cover" | "fill" | "blur-fill" | nullThe item's own fit; null = inherit.
data.items[].assetFit"contain" | "cover" | "fill" | "blur-fill" | null
data.items[].assetStartsAtstring | null
data.items[].assetExpiresAtstring | null
data.items[].assetActiveboolean | null
data.items[].fullscreenboolean
data.items[].withheld"expired" | "archived" | "not-yet" | nullWhy a media item is not airing now, or null.
data.items[].allocationIdstring | null
data.items[].positioninteger
data.sharedIntruePresent when the playlist is outside your locations and was shared in.

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 playlist.edit.

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 playlist 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`: `baseUpdatedAt` is stale; 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 An unparsable date or an unknown 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 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/playlists/{id}

Bearer token playlist.delete

Delete a playlist to the recycle bin. Screens assigned to it fall back to their default content. Fails with 409 if the playlist is shared into other spaces, unless the deletion is forced. Moves the playlist to the recycle bin (restorable for 30 days).

ParameterInTypeRequiredDescription
idpathstringyesPlaylist id.
forcequery"true"noDelete even when it is shared into other places.
curl -X DELETE "https://api.brixsignage.com/v1/playlists/{id}" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200 Success.

FieldTypeDescription
dataobject
data.idstring
data.deletedtrue
data.sharesRemovedinteger

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 playlist 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`: the item 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.

PUT/v1/playlists/{id}/allocations

Bearer token playlist.edit

Set a playlist's allocations: shares of its airtime given to a person, a group or a location (a percent, every nth play, or a time of day). This replaces the whole set; allocations you leave out are removed. **Notes.** - An out-of-range value is 400 validation_error; every other validation failure is 422. - Rows with an unknown ownerKind or kind are dropped without an error. - A missing or malformed body is treated as an empty list, which removes every allocation. - The returned playlist row (updatedAt, approvalState) is the one read before this edit; an approved playlist is returned to draft in storage by this call. Re-read with GET to see it.

ParameterInTypeRequiredDescription
idpathstringyesPlaylist id.

Request body application/json

FieldTypeRequiredDescription
allocationsarray of objectyesThe whole set, at most 200. Allocations left out are removed.
allocations[].idstringnoKeep this id: one of the playlist's current allocations, or a new id of 6-64 URL-safe characters. Otherwise a new id is made.
allocations[].labelstringno
allocations[].ownerKind"user" | "group" | "org-unit"yesWho gets the share. `org-unit` = a location (`ownerId` is its node id).
allocations[].ownerIdstringyes
allocations[].ownerNamestringno
allocations[].kind"percent" | "every-nth" | "daypart"yes
allocations[].valueintegeryes`percent` 0-100, `every-nth` 1-100, `daypart` 0-1439 (the minute of the day it opens).
allocations[].endValuenumberno`daypart`: the minute of the day it closes.
allocations[].colorClassstringno
allocations[].fillSpaceIdstring | nullnoA child workspace that fills the share; null = this workspace.
allocations[].unfilledBehavior"collapse" | "filler" | "holding"noWhat plays while the share is not filled. Default `collapse`.
allocations[].fillerRefKind"media" | "playlist" | "app" | "layout"noWith `filler`: the kind of the filler content.
allocations[].fillerRefIdstringno
allocations[].requiresApprovalbooleannoWhat the recipient puts in the share must be approved first.
curl -X PUT "https://api.brixsignage.com/v1/playlists/{id}/allocations" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200 Success.

FieldTypeDescription
dataPlaylistA playlist with its ordered items.
data.idstringPlaylist id.
data.spaceIdstring
data.namestring
data.descriptionstring
data.shuffleboolean
data.fullscreenboolean
data.startsAtstring | nullPlays only from this date (YYYY-MM-DD) or time, stored as sent.
data.expiresAtstring | nullStops after this date (YYYY-MM-DD) or time, stored as sent.
data.approvalState"draft" | "pending" | "approved" | "rejected"Only `approved` content airs where the location requires approval.
data.nodeIdstring | nullHome location; null = workspace root.
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).
data.deletedAtstring | null
data.fit"contain" | "cover" | "fill" | "blur-fill" | null
data.approvedSnapshotstring | nullInternal: the approved version, as stored JSON text.
data.importSourceIdstring | null
data.recalledAtstring | null
data.recalledBystring | null
data.usedByScreenCountinteger
data.usedByScreensarray of objectUp to 12 screens playing it.
data.usedByScreens[].idstring
data.usedByScreens[].namestring
data.allocationsarray of PlaylistAllocation
data.allocations[].idstring
data.allocations[].labelstring
data.allocations[].ownerKind"user" | "group" | "org-unit"
data.allocations[].ownerIdstring
data.allocations[].ownerNamestring
data.allocations[].kind"percent" | "every-nth" | "daypart"
data.allocations[].valueinteger
data.allocations[].endValueintegerAbsent (not null) when unset.
data.allocations[].colorClassstring
data.allocations[].fillSpaceIdstring | null
data.allocations[].fillPlaylistIdstring | null
data.allocations[].unfilledBehavior"collapse" | "filler" | "holding"
data.allocations[].fillerRefKind"media" | "playlist" | "app" | "layout" | null
data.allocations[].fillerRefIdstring | null
data.allocations[].requiresApprovalboolean
data.itemsarray of PlaylistItem
data.items[].idstringPlaylist item id.
data.items[].refKind"media" | "app" | "layout" | "playlist"
data.items[].refIdstringThe media / app instance / layout / playlist id.
data.items[].namestring
data.items[].thumbnailUrlstringEmpty string when there is none.
data.items[].kindstringThe media kind for media items; `app`, `layout` or `playlist` otherwise.
data.items[].nestedItemCountinteger | nullNested playlists only: its top-level item count.
data.items[].durationMode"fixed" | "full" | "live" | "loop" | "manual"
data.items[].durationSecondsintegerDwell in seconds for `fixed`.
data.items[].loopCountinteger
data.items[].loopDurationMsinteger | null
data.items[].mediaDurationSecnumber | null
data.items[].fit"contain" | "cover" | "fill" | "blur-fill" | nullThe item's own fit; null = inherit.
data.items[].assetFit"contain" | "cover" | "fill" | "blur-fill" | null
data.items[].assetStartsAtstring | null
data.items[].assetExpiresAtstring | null
data.items[].assetActiveboolean | null
data.items[].fullscreenboolean
data.items[].withheld"expired" | "archived" | "not-yet" | nullWhy a media item is not airing now, or null.
data.items[].allocationIdstring | null
data.items[].positioninteger
data.sharedIntruePresent when the playlist is outside your locations and was shared in.

Response 400 `validation_error`: a `value` outside its kind's range or not a whole number.

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 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 playlist 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 422 More than 200 allocations, a location that is not in this workspace (`invalid_node`), or percent shares that would give away more than 99% on some screen.

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/playlists/{id}/duplicate

Bearer token playlist.create

Create a deep copy of a playlist, including its settings, share-of-voice allocations (fill assignments reset), and ordered items, named "<name> copy" and unique within the space. The copy starts as a draft with no assignment. Requires permission to create playlists at the source playlist's home node.

ParameterInTypeRequiredDescription
idpathstringyesPlaylist id.
curl -X POST "https://api.brixsignage.com/v1/playlists/{id}/duplicate" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 201 Success.

FieldTypeDescription
dataPlaylistA playlist with its ordered items.
data.idstringPlaylist id.
data.spaceIdstring
data.namestring
data.descriptionstring
data.shuffleboolean
data.fullscreenboolean
data.startsAtstring | nullPlays only from this date (YYYY-MM-DD) or time, stored as sent.
data.expiresAtstring | nullStops after this date (YYYY-MM-DD) or time, stored as sent.
data.approvalState"draft" | "pending" | "approved" | "rejected"Only `approved` content airs where the location requires approval.
data.nodeIdstring | nullHome location; null = workspace root.
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).
data.deletedAtstring | null
data.fit"contain" | "cover" | "fill" | "blur-fill" | null
data.approvedSnapshotstring | nullInternal: the approved version, as stored JSON text.
data.importSourceIdstring | null
data.recalledAtstring | null
data.recalledBystring | null
data.usedByScreenCountinteger
data.usedByScreensarray of objectUp to 12 screens playing it.
data.usedByScreens[].idstring
data.usedByScreens[].namestring
data.allocationsarray of PlaylistAllocation
data.allocations[].idstring
data.allocations[].labelstring
data.allocations[].ownerKind"user" | "group" | "org-unit"
data.allocations[].ownerIdstring
data.allocations[].ownerNamestring
data.allocations[].kind"percent" | "every-nth" | "daypart"
data.allocations[].valueinteger
data.allocations[].endValueintegerAbsent (not null) when unset.
data.allocations[].colorClassstring
data.allocations[].fillSpaceIdstring | null
data.allocations[].fillPlaylistIdstring | null
data.allocations[].unfilledBehavior"collapse" | "filler" | "holding"
data.allocations[].fillerRefKind"media" | "playlist" | "app" | "layout" | null
data.allocations[].fillerRefIdstring | null
data.allocations[].requiresApprovalboolean
data.itemsarray of PlaylistItem
data.items[].idstringPlaylist item id.
data.items[].refKind"media" | "app" | "layout" | "playlist"
data.items[].refIdstringThe media / app instance / layout / playlist id.
data.items[].namestring
data.items[].thumbnailUrlstringEmpty string when there is none.
data.items[].kindstringThe media kind for media items; `app`, `layout` or `playlist` otherwise.
data.items[].nestedItemCountinteger | nullNested playlists only: its top-level item count.
data.items[].durationMode"fixed" | "full" | "live" | "loop" | "manual"
data.items[].durationSecondsintegerDwell in seconds for `fixed`.
data.items[].loopCountinteger
data.items[].loopDurationMsinteger | null
data.items[].mediaDurationSecnumber | null
data.items[].fit"contain" | "cover" | "fill" | "blur-fill" | nullThe item's own fit; null = inherit.
data.items[].assetFit"contain" | "cover" | "fill" | "blur-fill" | null
data.items[].assetStartsAtstring | null
data.items[].assetExpiresAtstring | null
data.items[].assetActiveboolean | null
data.items[].fullscreenboolean
data.items[].withheld"expired" | "archived" | "not-yet" | nullWhy a media item is not airing now, or null.
data.items[].allocationIdstring | null
data.items[].positioninteger
data.sharedIntruePresent when the playlist is outside your locations and was shared in.

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 playlist 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/playlists/{id}/items

Bearer token playlist.edit

Append one item to a playlist with refKind, refId, and an optional durationSec and other fields. Rejects references from another space, and rejects any nesting that would create a loop, such as a playlist referencing a layout zone that contains the same playlist, with a clear error rather than failing silently. Appends one item. A video or audio file defaults to playing its full length, an animated image to one loop, anything else to 10 seconds. Returns the whole playlist. **Notes.** - position is accepted and ignored. - The returned approvalState is the value from before the edit; an approved playlist is returned to draft in storage by this call. Re-read with GET to see it.

ParameterInTypeRequiredDescription
idpathstringyesPlaylist id.

Request body application/json

FieldTypeRequiredDescription
refKind"media" | "app" | "layout" | "playlist"yes
refIdstringyes
durationMode"fixed" | "full" | "live" | "loop" | "manual"no
durationSecondsintegerno
loopCountnumberno
fitstringnocontain, cover, fill or blur-fill; anything else means inherit.
fullscreenbooleanno
positionnumbernoAccepted but ignored: the item is always appended. Reorder with PUT /v1/playlists/{id}/items.
allocationIdstringno
curl -X POST "https://api.brixsignage.com/v1/playlists/{id}/items" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 201 Success.

FieldTypeDescription
dataPlaylistA playlist with its ordered items.
data.idstringPlaylist id.
data.spaceIdstring
data.namestring
data.descriptionstring
data.shuffleboolean
data.fullscreenboolean
data.startsAtstring | nullPlays only from this date (YYYY-MM-DD) or time, stored as sent.
data.expiresAtstring | nullStops after this date (YYYY-MM-DD) or time, stored as sent.
data.approvalState"draft" | "pending" | "approved" | "rejected"Only `approved` content airs where the location requires approval.
data.nodeIdstring | nullHome location; null = workspace root.
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).
data.deletedAtstring | null
data.fit"contain" | "cover" | "fill" | "blur-fill" | null
data.approvedSnapshotstring | nullInternal: the approved version, as stored JSON text.
data.importSourceIdstring | null
data.recalledAtstring | null
data.recalledBystring | null
data.usedByScreenCountinteger
data.usedByScreensarray of objectUp to 12 screens playing it.
data.usedByScreens[].idstring
data.usedByScreens[].namestring
data.allocationsarray of PlaylistAllocation
data.allocations[].idstring
data.allocations[].labelstring
data.allocations[].ownerKind"user" | "group" | "org-unit"
data.allocations[].ownerIdstring
data.allocations[].ownerNamestring
data.allocations[].kind"percent" | "every-nth" | "daypart"
data.allocations[].valueinteger
data.allocations[].endValueintegerAbsent (not null) when unset.
data.allocations[].colorClassstring
data.allocations[].fillSpaceIdstring | null
data.allocations[].fillPlaylistIdstring | null
data.allocations[].unfilledBehavior"collapse" | "filler" | "holding"
data.allocations[].fillerRefKind"media" | "playlist" | "app" | "layout" | null
data.allocations[].fillerRefIdstring | null
data.allocations[].requiresApprovalboolean
data.itemsarray of PlaylistItem
data.items[].idstringPlaylist item id.
data.items[].refKind"media" | "app" | "layout" | "playlist"
data.items[].refIdstringThe media / app instance / layout / playlist id.
data.items[].namestring
data.items[].thumbnailUrlstringEmpty string when there is none.
data.items[].kindstringThe media kind for media items; `app`, `layout` or `playlist` otherwise.
data.items[].nestedItemCountinteger | nullNested playlists only: its top-level item count.
data.items[].durationMode"fixed" | "full" | "live" | "loop" | "manual"
data.items[].durationSecondsintegerDwell in seconds for `fixed`.
data.items[].loopCountinteger
data.items[].loopDurationMsinteger | null
data.items[].mediaDurationSecnumber | null
data.items[].fit"contain" | "cover" | "fill" | "blur-fill" | nullThe item's own fit; null = inherit.
data.items[].assetFit"contain" | "cover" | "fill" | "blur-fill" | null
data.items[].assetStartsAtstring | null
data.items[].assetExpiresAtstring | null
data.items[].assetActiveboolean | null
data.items[].fullscreenboolean
data.items[].withheld"expired" | "archived" | "not-yet" | nullWhy a media item is not airing now, or null.
data.items[].allocationIdstring | null
data.items[].positioninteger
data.sharedIntruePresent when the playlist is outside your locations and was shared in.

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 available at the playlist'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 playlist, or the referenced content is not 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 422 Invalid body, a playlist loop, a layout with unbound zones, or an unknown allocation.

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/playlists/{id}/items

Bearer token playlist.edit

Replace a playlist's entire item list in one call. Send the full array of items in the order you want; the same reference and loop validation applies as when adding a single item. Sets the order of the items: itemIds[0] plays first. Unknown ids are skipped. It does not add or remove items. Returns the whole playlist. **Notes.** - Items left out of itemIds keep their old position number, so two items can share a position. Send every item id. - A missing or malformed body is treated as an empty list, not refused.

ParameterInTypeRequiredDescription
idpathstringyesPlaylist id.

Request body application/json

FieldTypeRequiredDescription
itemIdsarray of stringyesItem ids in the new order.
curl -X PUT "https://api.brixsignage.com/v1/playlists/{id}/items" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"itemIds":["pli_7a8b9c0d1e2f3a4b","pli_1e2f3a4b5c6d7e8f"]}'

Response 200 Success.

FieldTypeDescription
dataPlaylistA playlist with its ordered items.
data.idstringPlaylist id.
data.spaceIdstring
data.namestring
data.descriptionstring
data.shuffleboolean
data.fullscreenboolean
data.startsAtstring | nullPlays only from this date (YYYY-MM-DD) or time, stored as sent.
data.expiresAtstring | nullStops after this date (YYYY-MM-DD) or time, stored as sent.
data.approvalState"draft" | "pending" | "approved" | "rejected"Only `approved` content airs where the location requires approval.
data.nodeIdstring | nullHome location; null = workspace root.
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).
data.deletedAtstring | null
data.fit"contain" | "cover" | "fill" | "blur-fill" | null
data.approvedSnapshotstring | nullInternal: the approved version, as stored JSON text.
data.importSourceIdstring | null
data.recalledAtstring | null
data.recalledBystring | null
data.usedByScreenCountinteger
data.usedByScreensarray of objectUp to 12 screens playing it.
data.usedByScreens[].idstring
data.usedByScreens[].namestring
data.allocationsarray of PlaylistAllocation
data.allocations[].idstring
data.allocations[].labelstring
data.allocations[].ownerKind"user" | "group" | "org-unit"
data.allocations[].ownerIdstring
data.allocations[].ownerNamestring
data.allocations[].kind"percent" | "every-nth" | "daypart"
data.allocations[].valueinteger
data.allocations[].endValueintegerAbsent (not null) when unset.
data.allocations[].colorClassstring
data.allocations[].fillSpaceIdstring | null
data.allocations[].fillPlaylistIdstring | null
data.allocations[].unfilledBehavior"collapse" | "filler" | "holding"
data.allocations[].fillerRefKind"media" | "playlist" | "app" | "layout" | null
data.allocations[].fillerRefIdstring | null
data.allocations[].requiresApprovalboolean
data.itemsarray of PlaylistItem
data.items[].idstringPlaylist item id.
data.items[].refKind"media" | "app" | "layout" | "playlist"
data.items[].refIdstringThe media / app instance / layout / playlist id.
data.items[].namestring
data.items[].thumbnailUrlstringEmpty string when there is none.
data.items[].kindstringThe media kind for media items; `app`, `layout` or `playlist` otherwise.
data.items[].nestedItemCountinteger | nullNested playlists only: its top-level item count.
data.items[].durationMode"fixed" | "full" | "live" | "loop" | "manual"
data.items[].durationSecondsintegerDwell in seconds for `fixed`.
data.items[].loopCountinteger
data.items[].loopDurationMsinteger | null
data.items[].mediaDurationSecnumber | null
data.items[].fit"contain" | "cover" | "fill" | "blur-fill" | nullThe item's own fit; null = inherit.
data.items[].assetFit"contain" | "cover" | "fill" | "blur-fill" | null
data.items[].assetStartsAtstring | null
data.items[].assetExpiresAtstring | null
data.items[].assetActiveboolean | null
data.items[].fullscreenboolean
data.items[].withheld"expired" | "archived" | "not-yet" | nullWhy a media item is not airing now, or null.
data.items[].allocationIdstring | null
data.items[].positioninteger
data.sharedIntruePresent when the playlist is outside your locations and was shared in.

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 playlist 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/playlists/{id}/items/{itemId}

Bearer token playlist.edit

Edit one playlist item's duration, loop count, fit, full-screen setting, screen tag rules or allocation. refKind and refId cannot be changed on an existing item; delete it and add a new item to point at different content. **Notes.** - An unknown itemId is not refused: nothing changes and the answer is 200 with the playlist. - targetTags and excludeTags are stored but not returned on the items. - Fields of the wrong type are ignored rather than refused. - The returned playlist row (updatedAt, approvalState) is the one read before this edit; an approved playlist is returned to draft in storage by this call. Re-read with GET to see it.

ParameterInTypeRequiredDescription
idpathstringyesPlaylist id.
itemIdpathstringyesPlaylist item id.

Request body application/json

FieldTypeRequiredDescription
durationMode"fixed" | "full" | "live" | "loop" | "manual"no
durationSecondsnumbernoDwell for `fixed`, rounded and clamped to 1 second through 24 hours.
loopCountnumbernoPlays per turn for `loop`; rounded.
fit"contain" | "cover" | "fill" | "blur-fill" | nullnoThe item's own fit; `null` = follow the file's fit.
fullscreenbooleannoTake over the whole screen, over any layout.
targetTagsarray of string | nullnoPlay only on screens with one of these tags. `null` or `[]` clears the rule.
excludeTagsarray of string | nullnoNever play on screens with one of these tags. `null` or `[]` clears the rule.
allocationIdstring | nullnoPut the item in one of this playlist's allocations; `null` = the base rotation.
curl -X PATCH "https://api.brixsignage.com/v1/playlists/{id}/items/{itemId}" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200 Success.

FieldTypeDescription
dataPlaylistA playlist with its ordered items.
data.idstringPlaylist id.
data.spaceIdstring
data.namestring
data.descriptionstring
data.shuffleboolean
data.fullscreenboolean
data.startsAtstring | nullPlays only from this date (YYYY-MM-DD) or time, stored as sent.
data.expiresAtstring | nullStops after this date (YYYY-MM-DD) or time, stored as sent.
data.approvalState"draft" | "pending" | "approved" | "rejected"Only `approved` content airs where the location requires approval.
data.nodeIdstring | nullHome location; null = workspace root.
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).
data.deletedAtstring | null
data.fit"contain" | "cover" | "fill" | "blur-fill" | null
data.approvedSnapshotstring | nullInternal: the approved version, as stored JSON text.
data.importSourceIdstring | null
data.recalledAtstring | null
data.recalledBystring | null
data.usedByScreenCountinteger
data.usedByScreensarray of objectUp to 12 screens playing it.
data.usedByScreens[].idstring
data.usedByScreens[].namestring
data.allocationsarray of PlaylistAllocation
data.allocations[].idstring
data.allocations[].labelstring
data.allocations[].ownerKind"user" | "group" | "org-unit"
data.allocations[].ownerIdstring
data.allocations[].ownerNamestring
data.allocations[].kind"percent" | "every-nth" | "daypart"
data.allocations[].valueinteger
data.allocations[].endValueintegerAbsent (not null) when unset.
data.allocations[].colorClassstring
data.allocations[].fillSpaceIdstring | null
data.allocations[].fillPlaylistIdstring | null
data.allocations[].unfilledBehavior"collapse" | "filler" | "holding"
data.allocations[].fillerRefKind"media" | "playlist" | "app" | "layout" | null
data.allocations[].fillerRefIdstring | null
data.allocations[].requiresApprovalboolean
data.itemsarray of PlaylistItem
data.items[].idstringPlaylist item id.
data.items[].refKind"media" | "app" | "layout" | "playlist"
data.items[].refIdstringThe media / app instance / layout / playlist id.
data.items[].namestring
data.items[].thumbnailUrlstringEmpty string when there is none.
data.items[].kindstringThe media kind for media items; `app`, `layout` or `playlist` otherwise.
data.items[].nestedItemCountinteger | nullNested playlists only: its top-level item count.
data.items[].durationMode"fixed" | "full" | "live" | "loop" | "manual"
data.items[].durationSecondsintegerDwell in seconds for `fixed`.
data.items[].loopCountinteger
data.items[].loopDurationMsinteger | null
data.items[].mediaDurationSecnumber | null
data.items[].fit"contain" | "cover" | "fill" | "blur-fill" | nullThe item's own fit; null = inherit.
data.items[].assetFit"contain" | "cover" | "fill" | "blur-fill" | null
data.items[].assetStartsAtstring | null
data.items[].assetExpiresAtstring | null
data.items[].assetActiveboolean | null
data.items[].fullscreenboolean
data.items[].withheld"expired" | "archived" | "not-yet" | nullWhy a media item is not airing now, or null.
data.items[].allocationIdstring | null
data.items[].positioninteger
data.sharedIntruePresent when the playlist is outside your locations and was shared in.

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 playlist 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 422 `allocationId` is not one of this playlist's allocations, or nothing to update.

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/playlists/{id}/items/{itemId}

Bearer token playlist.edit

Remove one item from a playlist. The remaining items keep their existing order. Removes the item and closes the gap in the positions. Returns the whole playlist. **Notes.** - An unknown itemId is not refused: nothing is removed and the answer is 200 with the playlist. - The returned playlist row (updatedAt, approvalState) is the one read before this edit; an approved playlist is returned to draft in storage by this call. Re-read with GET to see it.

ParameterInTypeRequiredDescription
idpathstringyesPlaylist id.
itemIdpathstringyesPlaylist item id.
curl -X DELETE "https://api.brixsignage.com/v1/playlists/{id}/items/{itemId}" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200 Success.

FieldTypeDescription
dataPlaylistA playlist with its ordered items.
data.idstringPlaylist id.
data.spaceIdstring
data.namestring
data.descriptionstring
data.shuffleboolean
data.fullscreenboolean
data.startsAtstring | nullPlays only from this date (YYYY-MM-DD) or time, stored as sent.
data.expiresAtstring | nullStops after this date (YYYY-MM-DD) or time, stored as sent.
data.approvalState"draft" | "pending" | "approved" | "rejected"Only `approved` content airs where the location requires approval.
data.nodeIdstring | nullHome location; null = workspace root.
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).
data.deletedAtstring | null
data.fit"contain" | "cover" | "fill" | "blur-fill" | null
data.approvedSnapshotstring | nullInternal: the approved version, as stored JSON text.
data.importSourceIdstring | null
data.recalledAtstring | null
data.recalledBystring | null
data.usedByScreenCountinteger
data.usedByScreensarray of objectUp to 12 screens playing it.
data.usedByScreens[].idstring
data.usedByScreens[].namestring
data.allocationsarray of PlaylistAllocation
data.allocations[].idstring
data.allocations[].labelstring
data.allocations[].ownerKind"user" | "group" | "org-unit"
data.allocations[].ownerIdstring
data.allocations[].ownerNamestring
data.allocations[].kind"percent" | "every-nth" | "daypart"
data.allocations[].valueinteger
data.allocations[].endValueintegerAbsent (not null) when unset.
data.allocations[].colorClassstring
data.allocations[].fillSpaceIdstring | null
data.allocations[].fillPlaylistIdstring | null
data.allocations[].unfilledBehavior"collapse" | "filler" | "holding"
data.allocations[].fillerRefKind"media" | "playlist" | "app" | "layout" | null
data.allocations[].fillerRefIdstring | null
data.allocations[].requiresApprovalboolean
data.itemsarray of PlaylistItem
data.items[].idstringPlaylist item id.
data.items[].refKind"media" | "app" | "layout" | "playlist"
data.items[].refIdstringThe media / app instance / layout / playlist id.
data.items[].namestring
data.items[].thumbnailUrlstringEmpty string when there is none.
data.items[].kindstringThe media kind for media items; `app`, `layout` or `playlist` otherwise.
data.items[].nestedItemCountinteger | nullNested playlists only: its top-level item count.
data.items[].durationMode"fixed" | "full" | "live" | "loop" | "manual"
data.items[].durationSecondsintegerDwell in seconds for `fixed`.
data.items[].loopCountinteger
data.items[].loopDurationMsinteger | null
data.items[].mediaDurationSecnumber | null
data.items[].fit"contain" | "cover" | "fill" | "blur-fill" | nullThe item's own fit; null = inherit.
data.items[].assetFit"contain" | "cover" | "fill" | "blur-fill" | null
data.items[].assetStartsAtstring | null
data.items[].assetExpiresAtstring | null
data.items[].assetActiveboolean | null
data.items[].fullscreenboolean
data.items[].withheld"expired" | "archived" | "not-yet" | nullWhy a media item is not airing now, or null.
data.items[].allocationIdstring | null
data.items[].positioninteger
data.sharedIntruePresent when the playlist is outside your locations and was shared in.

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 playlist 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/playlists/{id}/restore

Bearer token playlist.delete

Restore a deleted playlist so its items and ordering return to the playlist library.

ParameterInTypeRequiredDescription
idpathstringyesPlaylist id.
curl -X POST "https://api.brixsignage.com/v1/playlists/{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 playlist 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 playlist 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/playlists/{id}/share-readiness

Bearer token playlist.view

For a playlist's airtime reserved for other teams, list who at each location can fill their share, and the narrowest role that would let them do so. **Notes.** - requiredPermissions is absent when locations is empty.

ParameterInTypeRequiredDescription
idpathstringyesPlaylist id.
curl "https://api.brixsignage.com/v1/playlists/{id}/share-readiness" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200 Success.

FieldTypeDescription
dataobject
data.locationsarray of objectOne per location that holds a percent share of this playlist.
data.locations[].nodeIdstring
data.locations[].nodeNamestring
data.locations[].canFillbooleanSomebody at the location can fill the share now.
data.locations[].fillerCountinteger
data.locations[].candidatesarray of objectPeople at the location who cannot fill it yet.
data.locations[].candidates[].userIdstring
data.locations[].candidates[].namestring
data.locations[].candidates[].emailstring
data.locations[].roleIdstring | nullThe narrowest existing role that would let them fill it.
data.locations[].roleNamestring | null
data.locations[].mayGrantbooleanThe caller may give that role at that location.
data.requiredPermissionsarray of stringThe permissions filling a share needs. Absent when no location holds a share.

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