# Power policies

Base URL: `https://api.brixsignage.com`. Send `Authorization: Bearer $BRIX_API_KEY` unless an operation says Auth: none.

## GET /v1/power-policies

List power policies

List the power policies configured for your workspace. Each policy defines an open and close window for the screens using it.

**Notes.**
- Needs the permission at the workspace root: a location-scoped key is refused.

Auth: Bearer token. Permission: `screen.view`.

```bash
curl "https://api.brixsignage.com/v1/power-policies" \
  -H "Authorization: Bearer $BRIX_API_KEY"
```

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | array of PowerPolicy |  |
| `data[].id` | string | Power policy id. |
| `data[].spaceId` | string |  |
| `data[].name` | string |  |
| `data[].description` | string \| null |  |
| `data[].windows` | WeeklyWindows | Open window per weekday (`mon` … `sun`). A day that is absent is closed. |
| `data[].windows.mon` | OpenWindow |  |
| `data[].windows.mon.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data[].windows.mon.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data[].windows.mon.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data[].windows.mon.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data[].windows.mon.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data[].windows.tue` | OpenWindow |  |
| `data[].windows.tue.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data[].windows.tue.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data[].windows.tue.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data[].windows.tue.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data[].windows.tue.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data[].windows.wed` | OpenWindow |  |
| `data[].windows.wed.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data[].windows.wed.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data[].windows.wed.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data[].windows.wed.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data[].windows.wed.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data[].windows.thu` | OpenWindow |  |
| `data[].windows.thu.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data[].windows.thu.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data[].windows.thu.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data[].windows.thu.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data[].windows.thu.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data[].windows.fri` | OpenWindow |  |
| `data[].windows.fri.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data[].windows.fri.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data[].windows.fri.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data[].windows.fri.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data[].windows.fri.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data[].windows.sat` | OpenWindow |  |
| `data[].windows.sat.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data[].windows.sat.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data[].windows.sat.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data[].windows.sat.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data[].windows.sat.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data[].windows.sun` | OpenWindow |  |
| `data[].windows.sun.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data[].windows.sun.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data[].windows.sun.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data[].windows.sun.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data[].windows.sun.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data[].rebootHourLocal` | integer \| null | Hour (0–23, local time) the device restarts each day; null = no scheduled restart. |
| `data[].timezone` | string \| null | IANA time zone the windows use; null = each screen's own time zone. |
| `data[].createdAt` | string | ISO-8601 timestamp (UTC). |
| `data[].updatedAt` | string | ISO-8601 timestamp (UTC). |
| `data[].deletedAt` | string \| null | Always null on these reads. |
| `data[].screenCount` | integer | Screens that use this policy. |

```json
{
  "data": [
    {
      "id": "ppol_1a2b3c4d5e6f7a8b",
      "spaceId": "space_1a2b3c4d5e6f7a8b",
      "name": "Store hours",
      "description": "Open 8 to 22",
      "windows": {
        "mon": {
          "start": "08:00",
          "end": "22:00"
        },
        "tue": {
          "start": "08:00",
          "end": "22:00",
          "volume": 40
        }
      },
      "rebootHourLocal": 4,
      "timezone": "Europe/London",
      "createdAt": "2026-09-28T09:00:00.000Z",
      "updatedAt": "2026-09-28T09:00:00.000Z",
      "deletedAt": null,
      "screenCount": 12
    }
  ]
}
```

Response 401: Missing, expired or revoked bearer token.

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

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

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

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

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

## POST /v1/power-policies

Create a power policy

Create a named power policy that defines when screens using it should power on and off.

**Notes.**
- Needs the permission at the workspace root: a location-scoped key is refused.

Auth: Bearer token. Permission: `screen.edit`.

Request body (`application/json`):

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no | Default on create: `Untitled policy`. |
| `description` | string \| null | no |  |
| `windows` | object | no | Open window per weekday. `null` or an absent day is closed. A malformed day is dropped (closed), not refused. |
| `windows.mon` | OpenWindow \| null | no |  |
| `windows.tue` | OpenWindow \| null | no |  |
| `windows.wed` | OpenWindow \| null | no |  |
| `windows.thu` | OpenWindow \| null | no |  |
| `windows.fri` | OpenWindow \| null | no |  |
| `windows.sat` | OpenWindow \| null | no |  |
| `windows.sun` | OpenWindow \| null | no |  |
| `rebootHourLocal` | number \| null | no | 0–23; rounded and clamped. Null (or a value that is not a number) turns the restart off. |
| `timezone` | string \| null | no | IANA time zone (`Europe/London`). An unknown zone is refused with 422. |

```bash
curl -X POST "https://api.brixsignage.com/v1/power-policies" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"
```

Response 201: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | PowerPolicy |  |
| `data.id` | string | Power policy id. |
| `data.spaceId` | string |  |
| `data.name` | string |  |
| `data.description` | string \| null |  |
| `data.windows` | WeeklyWindows | Open window per weekday (`mon` … `sun`). A day that is absent is closed. |
| `data.windows.mon` | OpenWindow |  |
| `data.windows.mon.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.mon.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.mon.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.mon.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.mon.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.tue` | OpenWindow |  |
| `data.windows.tue.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.tue.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.tue.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.tue.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.tue.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.wed` | OpenWindow |  |
| `data.windows.wed.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.wed.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.wed.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.wed.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.wed.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.thu` | OpenWindow |  |
| `data.windows.thu.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.thu.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.thu.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.thu.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.thu.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.fri` | OpenWindow |  |
| `data.windows.fri.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.fri.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.fri.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.fri.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.fri.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.sat` | OpenWindow |  |
| `data.windows.sat.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.sat.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.sat.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.sat.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.sat.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.sun` | OpenWindow |  |
| `data.windows.sun.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.sun.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.sun.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.sun.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.sun.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.rebootHourLocal` | integer \| null | Hour (0–23, local time) the device restarts each day; null = no scheduled restart. |
| `data.timezone` | string \| null | IANA time zone the windows use; null = each screen's own time zone. |
| `data.createdAt` | string | ISO-8601 timestamp (UTC). |
| `data.updatedAt` | string | ISO-8601 timestamp (UTC). |
| `data.deletedAt` | string \| null | Always null on these reads. |
| `data.screenCount` | integer | Screens that use this policy. |

Response 401: Missing, expired or revoked bearer token.

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

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

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

Response 422: Unknown `timezone`.

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

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

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

## GET /v1/power-policies/{id}

Get a power policy

Get one power policy by its ID.

**Notes.**
- Needs the permission at the workspace root: a location-scoped key is refused.

Auth: Bearer token. Permission: `screen.view`.

Parameters:

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | Power policy id. |

```bash
curl "https://api.brixsignage.com/v1/power-policies/{id}" \
  -H "Authorization: Bearer $BRIX_API_KEY"
```

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | PowerPolicy |  |
| `data.id` | string | Power policy id. |
| `data.spaceId` | string |  |
| `data.name` | string |  |
| `data.description` | string \| null |  |
| `data.windows` | WeeklyWindows | Open window per weekday (`mon` … `sun`). A day that is absent is closed. |
| `data.windows.mon` | OpenWindow |  |
| `data.windows.mon.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.mon.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.mon.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.mon.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.mon.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.tue` | OpenWindow |  |
| `data.windows.tue.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.tue.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.tue.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.tue.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.tue.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.wed` | OpenWindow |  |
| `data.windows.wed.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.wed.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.wed.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.wed.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.wed.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.thu` | OpenWindow |  |
| `data.windows.thu.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.thu.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.thu.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.thu.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.thu.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.fri` | OpenWindow |  |
| `data.windows.fri.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.fri.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.fri.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.fri.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.fri.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.sat` | OpenWindow |  |
| `data.windows.sat.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.sat.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.sat.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.sat.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.sat.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.sun` | OpenWindow |  |
| `data.windows.sun.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.sun.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.sun.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.sun.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.sun.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.rebootHourLocal` | integer \| null | Hour (0–23, local time) the device restarts each day; null = no scheduled restart. |
| `data.timezone` | string \| null | IANA time zone the windows use; null = each screen's own time zone. |
| `data.createdAt` | string | ISO-8601 timestamp (UTC). |
| `data.updatedAt` | string | ISO-8601 timestamp (UTC). |
| `data.deletedAt` | string \| null | Always null on these reads. |
| `data.screenCount` | integer | Screens that use this policy. |

Response 401: Missing, expired or revoked bearer token.

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

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

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

Response 404: No such power policy in this workspace.

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

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

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

## PATCH /v1/power-policies/{id}

Update a power policy's open and close windows, reboot hour, time zone, or name.

**Notes.**
- `screenCount` in this response is always 0; read the policy to get the real count.
- An empty `name` keeps the current name.
- Needs the permission at the workspace root: a location-scoped key is refused.

Auth: Bearer token. Permission: `screen.edit`.

Parameters:

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | Power policy id. |

Request body (`application/json`):

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no | Default on create: `Untitled policy`. |
| `description` | string \| null | no |  |
| `windows` | object | no | Open window per weekday. `null` or an absent day is closed. A malformed day is dropped (closed), not refused. |
| `windows.mon` | OpenWindow \| null | no |  |
| `windows.tue` | OpenWindow \| null | no |  |
| `windows.wed` | OpenWindow \| null | no |  |
| `windows.thu` | OpenWindow \| null | no |  |
| `windows.fri` | OpenWindow \| null | no |  |
| `windows.sat` | OpenWindow \| null | no |  |
| `windows.sun` | OpenWindow \| null | no |  |
| `rebootHourLocal` | number \| null | no | 0–23; rounded and clamped. Null (or a value that is not a number) turns the restart off. |
| `timezone` | string \| null | no | IANA time zone (`Europe/London`). An unknown zone is refused with 422. |

```bash
curl -X PATCH "https://api.brixsignage.com/v1/power-policies/{id}" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"
```

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | PowerPolicy |  |
| `data.id` | string | Power policy id. |
| `data.spaceId` | string |  |
| `data.name` | string |  |
| `data.description` | string \| null |  |
| `data.windows` | WeeklyWindows | Open window per weekday (`mon` … `sun`). A day that is absent is closed. |
| `data.windows.mon` | OpenWindow |  |
| `data.windows.mon.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.mon.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.mon.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.mon.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.mon.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.tue` | OpenWindow |  |
| `data.windows.tue.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.tue.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.tue.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.tue.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.tue.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.wed` | OpenWindow |  |
| `data.windows.wed.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.wed.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.wed.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.wed.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.wed.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.thu` | OpenWindow |  |
| `data.windows.thu.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.thu.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.thu.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.thu.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.thu.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.fri` | OpenWindow |  |
| `data.windows.fri.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.fri.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.fri.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.fri.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.fri.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.sat` | OpenWindow |  |
| `data.windows.sat.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.sat.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.sat.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.sat.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.sat.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.windows.sun` | OpenWindow |  |
| `data.windows.sun.start` | string | Opening time, `HH:MM` 24-hour, local time. |
| `data.windows.sun.end` | string | Closing time, `HH:MM`. An `end` at or before `start` runs past midnight. |
| `data.windows.sun.volume` | integer \| null | Volume 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.sun.brightness` | integer \| null | Backlight 0–100 while open; absent or null keeps the screen's own. |
| `data.windows.sun.muted` | boolean \| null | Mute (true) or unmute (false) while open; absent or null keeps the screen's own. |
| `data.rebootHourLocal` | integer \| null | Hour (0–23, local time) the device restarts each day; null = no scheduled restart. |
| `data.timezone` | string \| null | IANA time zone the windows use; null = each screen's own time zone. |
| `data.createdAt` | string | ISO-8601 timestamp (UTC). |
| `data.updatedAt` | string | ISO-8601 timestamp (UTC). |
| `data.deletedAt` | string \| null | Always null on these reads. |
| `data.screenCount` | integer | Screens that use this policy. |

Response 401: Missing, expired or revoked bearer token.

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

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

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

Response 404: No such power policy in this workspace.

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

Response 422: Unknown `timezone`.

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

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

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

## POST /v1/power-policies/{id}/delete

Delete a power policy. Screens that use it go back to their own operating hours. A deleted policy cannot be restored.

**Notes.**
- A POST to `/delete`, not `DELETE`. Screens that use the policy keep the link and use their own operating hours until they get another policy. There is no restore route.
- Needs the permission at the workspace root: a location-scoped key is refused.

Auth: Bearer token. Permission: `screen.edit`.

Parameters:

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | Power policy id. |

```bash
curl -X POST "https://api.brixsignage.com/v1/power-policies/{id}/delete" \
  -H "Authorization: Bearer $BRIX_API_KEY"
```

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.id` | string |  |
| `data.deleted` | true |  |

Response 401: Missing, expired or revoked bearer token.

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

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

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

Response 404: No such power policy in this workspace.

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

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

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |
